• 售前

  • 售后

热门帖子
入门百科

MySQL 入门教学,真的已经很简洁了

[复制链接]
是鹅好甜 显示全部楼层 发表于 2022-1-12 21:43:28 |阅读模式 打印 上一主题 下一主题
MySQL


阅读本文前必看:本文是 MySQL 入门教学,从简介 -> 建立数据库 -> 理解数据类型和字段约束 -> 建立数据表 -> DML(增删改,查单独在我的另一篇博客),主要针对从未接触过 MySQL 的小白,相信读完后一定能快速上手 MySQL,至于其他的内容,我会单独拉出来写,毕竟知识点涉及较多!

1、简介


1.1、基本概念

数据库(DB,DataBase):用来放数据的仓库,具有很大的存储空间,起到管理数据的作用

数据库分类


  • 关系型数据库(SQL):存储的格式可以直观地反映实体间的关系,和常见的表格比较相似
    举例:MySQL、Oracle、sql Server、DB2
  • 非关系型数据库(NoSQL):指的是分布式的、非关系型的、不保证遵循 ACID 原则的数据存储系统
    举例:Redis、MongDB、Memcache

数据库管理系统(DBMS,Database Management System):一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性,我们所学的 MySQL 就是关系型数据库管理系统

1.2、MySQL 介绍

MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。(简单看看就好了)
官网:https://www.mysql.com

1.3、语言组成



  • DQL:数据库查询语言。关键字:SELECT … FROM … WHERE
  • DDL:数据库模式定义语言。关键字:CREATE,DROP,ALTER
  • DML:数据操纵语言。关键字:INSERT、UPDATE、DELETE
  • DCL:数据控制语言 。关键字:GRANT、REVOKE
  • TCL:事务控制语言。关键字:COMMIT、ROLLBACK、SAVEPOINT
  • CCL:指针控制语言。关键字:FETCH、DECLARE CURSOR
这六种语言共同组成了数据库的完整语言
需要注意:在 MySQL 中不区分大小写,但是,我们推荐使用 DQL 的时候采用大写,这是一种不成文的规范。同时书写过程的语句可以分行书写,增加代码的可读性

1.4、如何使用

步骤非常简单:
1、下载 MySQL(推荐 5.7,比较稳定,当然下载最新的 8.0 也是没问题的)
2、配置 MySQL(CSDN 或者知乎上教程一大堆)
3、下载 Navicat(可视化界面)
4、Naviact 连接 MySQL
5、开始愉快的使用 MySQL

Navicat 连接完毕界面如下:





2、基本操作

三个层次:


  • 数据库(创建、删除)
  • 数据表(掌握数据类型和数据字段属性)
  • 数据项(增删改查)

2.1、操作数据库

2.1.1、创建数据库

   使用 sql 语句创建
  1. CREATE DATABASE [IF NOT EXISTS] Name;
  2. /* [IF NOT EXISTS] 代表即使存在数据库,也不会报错,只会进行警告
  3. 成功:Query OK, 1 row affected (0.09 sec)
  4. 失败:1007 - Can't create database 'Name'; database exists*/
复制代码

   通过命令提示符创建
  1. > mysqladmin -u root -p create Name
  2. > Enter password:******
复制代码

2.1.2、删除数据库

   使用 sql 语句删除
  1. DROP DATABASE [IF EXISTS] Name;
  2. /* [ID EXISTS] 代表存在则删除,不存在不报错,只会警告
  3. 成功:Query OK, 1 row affected (0.18 sec)
  4. 失败:1008 - Can't drop database 'Name'; database doesn't exist */
复制代码

   通过命令提示符删除
  1. > mysqladmin -u root -p drop Name
  2. > Enter password:******
复制代码

2.1.3、使用数据库

   使用 sql 语句
  1. USE databaseName;
  2. -- 当你的数据库名称是关键字的时候,可以使用 ``,例如 use `create`,此时create是数据库名
复制代码

2.1.4、查看数据库

   使用 sql 语句
  1. SHOW DATABASES; -- 可以查看所有的数据库
