MySQL【SQL及其分类】:DDL、DML、DQL、DCL

思维导图

本文的思维导图如下:

一、什么是 SQL?

SQL,其全称 Structured Query Language,中文翻译为结构化查询语言

SQL,就是++操作关系型数据库++ 的编程语言

它++定义了操作所有关系型数据库++ 的统一标准

ps:对于同一需求,每一种数据库操作的方式可能会存在一些不同,我们称其为"方言"。

二、SQL 的通用语法

  1. SQL 语句可以单行或多行书写,以分号结尾。
  2. MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
  3. 注释
    单行注释:--注释内容#注释内容(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 分别是什么?

从事务的角度来看,数据库的操作主要分成四类:

  1. DDL(Data Definition Language)数据定义语言
    1. 用来++定义数据库对象++,比如创建数据库、创建表、删除表等。
    2. 比如:CREATEALTERDROP
  2. DML(Data Manipulation Language)数据操作语言
    1. 用来++对表里的数据进行++ ++增删改++ ,比如:INSERTUPDATEDELETE
  3. DQL(Data Query Language)数据查询语言
    1. 用来++查询数据++ ,比如我们最常写的 SELECT
  4. DCL(Data Control Language)数据控制语言
    1. 用来++控制数据库用户的权限++,比如创建用户、授权用户、回收权限。
    2. 比如:GRANTREVOKE

总结: DDL 管结构、DML 改数据、DQL 查数据、DCL管权限。

2. 怎么查看有多少个 SQL 语句在执行?

可以用 SHOW PROCESSLIST 命令来查看当前正在执行的 SQL。

这个命令会列出++当前数据库里的活动线程++,包括执行中的 SQL、等待状态、连接信息等。

需要注意的是:

  • 普通用户只能看到自己的线程
  • root 或有 PROCESS 权限的用户才能看到所有会话的执行情况。
相关推荐
阿巴斯甜2 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker3 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95274 小时前
Andorid Google 登录接入文档
android
黄林晴5 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab17 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿20 小时前
Android MediaPlayer 笔记
android
Jony_21 小时前
Android 启动优化方案
android
阿巴斯甜21 小时前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇21 小时前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android