思维导图
本文的思维导图如下:

一、什么是 SQL?
SQL,其全称 Structured Query Language,中文翻译为结构化查询语言。
SQL,就是++操作关系型数据库++ 的编程语言。
它++定义了操作所有关系型数据库++ 的统一标准。
ps:对于同一需求,每一种数据库操作的方式可能会存在一些不同,我们称其为"方言"。
二、SQL 的通用语法
- SQL 语句可以单行或多行书写,以分号结尾。
- MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
- 注释
单行注释:--注释内容或#注释内容(MySQL特有)
多行注释:/*注释*/
三、SQL 的分类

- DDL(Data Definition Lanquage)数据定义语言,用来定义数据库对象:数据库,表,列等
- DML(Data Manipulation Language)数据操作语言,用来对数据库中表的数据进行增删改
- DQL(Data Query Language)数据查询语言,用来查询数据库中表的记录(数据)
- DCL (Data Control Language)数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户

(一)DDL
操作数据库

查询所有的数据库

创建数据库
创建数据库

相同名字的数据库不能重复创建

应该用下面语句创建数据库,即带判断的创建语句:

没有报错,但有1个警告
创建成功的提示:

检查是否创建成功:

删除数据库

删除一个不存在的数据库,会报错:

ps:下面这种报错是语法错误:

需要带判断的删除语句:
删除不存在的数据库,不会报错,但有警告

使用数据库
使用数据库 use:

查询当前正在使用的数据库,用到database()函数:

操作表
● 创建(Create)
● 查询(Retrieve)
● 修改(Update)
● 删除(Delete)
查询表

当前数据库没有tables表:

mysql数据库有很多表格,进入mysql数据库:

查询:

查询某个表的结构信息:

创建表

进入db1数据库:

创建表tb_user:

查询db1数据库中的所有表格:

查询tb_user表格的结构信息:

删除表



修改表

修改表名:


添加一列:

修改某一列的数据类型:

修改某一列及其数据类型:

删除某一列:

(二)DML
添加数据

sql
-- 查询所有数据
SELECT
*
FROM
stu;
-- 给指定列添加数据
INSERT INTO stu (id, NAME)
VALUES
(1, '张三');
-- 给所有列添加数据
INSERT INTO stu (
id,
NAME,
gender,
birthday,
score,
email,
tel,
STATUS
)
VALUES
(
2,
'李四',
'男',
'1999-11-11',
88.88,
'lisi@itcast.cn',
'13855551234',
1
);
-- 可以省略列名,但实际开发中不建议
-- 点击美化,便于添加注释
INSERT INTO stu
VALUES
(
2, -- 编号
'李四', -- 姓名
'男',
'1999-11-11',
88.88,
'lisi@itcast.cn',
'13855551234',
1
);
ps:

受影响的行:1 表示stu表中有一行被改变了
修改数据

sql
select * from stu;
-- 修改数据
-- 将张三的性别改为女
update stu set gender = '女' where name = '张三';
-- 将李四的生日改为1999-12-12 分数改为99.99
update stu set birthday = '1999-12-12', score = 99.99 where name = '李四';
-- 注意:如果update语句没有加where条件,则会将表中所有数据全部修改!
update stu set status = 2;

删除数据

sql
-- 删除数据
-- 删除张三记录
delete from stu where name = '张三';
-- 不加where语句,会删除表中全部信息
delete from stu;

(三)DQL

基础查询

