Skip to content

基本语法

一、创建数据库 DATABASE

习惯上,SQL 指令使用大写,而数据库名称使用小写,且自定义名称最好用反引号括起来,以免和关键字重名。以下 TABLE 同理。

sql
# 查看当前数据库
SHOW DATABASES;
# 创建数据库 CREATE
CREATE DATABASE `database-name`;

# 删除数据库 DROP
DROP DATABASE `database-name`;

二、创建数据表 TABLE

sql
 # 选择数据库
 USE `database-name`

 # 显示当前数据库下所有数据表
 SHOW TABLES;

 # 创建一个 student 表格
 CREATE TABLE `student`(
	 `student_id` INT PRIMARY KEY,
	 `name` VARCHAR(20),
	 `major` VARCHAR(20)
 );
+------------------------+
| Tables_in_sql_tutorial |
+------------------------+
| student                |
+------------------------+
 ## 也可以单独设置 PRIMARY KEY
  CREATE TABLE `student`(
	 `student_id` INT,
	 `name` VARCHAR(20),
	 `major` VARCHAR(20),
	 PRIMARY KEY(`student_id`)
 );

 # 概览数据表 DESCRIBE
 DESCRIBE `student`;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| student_id | int         | NO   | PRI | NULL    |       |
| name       | varchar(20) | YES  |     | NULL    |       |
| major      | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

 # 删除数据表
 DROP `student`;

 # 新增属性 ALTER / ADD
 ALTER TABLE `student` ADD `gpa` DECIMAL(3,2);
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| student_id | int          | NO   | PRI | NULL    |       |
| name       | varchar(20)  | YES  |     | NULL    |       |
| major      | varchar(20)  | YES  |     | NULL    |       |
| gpa        | decimal(3,2) | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

# 删除属性 ALTER / DROP
ALTER TABLE `student` DROP COLUMN gpa;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| student_id | int         | NO   | PRI | NULL    |       |
| name       | varchar(20) | YES  |     | NULL    |       |
| major      | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

存储数据 INSERT

VALUES(a, b, c…) 括号中逗号隔开的数据,顺序要和定义数据表时的顺序相同。

sql
# 查询数据 SELECT FROM
SELECT * FROM `student`;
# 插入数据
INSERT INTO `student` VALUES(1, '小白', '历史');
+------------+--------+--------+
| student_id | name   | major  |
+------------+--------+--------+
|          1 | 小白   | 历史   |
+------------+--------+--------+

# 插入空数据 INSERT INTO
INSERT INTO `student` VALUES(3,'小绿',NULL);
+------------+--------+--------+
| student_id | name   | major  |
+------------+--------+--------+
|          1 | 小白   | 历史   |
|          2 | 小黑   | 生物   |
|          3 | 小绿   | NULL   |
+------------+--------+--------+

# 自定义插入数据的顺序
INSERT INTO `student`(`name`, `major`, `student_id`) VALUES('小兰','英语', 4);
+------------+--------+--------+
| student_id | name   | major  |
+------------+--------+--------+
|          1 | 小白   | 历史   |
|          2 | 小黑   | 生物   |
|          3 | 小绿   | NULL   |
|          4 | 小兰   | 英语   |
+------------+--------+--------+
## 也可以不插入某个属性,不填就是 NULL
INSERT INTO `student`(`major`, `student_id`) VALUES('英语', 5);
+------------+--------+--------+
| student_id | name   | major  |
+------------+--------+--------+
|          1 | 小白   | 历史   |
|          2 | 小黑   | 生物   |
|          3 | 小绿   | NULL   |
|          4 | 小兰   | 英语   |
|          5 | NULL   | 英语   |
+------------+--------+--------+

限制 约束 CONSTRAINT

sql
CREATE TABLE `student`(
	 `student_id` INT AUTO_INCREMENT,
	 `name` VARCHAR(20) NOT NULL, # 非空
	 `major` VARCHAR(20) UNIQUE, # 不可重复
	 PRIMARY KEY(`student_id`)
);

 NOT NULL # 非空
 UNIQUE # 不可重复
 DEFAULT 'value' # 默认值,没提供具体值会使用默认值
 AUTO_INCREMENT # 自增,一般用于 Primry Key ,不需要每次都给数据指定 Primary Key

修改、删除数据 UPDATE && DELETE

sql
# 关闭 sql 默认更新
SET SQL_SAFE_UPDATES = 0;

CREATE TABLE `student`(
	 `student_id` INT AUTO_INCREMENT,
	 `name` VARCHAR(20),
	 `major` VARCHAR(20),
	 `score` INT,
	 PRIMARY KEY(`student_id`)
);
+------------+------+---------+-------+
| student_id | name | major   | score |
+------------+------+---------+-------+
|          1 | ming | English |    20 |
|          2 | hei  | English |    40 |
|          3 | bai  | Math    |    50 |
+------------+------+---------+-------+

# 更新 major
UPDATE student
SET major = 'Chinese'
WHERE major = 'English';
+------------+------+---------+-------+
| student_id | name | major   | score |
+------------+------+---------+-------+
|          1 | ming | Chinese |    20 |
|          2 | hei  | Chinese |    40 |
|          3 | bai  | Math    |    50 |
+------------+------+---------+-------+