复制代码
例如(使用 Navicat):



2.2、数据类型

在数据表中,每一个字段都是有类型的,就和 Java 一样,我们需要合理使用数据类型,下面介绍了几种常见的字段类型

2.2.1、数值类型

类型名称大小(Bytes)范围(有符号)范围(无符号)TINYINT小整数值1(-27 ,27-1)(0,28-1)SMALLINT大整数值2(-215 ,215-1)(0,216-1)MEDIUMINT大整数值3(-223 ,223-1)(0,224-1)INT / INTEGER大整数值4(-231 ,231-1)(0,232-1)BIGINT极大整数值8(-263 ,263-1)(0,232-1)FLOAT单精度值4不用了解不用了解DOUBLE双精度值8不用了解不用了解DECIMAL小数值(字符串形式)—依赖 M 和 D 的值依赖 M 和 D 的值
2.2.2、日期和时间类型

类型名称大小(Bytes)格式DATE日期值3YYYY-MM-DDTIME时间值/持续时间3HH:MM:SSYEAR年份值1YYYYDATETIME混合日期/时间值8YYYY-MM-DD HH:MM:SSTIMESTAMP混合日期/时间值/时间戳4YYYYMMDDHHMMSS
2.2.3、字符串类型

类型名称大小(Bytes)CHAR定长字符串(0,255)VARCHAR变长字符串(0,65 535)TINYBLOB不超过 255 个字符的二进制字符串(0,255)TINYTEXT短文本字符串(0,255)BLOB二进制形式的长文本数据(0,65 535)TEXT长文本数据(0,65 535)MEDIUMBOLO二进制形式的中等长度文本数据(0,16 777 215)MEDIUMTEXT中等长度文本数(0,16 777 215)LONGBOLB二进制形式的极大文本数据(0,4 294 967 295)LONGTEXT极大文本数据(0,4 294 967 295)几点注意事项


  • 一个汉字占多少长度与编码有关

    • UTF-8:一个汉字=3个字节
    • GBK:一个汉字=2个字节

  • utf8mb4 每个字符占 4 个 Byte,所以 VARCHAR 最长为 65535/4 = 16383.75
  • 一张表中多个字段都为 VARCHAR,那么所有 VARCHAR 字段总和不能超过16383
  • 存储 CHAR 类型数据的时候,若长度不足则用空格填充到相应长度。查询时,返回的数据尾部是没有空格的

2.3、字段属性

属性字段用于规范数据样式或对数据进行说明,我们也可以理解为一种初步的约束,常用的属性字段有:


  • 自动递增(AUTO_INCREMENT):可以设置每次递增的数值
  • 无符号(UNSIGNED):针对数值型,是否可以为负数
  • 填充零:一般数值型使用,位数不足自动补零,例如 4 位的 INT 型数据,1 会变成 0001
  • 是否为空(NOT NULL):数据是否可以为 null
  • 主键(PRIMARY KEY):不能重复,区分每一条记录
  • 注释:对数据进行说明

Navicat 可视化操作字段属性:






2.4、操作数据表

上边我们创建完了数据库,了解了字段类型和约束,下面就该操作数据表了!

2.4.1、创建数据表

   使用 sql 语句创建
  1. CREATE TABLE [IF NOT EXISTS] `tableName`(
  2.         `field_1` VARCHAR(10) [NOT NULL] COMMENT 'comment_1',
  3.     `field_2` INT(2) [AUTO_INCREMENT] COMMENT 'comment_2',
  4.     `field_3` BIGINT(20) [UNSIGNED] COMMENT 'comment_3',
  5.     `field_4` CHAR(20) [DEFAULT 'Hello'] COMMENT 'comment_4',
  6.     `field_5` DATE,
  7.     PRIMARY KEY(`field_2`)
  8. )[ENGINE=InnoDB] [DEFAULT CHARSET=utf8]
  9. -- 注:使用 [] 都是可选项
  10. -- NOT NULL                        非空
  11. -- AUTO_INCREMENT        自增
  12. -- UNSIGNED                        无符号数
  13. -- DEFAULT                        默认值
  14. -- COMMENT                        注释
  15. -- PRIMARY KEY                主键
  16. -- ENGINE                        存储引擎
  17. -- DEFAULT CHARSET        字符集
