banner
quick learn mysql

Mysql 速成指南

Scroll down

Mysql介绍

Mysql 实际上并不是一种数据库,而是一种关联式数据库管理系统,是数据库和使用数据的软件之间的中介,相当于一个数据库管理员
而与之对应的就有非关联式数据库,和非关联式数据库管理系统

什么叫关联式?
关联式的意思就是将数据整理成一张张表格,通过表格之间的关联来管理数据

SQL

这里的SQL就是 Structured Query Language,也就是结构化查询语言,说简单点就是 资料库管理系统 能听懂的语言

Mysql 主要使用语句

关于数据库

创建数据库

1
CREATE DATABASE `sql_begin`;

创建一个名为 sql_begin 的数据库

使用数据库

1
USE `sql_begin`

使用sql_begin,后续的所有操作都会在该数据库中进行操作

删除数据库

1
DROP DATABASE `sql_begin`

删除sql_begin数据库

展示数据库

1
SHOW DATABASES

展示你的所有的数据库

关于表格

创建表格

1
2
3
4
5
CREATE TABLE `student`(
`student_id` INT PRIMARY KEY,
`name` VARCHAR(20),
`major` VARCHAR(20)
)

这里的 PRIMARY KEY 代表主键,相当于一个唯一的id,不可重复,就像身份证号一样
也可以不直接写在一起,而是在后面进行补充

1
2
3
4
5
6
CREATE TABLE `student`(
`student_id` INT,
`name` VARCHAR(20),
`major` VARCHAR(20),
PRIMARY KEY(`student_id`)
)

约束

我们可以在各个属性后面加上约束,比如有些属性我们不允许为空,有些属性会随着插入而增加必须序号,我们可以这样写

1
2
3
4
5
6
CREATE TABLE `student`(
`student_id` INT AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`major` VARCHAR(20) UNIQUE DEFAULT '历史',
PRIMARY KEY(`student_id`)
)

在上面的属性设置中,我们就让 student_id 自增,让 name 禁止为空,让major唯一,且默认为历史,这里我们也可以看到可以给一个属性添加多个约束

删除表格

1
DROP TABLE `student`

删除 student 表格

表格属性操作

添加属性

1
ALTER TABLE `student` ADD `gpa` DECIMAL(3,2);

student表格进行操作,添加一个属性 gpa,类型为 DECIMAL(3,2)

删除属性

1
ALTER TABLE `student` DROP COLUMN `gpa`

student 表格操作,删除列 gpa

表格元素操作

添加元素

1
INSERT INTO `student` VALUES(3, '小绿', NULL, 2.2)

student表格中插入元素,注意这里元素的属性需要按照表格中定义的属性顺序进行填写,为空则用 NULL
当然我们也可以自定义顺序

1
INSERT INTO `student`(`name`, `major`) VALUES(`小红`, `语文`)

这里我们自定义中没有写入的属性会自动设置为NULL或者default出来的值,而如果你设置了AUTO_INCREAMENT,则会自动自增

修改元素

1
2
3
UPDATE `student`
SET `major` = '英语文学'
WHERE `major` = '英语';

我们指定更新表 studentmajor英语的元素,使其major设为英语文学
同样我们这里做出的更改和条件都可以是多个
比如

1
2
3
UPDATE `student`
SET `name` = '小灰', `major` = '物理'
WHERE `student_id` = 1;

这里我们将 student_id 为 1 的元素的namemajor都做了更改

1
2
3
UPDATE `student`
SET `major` = '生化'
WHERE `major` = '生物' OR `major` = '化学';

这里通过逻辑连接将major生物化学的元素的major更改为了生化

而如果我们不通过WHERE来进行条件约束的话,则会更改所有的元素

删除元素

1
DELETE FROM `student` WHERE `student_id` = 4;

这样删除了student_id为4 的元素
同样的在这里也可以通过逻辑词来连接多个条件,当然,如果不用WHERE来进行限定,也会删除所有的元素

获取元素

1
SELECT * FROM `student`