UPDATE student
SET major = 'English'
WHERE student_id = 3;
+------------+------+---------+-------+
| student_id | name | major   | score |
+------------+------+---------+-------+
|          1 | ming | Chinese |    20 |
|          2 | hei  | Chinese |    40 |
|          3 | bai  | English |    50 |
+------------+------+---------+-------+

# 多条件:OR
UPDATE student
SET major = 'Computer'
WHERE major = 'Chinese' OR major = 'English';
+------------+------+----------+-------+
| student_id | name | major    | score |
+------------+------+----------+-------+
|          1 | ming | Computer |    20 |
|          2 | hei  | Computer |    40 |
|          3 | bai  | Computer |    50 |
+------------+------+----------+-------+

# 修改多数据:SET 用 , 隔开
UPDATE student
SET name = 'heihei', major = 'Philosophy'
WHERE student_id = 1;
+------------+--------+------------+-------+
| student_id | name   | major      | score |
+------------+--------+------------+-------+
|          1 | heihei | Philosophy |    20 |
|          2 | hei    | Computer   |    40 |
|          3 | bai    | Computer   |    50 |
+------------+--------+------------+-------+

# 不加 WHERE 更新全部
UPDATE student
SET major = 'Philosophy';
sql
# 条件删除
DELETE FROM student
WHERE student_id = 2;
+------------+--------+------------+-------+
| student_id | name   | major      | score |
+------------+--------+------------+-------+
|          1 | heihei | Philosophy |    20 |
|          3 | bai    | Computer   |    50 |
+------------+--------+------------+-------+

# 多条件删除
DELETE FROM student
WHERE name = 'bai' AND major = 'Computer';
+------------+--------+------------+-------+
| student_id | name   | major      | score |
+------------+--------+------------+-------+
|          1 | heihei | Philosophy |    20 |
+------------+--------+------------+-------+

# 运算符删除
DELETE FROM student
WHERE score < 60;
Empty set (0.00 sec)

获取数据 SELECT

比较运算符:

大于: >

小于:<

不等于:<>

大于等于:>=

逻辑运算符:

且:AND

或:OR

sql
# 获取所有属性
SELECT * FROM student;

# 获取指定属性的数据
SELECT name FROM student;
SELECT name, major FROM student;

# 最后呈现的数据不重复
SELECT DISTINCT sex FROM `employee`

# 依据指定属性排序
SELECT *
FROM student
ORDER BY score; ## 按照 score 从小到大排序

ORDER BY score DESC; ## 按照 score 从大到小排序,默认是 ASC 即由小到大

ORDER BY score, student_id; # 首先根据 score 排序,当 score 相等时再根据 student_id 进行排序

# 限制获取数据的数量
SELECT *
FROM student
LIMIT 3; ## 只获取前三笔数据

SELECT *
FROM student
ORDER BY score
LIMIT 2; ## 与 ORDER BY 混用

# 使用 where 进行筛选
SELECT *
FROM student
WHERE major = 'English' AND student_id = 1;

# IN 关键字
WHERE major IN('English','Chinese','Math'); # 等价于下面的写法
WHERE major = 'English' OR major = 'Chinese' OR major = 'Math';

聚合函数 aggregate function

sql
# 获取员工人数
SELECT COUNT(*) FROM `employee`;

# 获取具有 sup_id 一共有多少笔资料
SELECT COUNT(`sup_id`) FROM `employee`;

select count(*) from employee where birth_date > '1970-01-01' and sex = 'F';

# 取平均数
select avg(salary) from employee;

# 总和
select sum(salary) from employee;

# 最大值
select max(salary) from employee;

select min(salary) from employee;

wildcards 万用字符 %(多个字符) _(一个字符)

sql
# 取得电话尾号为 335 的客户
select * from client where phone like '%335';

# 取得姓艾的客户
select * from client where name like '艾%';

# 取得生日在 12 月的员工
select * from employee where birth_date like '_____12%';

联合 union

属性数必须相同 且 属性的类型也必须相同

sql
# 员工名字 union 客户名字
select name from employee
union
select client_name from client;

连接 join

sql
# 获取所有公司经理的名字
select * from employee join branch on emp_id = manager_id;

select emp_id, name, branch_name from employee join branch on emp_id = manager_id;

# 如果有两张表属性重名的情况,可以在属性前面加上具体是哪个表的属性
select * from employee join branch on employee.emp_id = branch.manager_id;

# 左边表格无论是否成立都返回,右边的表格只有满足条件才会返回
select * from employee left join branch on emp_id = manager_id;

# 右边表格无论是否成立都返回,左边的表格只有满足条件才会返回,
select * from employee right join branch on emp_id = manager_id;

子查询 subquery

sql
# 找出研发部门的经理名字
select name
from employee
where emp_id = (
	select manager_id
	from branch
	where branch_name = '研发'
);

ON DELET SET NULL

当对应不到的时候直接把外键设置为 NULL

ON DELET SET CASECADE

当对应不到直接删除那一笔数据