复制代码

注意事项


  • 字段用 () 括起来,结尾不用使用 ;
  • 字段名称推荐使用 ``
  • 尽量每个字段都写上注释
  • 推荐将 PRIMARY KEY 放到最后,便于代码的可读
  • 全表只能有一个 AUTO_INCREMENT 修饰的字段,且使用 AUTO_INCREMENT 修饰的字段必须是主键

   通过命令提示符创建(登录省略)
  1. mysql> use databaseName
  2. Database changed
  3. mysql> CREATE TABLE
  4.         -> `field_1` VARCHAR(10) [NOT NULL] COMMENT 'comment_1',
  5.         -> `field_2` INT(2) [AUTO_INCREMENT] COMMENT 'comment_2',
  6.         -> `field_3` BIGINT(20) [UNSIGNED] COMMENT 'comment_3',
  7.         -> `field_4` CHAR(20) [DEFAULT 'Hello'] COMMENT 'comment_4',
  8.         -> `field_5` DATE,
  9.         -> PRIMARY KEY(`field_2`)
  10.         -> )[ENGINE=InnoDB] [DEFAULT CHARSET=utf8];
  11. Query OK, 0 rows affected (0.16 sec)
  12. mysql>
复制代码
注意:使用命令提示符的时候,结尾必须使用 ;

2.4.2、删除数据表

   使用 sql 语句删除
  1. DROP TABLE [IF EXISTS] tableName;        -- 相当好记,不要乱用
复制代码

   使用命令提示符删除(登录省略)
  1. mysql> use databaseName;
  2. Database changed
  3. mysql> DROP TABLE [IF EXISTS] tableName;
  4. Query OK, 0 rows affected (0.8 sec)
  5. mysql>
复制代码
有心的读者可以发现,我们在创建和删除数据表(数据库)的时候,都会选择加上判断,这样可以减少报错

2.4.3、修改数据表

修改数据表有许多种情况,例如修改表名、修改字段属性、删除字段等
   使用 sql 语句修改
  1. ALTER TABLE `tableName` RENAME `newTableName`;                 -- 修改表名
  2. ALTER TABLE `tableName` ADD `field` int(10);                -- 添加字段
  3. ALTER TABLE `tableName` DROP `field_1`;                                -- 删除字段
  4. ALTER TABLE `tableName` MODIFY `field_2` char(20);         -- 修改字段的约束
  5. ALTER TABLE `tableName` CHANGE `field_3` `field_4`;        -- 修改字段名
复制代码
注:ALTER 语句一般用于修改表结构

   使用命令提示符修改(和上边基本一样)
  1. mysql> use databaseName;
  2. Database changed
  3. mysql> ALTER TABLE `tableName` RENAME `newTableName`;
  4. Query OK, 0 rows affected (0.8 sec)
  5. mysql> ALTER TABLE `tableName` ADD `field` int(10);
  6. Query OK, 0 rows affected (0.6 sec)
  7. mysql> ALTER TABLE `tableName` DROP `field_1`;
  8. Query OK, 0 rows affected (0.8 sec)
  9. mysql> ALTER TABLE `tableName` MODIFY `field_2` char(20);
  10. Query OK, 0 rows affected (0.6 sec)
  11. mysql> ALTER TABLE `tableName` CHANGE `field_3` `field_4`;
  12. Query OK, 0 rows affected (0.6 sec)
  13. mysql>
复制代码



3、数据管理


3.1、外键

