https://www.w3school.com.cn/sql/sql_syntax.asp
SQL 的 DML(数据操作语言) 部分:
处理 表内数据
- SELECT - 从数据库表中获取数据
- UPDATE - 更新数据库表中的数据
- DELETE - 从数据库表中删除数据
-
SQL 中最重要的 DDL(数据定义语言) 语句:
设计 库和表
CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
数据库与表的增删改
查看数据库
```shell show databases; # 查看所有数据库
查看当前使用的数据库
select database(); # 下图 show tables; # in_databaseName status; # current database: Name
**select database();**<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/269022/1612277223281-0ef15f44-9890-4a59-b570-b4bb5df689cc.png#align=left&display=inline&height=126&margin=%5Bobject%20Object%5D&name=image.png&originHeight=346&originWidth=662&size=37772&status=done&style=none&width=241)![image.png](https://cdn.nlark.com/yuque/0/2021/png/269022/1612277321392-b8c5720e-d715-4796-bd14-042dcfb98f53.png#align=left&display=inline&height=188&margin=%5Bobject%20Object%5D&name=image.png&originHeight=552&originWidth=1472&size=91897&status=done&style=none&width=500)<br />**show tables;**<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/269022/1612277576479-defe6f7c-32d6-4f8c-97e4-f41e67202c16.png#align=left&display=inline&height=184&margin=%5Bobject%20Object%5D&name=image.png&originHeight=368&originWidth=614&size=34684&status=done&style=none&width=307)<br />**status;**<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/269022/1612277632018-7d573d48-3521-49e9-87b1-2558543e5152.png#align=left&display=inline&height=602&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1204&originWidth=1778&size=216055&status=done&style=none&width=889)
<a name="dUa3p"></a>
## 数据库创建
```shell
create database 数据库名 charset = utf8;
数据库切换
use 数据库名;
删除数据库
drop database 数据库名;
创建表、设计字段
可视化效果
对应语句代码:
CREATE TABLE `数据库名`.`表名` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '学号', # 字段名`id`、int类型、自动创建字段值并递增(AUTO_INCREMENT)
`name` varchar(20) NOT NULL COMMENT '姓名', # 必填(NOT NULL)、注释为「姓名」
`sex` bit(64) DEFAULT 0 COMMENT '性别,0男1女', # 默认值为0
PRIMARY KEY (`id`) # 主键
);
新增一列
可视化效果
对应语句代码:
ALTER TABLE `first`.`student_info`
ADD COLUMN `phone` varchar(11) NOT NULL COMMENT '手机号' AFTER `motto`;
调整列位置
ALTER TABLE `company`.`employee`
MODIFY COLUMN `birthday` date NOT NULL AFTER `salary`;
删除表
DROP TABLE `数据库名`.`表名`
修改一个字段的值
把数据库first中表student_info里的phone字段值修改了,这个phone字段值所在的主键是student_id为2的那个学生。
UPDATE `first`.`student_info` SET `phone` = '15127145555' WHERE `student_id` = 2;
删除一条数据
DELETE FROM first.class_info WHERE class_id = 8;
插入一条数据
INSERT INTO `first`.`class_info` (`class_name`, `create_date`) VALUES ('181', '2009-09-01');
插入多条语句
INSERT INTO `first`.`class_info` (class_name, create_date) VALUES ('184', '2021-12-12'),('185', '2021-12-13'),('186', '2023-12-12');
导出
导入
关联外键
ALTER TABLE `first`.`student_info`
ADD FOREIGN KEY (`class_id`) REFERENCES `first`.`class_info` (`class_id`) ON DELETE SET NULL;
ON DELETE:表示,再删除这个班级数据的时候,将以他为外键的数据的外键设置为null。也就是说,当这个班级删了,所有这个班级的学生的外键就会变成null
有了外键后,添加数据时左边就出现三个小点点了。
查询语句
源数据放在物理表中,存储在硬盘。
查询结果将数据从物理表中拿出来,会放到内存中,生成结果表。
结果表来自于物理表
SELECT FROM
查一列数据
SELECT id FROM `user`;
查两列数据
SELECT id,loginId FROM `user`;
查全部列
SELECT * FROM `user`;
AS 定别名
SELECT ismale AS '性别' FROM `employee`;
SELECT DISTINCT
去重
关键词 DISTINCT 用于返回唯一不同的值。
通常只查一列的时候使用。查多列会比较矛盾。因为需要多行数据中的每一列的数据都对应重复才会被过滤。
SELECT DISTINCT location FROM company.employee
CASE WHEN子句
查询结果值修改(0转为男,1转为女)
第一种写法
SELECT id, `name`,
CASE ismale
WHEN 0 THEN '男'
ELSE '女'
END sex,
salary
FROM employee;
第二种写法
SELECT id, `name`,
case
WHEN ismale = 0 THEN '男'
ELSE '女'
END sex,
salary
FROM employee;
查询结果分类
工资分类
SELECT id, `name`,
case
WHEN ismale = 0 THEN '男'
ELSE '女'
END sex,
salary,
case
WHEN salary > 10000 THEN '高收入'
WHEN salary >= 5000 THEN '中等收入'
ELSE '底收入'
END `level`
FROM employee;
FROM
WHERE
字段=固定值
将上边case子句的数据进一步过滤,只展示「男同胞」的数据
SELECT id, `name`,
case ismale
WHEN 1 THEN '男'
ELSE '女'
END sex,
salary
FROM employee
WHERE ismale = 1;
-- 运行顺序:先from再where,再根据select与case子句来生成结果数据
IN
类似数组的includes方法
SELECT * FROM department
WHERE companyId IN (1, 2) -- 查询 companyId = 1 || companyId = 2的数据
IS
类似于「=」符号
SELECT * FROM employee
WHERE location IS NULL; -- 查询 location字段为NULL的数据
IS NOT
类似于「!=」符号
SELECT * FROM employee
WHERE location IS NOT NULL;
> >= < <=
查询范围,与数学符号同义
SELECT * FROM employee
WHERE salary > 19800;
BETWEEN
工资在10000~12000之间的
SELECT * FROM employee
WHERE salary BETWEEN 10000 AND 12000;
LIKE 模糊查询
% 符号表示任意字符,任意长度
_ 符号表示任意字符,但是只表示一个长度的字符。
SELECT * FROM employee
WHERE `name` LIKE '%徐%' ; -- 徐字前后可以有任意字符
AND
姓张的女生、薪水10k以上
SELECT * FROM employee
WHERE `name` LIKE '张_' AND salary > 12000 AND ismale = 0;
OR
SELECT * FROM employee
WHERE `name` LIKE '张_' AND salary > 12000 AND ismale = 0
OR birthday >= '2000-9-1'
要么满足like后边的三个条件,要么满足生日是2020年9月及以后出生的
(AND + OR)
-- or 与 and 一起用
SELECT * FROM employee
WHERE `name` LIKE '张_' AND (salary > 12000 AND ismale = 0
OR birthday >= '2000-9-1');
前提是必须是姓张的,然后要么是薪水12000以上的女生,要么是1999-9月以后出生的人
ORDER BY
- 在order by语句处可以用select处理后的列数据了(对结果表的进一步排序处理)
- 字符串是对ASCII码的排序
asc 升序
SELECT * FROM employee
WHERE `name` LIKE '张_' AND (salary > 12000 AND ismale = 0
OR birthday >= '1999-9-1')
ORDER BY salary ASC;
desc 降序
SELECT id, `name`, ismale,
CASE
WHEN ismale = 0 THEN '男'
ELSE
'女'
END sex,
salary, birthday
FROM employee
WHERE `name` LIKE '张_' AND (salary > 12000 AND ismale = 0
OR birthday >= '1999-9-1')
ORDER BY salary DESC; -- 用前边select后的数据进行排序也是可以的,因为是对结果表的排序
多条件order by, 逗号分隔
SELECT id, `name`, ismale,
CASE
WHEN ismale = 0 THEN '男'
ELSE
'女'
END sex,
salary, birthday
FROM employee
WHERE `name` LIKE '张_' AND (salary > 12000 AND ismale = 0
OR birthday >= '1999-9-1')
ORDER BY sex ASC, salary DESC; -- 多条件ORDER BY
LIMIT n, m
n,m:数字,表示跳过n条数据,取出m条数据。
n不包含,从n+1开始计算,取出m条。
SELECT id, `name`, ismale,
CASE
WHEN ismale = 0 THEN '男'
ELSE
'女'
END sex,
salary, birthday
FROM employee
WHERE `name` LIKE '张_' AND (salary > 12000 AND ismale = 0
OR birthday >= '1999-9-1')
ORDER BY sex ASC, salary DESC -- 多条件ORDER BY
LIMIT 3, 2; -- 跳过前三条,取出2条数据
GROUP BY
https://www.yuque.com/xing.org1/cdu7by/kqrs4u#JoM80
HAVING
https://www.yuque.com/xing.org1/cdu7by/kqrs4u#Ia3Tf