这句话表明获取所有的属性,注意这里 * 表示的是所有的属性
也可以改成你想要的属性:

1
SELECT `name`,`major` FROM `student`;

也可以将属性进行排序

1
SELECT * FROM `student` ORDER BY `score` DESC;

这里就将所有的属性按照score进行降序排序,DESC即descent
如果不写DESC就默认是ASC也就是ascend升序

也可以限制我们想要的元素数量

1
SELECT * FROM `student` ORDER BY `score` DESC LIMIT 3;

再加上一个LIMIT 就限制了返回的元素数量

同样的也是可以通过WHERE进行条件约束

1
SELECT * FROM `student` WHERE `major` = '英语';

这样就获取了所有major英语的元素
如果OR 的条件很多,可以用IN来代替

1
SELECT * FROM `student` WHERE `major` IN ('历史', '英语', '语文')

如果我们想知道所有元素的某个属性有哪几种,比如说有几种岗位,我们当然需要查询所有的元素,但是不要这些元素属性发生重复,我们可以使用DISTINCT

1
SELECT DISTINCT `sex` FROM `employee`

这样得到的sex属性就不会出现重复了

聚合函数 aggregate functions

COUNT

比如我们想要取得所有员工的数量

1
SELECT COUNT(*) FROM `employee`;

如果我们想要取得出生于 1970-01-01 之后的女性的数量,我们可以写

1
SELECT COUNT(*) FROM `employee` WHERE `birth_date` > '1970-01-01' AND `sex` = 'F';

AVG

我们想取得所有员工的平均薪水

1
SELECT AVG(`salary`) FROM `employee`

SUM

我们想取得所有员工薪水的总和

1
SELECT SUM(`salary`) FROM `employee`

MAX & MIN

我们想知道薪水最高的员工

1
2
SELECT MAX(`salary`) FROM 
`employee`

薪水最低的对应的就是

1
2
SELECT MIN(`salary`) FROM 
`employee`;

通配符

%表示多个字元,_表示单个字元

我们想取得号码尾数为 335 的客户

1
SELECT * FROM `client` WHERE `phone` LIKE '%335';

同样的如果是开头为 335 的话,将'%335'改为'335%'即可

想取得生日在 12 月的员工

1
SELECT * FROM `employee` WHERE `birth_day` LIKE '_____12%';

这样我们用五个_表示了前面类似1970-的五个字符,这样我们就筛选了所有12月份出生的员工

并集 Union

比如我们想同时返回员工和客户的名字

1
2
3
SELECT `name` FROM `employee`
UNION
SELECT `client_name` FROM `client`;

要注意的是,我们使用 UNION 时,获取的属性数目一定要是一样的,比如我们这里就不可以在employee中同时搜寻namesex,同时属性的数据类新也需要是一样的

如果我们想要 员工id + 员工名字 UNION 客户id + 客户名字