sql
-- 删除stu表
drop table if exists stu;
-- 创建stu表
CREATE TABLE stu (
id int, -- 编号
name varchar(20), -- 姓名
age int, -- 年龄
sex varchar(5), -- 性别
address varchar(100), -- 地址
math double(5,2), -- 数学成绩
english double(5,2), -- 英语成绩
hire_date date -- 入学时间
);
-- 添加数据
INSERT INTO stu(id,NAME,age,sex,address,math,english,hire_date)
VALUES
(1,'马运',55,'男','杭州',66,78,'1995-09-01'),
(2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');
sql
select * from stu;
-- 基础查询
-- 查询name age 两列
select name, age from stu;
-- 查询所有列的数据,列名的列表可以使用*使用
-- 但不要使用!因为不知道具体查看哪些列,也不便于加注释
select * from stu;
-- 查询地址该列信息
select address from stu;
-- 去除重复记录 distinct
select distinct address from stu;
-- 查询姓名 数学成绩 英语成绩
select name, math, english from stu;
-- 给列取别名
select name, math as 数学成绩, english as 英语成绩 from stu;
-- 也可以省略as 用空格隔开
select name, math 数学成绩, english 英语成绩 from stu;
条件查询

精确查询
sql
-- 条件查询===========================
-- 1.查询年龄大于20岁的学员信息
select * from stu where age > 20;
-- 2.查询年龄大于等于20岁的学员信息
select * from stu where age >= 20;
-- 3.查询年龄大于等于20岁 并且 年龄小于等于30岁 的学员信息
select * from stu where age >= 20 && age <= 30;
select * from stu where age >= 20 and age <= 30;
select * from stu where age between 20 and 30;
-- 4.查询入学日期在'1998-09-01'到'1999-09-01'之间的学员信息
-- 日期也可以直接比较大小
select * from stu where hire_date between '1998-09-01' and '1999-09-01' ;
-- 5.查询年龄等于18岁的学员信息
select * from stu where age = 18;
-- 6.查询年龄不等于18岁的学员信息
select * from stu where age != 18;
select * from stu where age <> 18;
-- 7.查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁 的学员信息
select * from stu where age = 18 or age = 20 or age = 22;
select * from stu where age in (18, 20, 22);
-- 8.查询英语成绩为null的学员信息
-- 注意:null值的比较不能使用 = 或者 != 比较, 需要使用is 或者 is not
select * from stu where english = null; -- no
select * from stu where english is null;-- ok
-- 9.查询英语成绩不为null的学员信息
select * from stu where english is not null;
模糊查询
sql
-- 条件查询之模糊查询 like=============================
-- 1.查询姓'马'的学员信息
select * from stu where name like '马%';
-- 2.查询第二个字是'花'的学员信息
select * from stu where name like '_花%';
-- 3.查询名字中包含'德'的学员信息
select * from stu where name like '%德%';
排序查询

sql
-- 排序查询============================================
-- 1.查询学生信息,按照年龄升序排列
select * from stu order by age asc;
select * from stu order by age; -- asc默认
-- 2.查询学生信息,按照数学成绩降序排列
select * from stu order by math desc;
-- 多字段排序
-- 3.查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
select * from stu order by math desc, english asc;
聚合函数

sql
-- 聚合函数===========================================
-- 1.统计班级一共有多少个学生
select count(id) from stu; -- COUNT统计的列名不能为null(该列不能有null)
select count(english) from stu; -- 如果该列有null值,计数不包括null
select count(*) from stu; -- 只要该条数据不全为null,就统计在内
-- 2.查询数学成绩的最高分
select max(math) from stu;
-- 3.查询数学成绩的最低分
select min(math) from stu;
-- 4.查询数学成绩的总分
select sum(math) from stu;
-- 5.查询数学成绩的平均分
select avg(math) from stu;
-- 6.查询英语成绩的最低分(英语成绩列存在null)
select min(english) from stu; -- null不参与聚合函数的计算
分组查询

where 和 having 的区别
- 执行时机不一样:
○ where 是分组之前进行限定,不满足 where 条件,则不参与分组;
○ 而 having 是分组之后对结果进行过滤。 - 可判断的条件不一样:
○ where 不能对聚合函数进行判断,having 可以。 - 执行顺序:where > 聚合函数 > having
sql
-- 分组查询===============================================
-- 1.查询男同学和女同学各自的数学平均分
select sex,avg(math) from stu group by sex;
-- 注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
select name,sex,avg(math) from stu group by sex; -- 查询其他字段name无任何意义
-- 2.查询男同学和女同学各自的数学平均分,以及各自人数
select sex,avg(math),count(*) from stu group by sex;
-- 3.查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
select sex,avg(math),count(*) from stu where math > 70 group by sex;
-- 4.查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,
-- 分组之后人数大于2
select sex,avg(math),count(*) from stu where math > 70 group by sex having count(*) > 2;
分页查询

sql
-- 分页查询=================================================
-- 起始索引 = (当前页码 - 1) * 每页显示的条数
-- 1.从0开始查询,查询第1页数据
select * from stu limit 0,3;
-- 2.每页显示3条数据,查询第1页数据
select * from stu limit 0,3;
-- 3.每页显示3条数据,查询第2页数据
select * from stu limit 3,3;
-- 4.每页显示3条数据,查询第3页数据
select * from stu limit 6,3;
DQL 小结

五、相关面试题
1. DDL、DML、DDL、DCL 分别是什么?
从事务的角度来看,数据库的操作主要分成四类:
- DDL(Data Definition Language)数据定义语言 ,
- 用来++定义数据库对象++,比如创建数据库、创建表、删除表等。
- 比如:
CREATE、ALTER、DROP。- DML(Data Manipulation Language)数据操作语言
- 用来++对表里的数据进行++ ++增删改++ ,比如:
INSERT、UPDATE、DELETE。- DQL(Data Query Language)数据查询语言
- 用来++查询数据++ ,比如我们最常写的
SELECT。- DCL(Data Control Language)数据控制语言
- 用来++控制数据库用户的权限++,比如创建用户、授权用户、回收权限。
- 比如:
GRANT、REVOKE总结: DDL 管结构、DML 改数据、DQL 查数据、DCL管权限。
2. 怎么查看有多少个 SQL 语句在执行?
可以用
SHOW PROCESSLIST命令来查看当前正在执行的 SQL。这个命令会列出++当前数据库里的活动线程++,包括执行中的 SQL、等待状态、连接信息等。
需要注意的是:
- 普通用户只能看到自己的线程;
- root 或有 PROCESS 权限的用户才能看到所有会话的执行情况。