先来举个例子:
假如有一张学生表和选课表;
选课表存放所有选课的信息,字段有选课号(course_id)、选课名(course_name),主键为课程 id(course_id);
学生表存放每一个学生的信息,字段有 学号(student_id)、姓名(name)、年龄(age)、选课号(student_course_id),主键为学号(student_id);
现在学生进行选课,一个学生至多只能选择一门课程,要求课程必须在选课表中存在。
那么我们可以将选课表的 course_id 字段作为学生表中 student_course_id 字段的外键,这样学生只能选择选课表中存在的选课。

   sql 语句实现上述要求
  1. -- 创建学生表 student
  2. CREATE TABLE student(
  3.         `student_id` int(20) NOT NULL COMMENT '学生id',
  4.         `name` VARCHAR(10) NOT NULL COMMENT '学生姓名',
  5.         `age` INT(5) NOT NULL COMMENT '学生年龄',
  6.         `student_course_id` int(20) NOT NULL COMMENT '学生选课id',
  7.         PRIMARY KEY(`student_id`)
  8. )ENGINE=INNODB CHARSET=utf8
复制代码
  1. -- 创建选课表 course
  2. CREATE TABLE course(
  3.         `course_id` int(20) NOT NULL COMMENT '选课id',
  4.         `course_name` VARCHAR(20) NOT NULL COMMENT '课程名称',
  5.         PRIMARY KEY(`course_id`)
  6. )ENGINE=INNODB CHARSET=utf8
复制代码
  1. -- 设置外键(推荐在建表完毕后,使用 ALTER 进行修改)
  2. ALTER TABLE `student` ADD CONSTRAINT `FK_course_id` FOREIGN KEY(`student_course_id`) REFERENCES `course`(`course_id`);
复制代码
最终效果 student 表:



course 表:



从上述例子中,我们可以很好的理解什么是外键,以及外键该如何去定义。在实际使用中,我们不推荐在数据库内使用外键约束,因为数据库本职工作是用来存储数据,我们不希望它有过多的约束,这样容易造成错误,在之后,我们会使用程序进行外键约束,所以外键的介绍先到此
注意:我们会给每一个外键取一个名字,一般取名规则就是 FK_ + 外键名,这是一种规范

3.2、DML

DML(Data Manipulation Language)就是数据操纵语言,是用于数据库的操作,其中三种核心指令:


  • INSERT:插入(增)
  • UPDATE:更新(改)
  • DELETE:删除(删)

3.2.1、INSERT

   基本格式
  1. INSERT INTO `tableName`(`field_1`, `field_2`,······,`field_n`)
  2. VALUE(value_1, value_2,······,value_n)
复制代码
我们还是以上边两个表为基础,插入学生和选课的基本信息
  1. -- 插入选课信息
  2. INSERT INTO `course`(`course_id`, `course_name`)
  3. VALUE(1, 'Java');
  4. INSERT INTO `course`(`course_id`, `course_name`)
  5. VALUE(2, 'Python');
  6. INSERT INTO `course`(`course_id`, `course_name`)
  7. VALUE(3, 'JavaScript');
  8. INSERT INTO `course`(`course_id`, `course_name`)
  9. VALUE(4, 'CSS');
复制代码
  1. -- 插入学生信息,注意顺序,因为定义了外键,而且学生选课的字段不能为空,所以没有选课信息,学生将无法选课(实际情况应该设置学生选课字段可以为空,这里是为了方便演示)
  2. -- 通常我们习惯分两行写,便于阅读
  3. INSERT INTO `student`(`student_id`, `name`, `age`, `student_course_id`)
  4. VALUE(1, 'Mike', 20, '1');
  5. INSERT INTO `student`(`student_id`, `name`, `age`, `student_course_id`)
  6. VALUE(2, 'John', 21, '3');
  7. -- 可以一次性插入多条记录,中间用 , 隔开
  8. INSERT INTO `student`(`student_id`, `name`, `age`, `student_course_id`)
  9. VALUE(3, 'Lucy', 21, '2'), (4, 'Lily', 22, '4');
复制代码
效果 course & student 表:




上述案例在插入记录的时候,所有的值和表中的字段都匹配,但有时候我们允许某些字段为 null,这时如果在插入过程中,我们没有给该记录的字段赋值,这条记录的这个字段的值就为 null,听上去有点绕口,让我们举个例子:

现在我们新建一个 teacher 表,字段有工号(teacher_id)、姓名(name)、年龄(age)、手机号(phoneNumber)、电子邮箱(E-mail),其中主键为 teacher_id,而且允许手机号和段子邮箱为空
  1. -- 创建 teacher 表
  2. CREATE TABLE teacher(
  3.         `teacher_id` int(20) NOT NULL COMMENT '工号',
  4.         `name` VARCHAR(10) NOT NULL COMMENT '姓名',
  5.         `age` int(20) NOT NULL COMMENT '年龄',
  6.         `phoneNumber` BIGINT(12) COMMENT '手机号',
  7.         `E-mail` VARCHAR(20) COMMENT '电子邮箱',
  8.         PRIMARY KEY(`teacher_id`)
  9. )ENGINE=INNODB DEFAULT CHARSET=utf8
复制代码
  1. -- 添加老师信息
  2. INSERT INTO `teacher` -- 注意这里并没有写出字段名称,会直接按照顺序进行匹配
  3. VALUE(1, '张三', 40, 12345678910, 'zhangsan@163.com'), (5, '丁七', 40, 13546975941, 'dingqi@163.com');
  4. INSERT INTO `teacher`(`teacher_id`, `name`, `age`,`phoneNumber`)
  5. VALUE(2, '李四', 40, 1386468517);
  6. INSERT INTO `teacher`(`teacher_id`, `name`, `age`,`E-mail`)
  7. VALUE(3, '王五', 40, 'wangwu@163.com');
  8. INSERT INTO `teacher`(`teacher_id`, `name`, `age`)
  9. VALUE(4, '赵六', 40);
复制代码
teacher 表:


3.2.2、UPDATE

   基本格式
  1. UPDATE `tableName` SET `field_1` = new_value_1, `field_2` = new_value_2
  2. [WHERE Clause];                -- WHERE 子句在之后会将,现在只要看得懂就行
复制代码

现在我们要修改 teacher 表中的老师信息:将 name = ‘李四’ 的 age 修改成 45,将 name = ‘王五’ 的 age 修改成 48:
  1. -- 更新信息
  2. UPDATE `teacher` SET `age`=45
  3. WHERE `name`='李四';
  4. UPDATE `teacher` SET `age`=48
  5. WHERE `name`='王五';
复制代码
修改结果:


3.2.3、DELETE

   DELETE基本格式
  1. DELETE FROM `tableName`                -- 不写 WHRER 子句,就代表删除全表内容,危
  2. [WHERE Clause];
复制代码

现在我们要把学生 Mike 从 student 表中删除,因为他毕业了:
  1. DELETE FROM `student`
  2. WHERE `name` = 'Mike';
复制代码
删除后结果:


那么假如我们要从 course 表中删除 course_id = 2 的课程呢?
  1. DELETE FROM `course`
  2. WHERE `coouse_id`='2';
  3. -- 报错:1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'x 1DELETE FROM `course`2WHERE `coouse_id`='2'' at line 1
  4. -- 因为 course_id = 2 的课程还在被学生使用(作为外键),而创建外键的时候选择的删除方式是 RESTRICT,即不进行级联删除,所以只有当所有选择 课程2 的学生全部毕业了,课程2 才能被删除
复制代码

   TRUNCATE 基本格式
  1. TRUNCATE FROM `tableName`
  2. [WHERE Clause];
  3. -- 可以发现和 DELETE 语句的格式相同
复制代码

TRUNCATE 和 DELETE 语句区别:


  • 在全表删除的时候, TRUNCATE 会将自增重置为 0,而 DELETE 保持不变
  • 删除速度 TRUNCATE > DELETE
  • TRUNCATE 是 DDL(Data Definition Language ) 数据定义语言,而 DELETE 是 DML(Data Manipulation Language) 数据操纵语言
辛苦看到这里的你,相信一定对 MySQL 有了初步的了解,那么,请开始你的 MySQL 之旅吧,别忘了喜欢的话给个赞

来源:https://blog.caogenba.net/qq_52174675/article/details/122410982
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作