1
2
3
SELECT `emp_id`, `name FROM `employee` 
UNION
SELECT `client_id`, `client_name` FROM `client`;

这里返回的属性名称是emp_idname,那么我们可以做修改

1
2
3
SELECT `emp_id` AS `total_id`, `name` AS `total_name` FROM `employee` 
UNION
SELECT `client_id`, `client_name` FROM `client`;

这样我们就对属性名进行了修改

连接 JOIN

JOIN 可以帮助我们把两个表格连接在一起

如果我们想取得所有部门经理的名字

1
SELECT * FROM `employee` JOIN `branch` ON `emp_id` = `manager_id`

这样返回的表格就是employeebranch按照 emp_id = manager_id 进行拼接的表格

但是如果我们不需要完整的表格,我们只需要emp_id,name,branch_name这几个属性呢,我们就可以把*做修改

1
SELECT `emp_id`,`name`,`branch_name` FROM `employee` JOIN `branch` ON `emp_id` = `manager_id`

那如果两个表格做匹配的属性名是一样的,我们可以这样:

1
SELECT `employee`.`emp_id`,`employee`.`name`,`branch`.`branch_name` FROM `employee` JOIN `branch` ON `employee`.`emp_id` = `branch`.`manager_id`

而我们如果想要保留employee表格,同时返回条件成立的属性
我们可以写LEFT JOIN

1
SELECT `employee`.`emp_id`,`employee`.`name`,`branch`.`branch_name` FROM `employee` LEFT JOIN `branch` ON `employee`.`emp_id` = `branch`.`manager_id`

这样的话employee的所有元素不论条件是否成立都会被返回,而没有匹配成功的属性则填为NULL

反之如果想要保留branch表格就写RIGHT JOIN,根据位置写即可

1
2
3
4
5
6
SELECT * FROM `employee`;
SELECT * FROM `client`;
SELECT * FROM `employee` ORDER BY `salary` ASC;
SELECT `name` FROM `employee` ORDER BY `salary` DESC LIMIT 3;
SELECT `name` FROM `employee`;
SELECT DISTINCT `sex` from `employee`

子查询 subquery

我们可以在一个查询语句里面使用另外一个查询语句的结果

如果我们要找出研发部门的经理名字
我们可以先在branch中找到研发部门的 manager_id再到employee中找到manager_id对应的emp_id

1
2
3
SELECT `name` FROM `employee` WHERE `emp_id` = (
SELECT `manager_id` FROM `branch` WHERE `branch_name` = `研发`
);
1
2
3
SELECT `name` FROM `employee` WHERE `emp_id` IN (
SELECT `emp_id` FROM `work_with` WHERE `total_sales` > 50000
);

ON DELETE

ON DELETE 也是一种对表格属性的附加,主要用于 FOREIGN KEY 中,简单来说,ON DELETE 就是用于外键对应的属性被删除时(此时外键失去了对应的属性,无法进行对应),该外键应该如何操作

ON DELETE NULL

1
2
3
4
5
6
CREATE TABLE `branch`(
`branch_id` INI PRIMARY KEY,
`branch_name` VARCHAR(20),
`manager_id` INT,
FOREIGN KEY(`manager_id`) REFERENCES `employee`(`emp_id`) ON DELETE SET NULL
);

这里我们的外键 manager_id 对应到表格employeeemp_id上,而ON DELETE SET NULL表示,如果对应到的这个 emp_id被删除了,我们这个manager_id就设置为NULL

ON DELETE CASCADE

1
2
3
4
5
6
7
8
CREATE TABLE `works_with` (
`emp_id` INT,
`client_id` INT,
`total_sales` INT,
PRIMARY KEY(`emp_id`, `client_id`),
FOREIGN KEY (`emp_id`) REFERENCES `employee`(`emp_id`) ON DELETE CASCADE,
FOREIGN KEY (`client_id`) REFERENCES `client`(`client_id`) ON DELETE CASCADE
);

这里的 ON DELETE CASCADE 就表示如果works_with表格中的emp_idclient_id在失去对应的表格中的属性时,也进行删除

总结

当然这些只是非常基础的 sql 操作,一般项目中肯定不是直接手敲,而是通过各种自动化操作来完成非常频繁的数据操作,任重而道远

其他文章
cover
Task of 25fall
  • 25/09/26
  • 07:55
  • 杂谈
30+
Posts
8+
Diary
85+
fans
目录导航 置顶
  1. 1. Mysql介绍
  2. 2. SQL
  3. 3. Mysql 主要使用语句
    1. 3.1. 关于数据库
    2. 3.2. 关于表格
    3. 3.3. 表格属性操作
    4. 3.4. 表格元素操作
  4. 4. 聚合函数 aggregate functions
    1. 4.1. COUNT
    2. 4.2. AVG
    3. 4.3. SUM
    4. 4.4. MAX & MIN
  5. 5. 通配符
  6. 6. 并集 Union
  7. 7. 连接 JOIN
  8. 8. 子查询 subquery
  9. 9. ON DELETE
    1. 9.1. ON DELETE NULL
    2. 9.2. ON DELETE CASCADE
  10. 10. 总结