https://www.w3school.com.cn/sql/sql_syntax.asp

SQL 的 DML(数据操作语言) 部分:

处理 表内数据

  • SELECT - 从数据库表中获取数据
  • UPDATE - 更新数据库表中的数据
  • DELETE - 从数据库表中删除数据
  • INSERT INTO - 向数据库表中插入数据

    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

  1. **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)
  2. <a name="dUa3p"></a>
  3. ## 数据库创建
  4. ```shell
  5. create database 数据库名 charset = utf8;

数据库切换

  1. use 数据库名;

删除数据库

  1. drop database 数据库名;

创建表、设计字段

可视化效果

image.png

对应语句代码:

  1. CREATE TABLE `数据库名`.`表名` (
  2. `id` int NOT NULL AUTO_INCREMENT COMMENT '学号', # 字段名`id`、int类型、自动创建字段值并递增(AUTO_INCREMENT)
  3. `name` varchar(20) NOT NULL COMMENT '姓名', # 必填(NOT NULL)、注释为「姓名」
  4. `sex` bit(64) DEFAULT 0 COMMENT '性别,0男1女', # 默认值为0
  5. PRIMARY KEY (`id`) # 主键
  6. );

新增一列

可视化效果

image.png

对应语句代码:

  1. ALTER TABLE `first`.`student_info`
  2. ADD COLUMN `phone` varchar(11) NOT NULL COMMENT '手机号' AFTER `motto`;

调整列位置

  1. ALTER TABLE `company`.`employee`
  2. MODIFY COLUMN `birthday` date NOT NULL AFTER `salary`;

删除表

  1. DROP TABLE `数据库名`.`表名`

修改一个字段的值

把数据库first中表student_info里的phone字段值修改了,这个phone字段值所在的主键是student_id为2的那个学生。

  1. UPDATE `first`.`student_info` SET `phone` = '15127145555' WHERE `student_id` = 2;

image.png

删除一条数据

  1. DELETE FROM first.class_info WHERE class_id = 8;

image.png

插入一条数据

  1. INSERT INTO `first`.`class_info` (`class_name`, `create_date`) VALUES ('181', '2009-09-01');

插入多条语句

  1. INSERT INTO `first`.`class_info` (class_name, create_date) VALUES ('184', '2021-12-12'),('185', '2021-12-13'),('186', '2023-12-12');

导出

image.png

导入

image.png

关联外键

image.png

  1. ALTER TABLE `first`.`student_info`
  2. ADD FOREIGN KEY (`class_id`) REFERENCES `first`.`class_info` (`class_id`) ON DELETE SET NULL;

ON DELETE:表示,再删除这个班级数据的时候,将以他为外键的数据的外键设置为null。也就是说,当这个班级删了,所有这个班级的学生的外键就会变成null
image.png
有了外键后,添加数据时左边就出现三个小点点了。
image.png

查询语句

源数据放在物理表中,存储在硬盘。
查询结果将数据从物理表中拿出来,会放到内存中,生成结果表。
结果表来自于物理表
image.png

SELECT FROM

查一列数据

  1. SELECT id FROM `user`;

查两列数据

  1. SELECT id,loginId FROM `user`;

查全部列

  1. SELECT * FROM `user`;

image.png

AS 定别名

  1. SELECT ismale AS '性别' FROM `employee`;

image.png

SELECT DISTINCT

去重
关键词 DISTINCT 用于返回唯一不同的值。
通常只查一列的时候使用。查多列会比较矛盾。因为需要多行数据中的每一列的数据都对应重复才会被过滤。

  1. SELECT DISTINCT location FROM company.employee

image.png

CASE WHEN子句

物理表源数据
image.png

查询结果值修改(0转为男,1转为女)

第一种写法

  1. SELECT id, `name`,
  2. CASE ismale
  3. WHEN 0 THEN '男'
  4. ELSE '女'
  5. END sex,
  6. salary
  7. FROM employee;

image.png
第二种写法

  1. SELECT id, `name`,
  2. case
  3. WHEN ismale = 0 THEN '男'
  4. ELSE '女'
  5. END sex,
  6. salary
  7. FROM employee;

查询结果分类

工资分类

  1. SELECT id, `name`,
  2. case
  3. WHEN ismale = 0 THEN '男'
  4. ELSE '女'
  5. END sex,
  6. salary,
  7. case
  8. WHEN salary > 10000 THEN '高收入'
  9. WHEN salary >= 5000 THEN '中等收入'
  10. ELSE '底收入'
  11. END `level`
  12. FROM employee;

image.png

FROM

from后边跟数据源。数据库.表名 / 表名 ……

WHERE

对查询结果表中的数据进一步筛选

字段=固定值

将上边case子句的数据进一步过滤,只展示「男同胞」的数据

  1. SELECT id, `name`,
  2. case ismale
  3. WHEN 1 THEN '男'
  4. ELSE '女'
  5. END sex,
  6. salary
  7. FROM employee
  8. WHERE ismale = 1;
  9. -- 运行顺序:先fromwhere,再根据selectcase子句来生成结果数据

image.png

IN

类似数组的includes方法

  1. SELECT * FROM department
  2. WHERE companyId IN (1, 2) -- 查询 companyId = 1 || companyId = 2的数据

IS

类似于「=」符号

  1. SELECT * FROM employee
  2. WHERE location IS NULL; -- 查询 location字段为NULL的数据

image.png

IS NOT

类似于「!=」符号

  1. SELECT * FROM employee
  2. WHERE location IS NOT NULL;

> >= < <=

查询范围,与数学符号同义

  1. SELECT * FROM employee
  2. WHERE salary > 19800;

image.png

BETWEEN

工资在10000~12000之间的

  1. SELECT * FROM employee
  2. WHERE salary BETWEEN 10000 AND 12000;

LIKE 模糊查询

模糊查询,关键字后边要加表达式。

% 符号表示任意字符,任意长度

_ 符号表示任意字符,但是只表示一个长度的字符。

  1. SELECT * FROM employee
  2. WHERE `name` LIKE '%徐%' ; -- 徐字前后可以有任意字符

image.png
其他例子
image.png
image.png

AND

姓张的女生、薪水10k以上

  1. SELECT * FROM employee
  2. WHERE `name` LIKE '张_' AND salary > 12000 AND ismale = 0;

image.png

OR

  1. SELECT * FROM employee
  2. WHERE `name` LIKE '张_' AND salary > 12000 AND ismale = 0
  3. OR birthday >= '2000-9-1'

要么满足like后边的三个条件,要么满足生日是2020年9月及以后出生的
image.png

(AND + OR)

  1. -- or and 一起用
  2. SELECT * FROM employee
  3. WHERE `name` LIKE '张_' AND (salary > 12000 AND ismale = 0
  4. OR birthday >= '2000-9-1');

前提是必须是姓张的,然后要么是薪水12000以上的女生,要么是1999-9月以后出生的人
image.png

ORDER BY

  • 在order by语句处可以用select处理后的列数据了(对结果表的进一步排序处理)
  • 字符串是对ASCII码的排序

    asc 升序

    1. SELECT * FROM employee
    2. WHERE `name` LIKE '张_' AND (salary > 12000 AND ismale = 0
    3. OR birthday >= '1999-9-1')
    4. ORDER BY salary ASC;
    image.png

desc 降序

  1. SELECT id, `name`, ismale,
  2. CASE
  3. WHEN ismale = 0 THEN '男'
  4. ELSE
  5. '女'
  6. END sex,
  7. salary, birthday
  8. FROM employee
  9. WHERE `name` LIKE '张_' AND (salary > 12000 AND ismale = 0
  10. OR birthday >= '1999-9-1')
  11. ORDER BY salary DESC; -- 用前边select后的数据进行排序也是可以的,因为是对结果表的排序

image.pngimage.png

多条件order by, 逗号分隔

  1. SELECT id, `name`, ismale,
  2. CASE
  3. WHEN ismale = 0 THEN '男'
  4. ELSE
  5. '女'
  6. END sex,
  7. salary, birthday
  8. FROM employee
  9. WHERE `name` LIKE '张_' AND (salary > 12000 AND ismale = 0
  10. OR birthday >= '1999-9-1')
  11. ORDER BY sex ASC, salary DESC; -- 多条件ORDER BY

image.png

LIMIT n, m

n,m:数字,表示跳过n条数据,取出m条数据。
n不包含,从n+1开始计算,取出m条。

  1. SELECT id, `name`, ismale,
  2. CASE
  3. WHEN ismale = 0 THEN '男'
  4. ELSE
  5. '女'
  6. END sex,
  7. salary, birthday
  8. FROM employee
  9. WHERE `name` LIKE '张_' AND (salary > 12000 AND ismale = 0
  10. OR birthday >= '1999-9-1')
  11. ORDER BY sex ASC, salary DESC -- 多条件ORDER BY
  12. LIMIT 3, 2; -- 跳过前三条,取出2条数据

image.png
image.png

GROUP BY

https://www.yuque.com/xing.org1/cdu7by/kqrs4u#JoM80

HAVING

https://www.yuque.com/xing.org1/cdu7by/kqrs4u#Ia3Tf

MySql中,SQL的运行顺序

FROM ->

JOIN IN ->

WHERE ->

GROUP BY ->

SELECT ->

HAVING ->

ORDER BY ->

LIMIT