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 权限的用户才能看到所有会话的执行情况。
相关推荐
不穿格子的程序员41 分钟前
MySQL篇5:MySQL深度揭秘——MySQL 执行计划分析与 SQL 优化最佳实践
sql·mysql·sql优化
youxiao_9041 分钟前
Mysql 备份与还原
数据库·mysql
友友马42 分钟前
『MySQL - 进阶』存储过程(上):核心概念、变量体系与流程控制
android·数据库·mysql
zhougl99643 分钟前
学习-深入学习SQL语句
数据库·sql·学习
('-')43 分钟前
《从根上理解MySQL是怎样运行的》第二十三章笔记
数据库·笔记·mysql
Mr.徐大人ゞ44 分钟前
13.MHA 常用问题
mysql
LSL666_44 分钟前
云服务器安装MySQL
运维·服务器·mysql
卿雪1 小时前
MySQL【数据类型】:CHAR 和 VARCHAR 的对比、VATCHAR(n) 和 INT(n) 里的 n 一样吗?
android·java·数据库·python·mysql·adb·golang
麦聪聊数据1 小时前
Web架构如何打通从SQL 脚本到API 服务的全链路追踪?
数据库·sql·架构