作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。
座右铭:低头赶路,敬事如仪
个人主页:网络豆的主页
前言
本章将会讲解MySQLDQL,DCL语言的学习。
一.DQL
在一个正常的业务系统中,查询操作的频次是要远高于增删改的,当我们去访问企业官网、电商网站,在这些网站中我们所看到的数据,实际都是需要从数据库中查询并展示的。而且在查询的过程中,可能 还会涉及到条件、排序、分页等操作。
drop table if exists employee;
create table emp(
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(10) comment '姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
workaddress varchar(50) comment '工作地址',
entrydate date comment '入职时间'
)comment '员工表';
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (1, '00001', '柳岩666', '女', 20, '123456789012345678', '北京', '2000-01-
01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (2, '00002', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-
01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (3, '00003', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-
01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (4, '00004', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (5, '00005', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (6, '00006', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (7, '00007', '范瑶', '男', 40, '123456789212345670', '北京', '2005-05-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (8, '00008', '黛绮丝', '女', 38, '123456157123645670', '天津', '2015-05-
01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (9, '00009', '范凉凉', '女', 45, '123156789012345678', '北京', '2010-04-
01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (10, '00010', '陈友谅', '男', 53, '123456789012345670', '上海', '2011-01-
01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (11, '00011', '张士诚', '男', 55, '123567897123465670', '江苏', '2015-05-
01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (12, '00012', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-
01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (13, '00013', '张三丰', '男', 88, '123656789012345678', '江苏', '2020-11-
01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (14, '00014', '灭绝', '女', 65, '123456719012345670', '西安', '2019-05-
01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (15, '00015', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-
01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES (16, '00016', '周芷若', '女', 18, null, '北京', '2012-06-01');
1.基本语法
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
- 基本查询(不带任何条件)
- 条件查询(WHERE)
- 聚合函数(count、max、min、avg、sum)
- 分组查询(group by)
- 排序查询(order by)
- 分页查询(limit)
2.基础查询
SELECT 字段1, 字段2, 字段3 ... FROM 表名 ; 1
SELECT * FROM 表名 ;
注意 : * 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名; 1
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;
SELECT DISTINCT 字段列表 FROM 表名;
select name,workno,age from emp;
select id ,workno,name,gender,age,idcard,workaddress,entrydate from emp; 1
select * from emp; 1
select workaddress as '工作地址' from emp;
-- as可以省略
select workaddress '工作地址' from emp;
select distinct workaddress '工作地址' from emp;
3.条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表 ;
select * from emp where age = 88;
select * from emp where age < 20;
select * from emp where age <= 20
select * from emp where idcard is null;
select * from emp where idcard is not null;
select * from emp where age != 88;
select * from emp where age <> 88;
select * from emp where age >= 15 && age <= 20;
select * from emp where age >= 15 and age <= 20;
select * from emp where age between 15 and 20;
select * from emp where gender = '女' and age < 25;
select * from emp where age = 18 or age = 20 or age =40;
select * from emp where age in(18,20,40);
select * from emp where name like '__';
select * from emp where idcard like '%X';
select * from emp where idcard like '_________________X';
4.聚合函数
SELECT 聚合函数(字段列表) FROM 表名 ;
select count(*) from emp; -- 统计的是总记录数
select count(idcard) from emp; -- 统计的是idcard字段不为null的记录数
select count(1) from emp;
对于 count(*) 、 count( 字段 ) 、 count(1) 的具体原理,我们在进阶篇中 SQL 优化部分会详细讲解,此处大家只需要知道如何使用即可。
select avg(age) from emp;
select max(age) from emp;
D. 统计该企业员工的最小年龄
select min(age) from emp;
select sum(age) from emp where workaddress = '西安';
5.分组查询
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组
后过滤条件 ];
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
• 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。• 执行顺序 : where > 聚合函数 > having 。• 支持多字段分组 , 具体语法为 : group by columnA,columnB
select gender, count(*) from emp group by gender ;
select gender, avg(age) from emp group by gender ;
select workaddress, count(*) address_count from emp where age < 45 group by
workaddress having address_count >= 3;
select workaddress, gender, count(*) '数量' from emp group by gender , workaddress
;
6.排序查询
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
- ASC : 升序(默认值)
- DESC: 降序
• 如果是升序 , 可以不指定排序方式 ASC ;• 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
select * from emp order by age asc;
select * from emp order by age;
select * from emp order by entrydate desc;
select * from emp order by age asc , entrydate desc; 1
7.分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
• 起始索引从 0 开始,起始索引 = (查询页码 - 1 ) * 每页显示记录数。• 分页查询是数据库的方言,不同的数据库有不同的实现, MySQL 中是 LIMIT 。• 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10 。
select * from emp limit 0,10;
select * from emp limit 10;
select * from emp limit 10,10;
select * from emp where gender = '女' and age in(20,21,22,23);
select * from emp where gender = '男' and ( age between 20 and 40 ) and name like
'___';
select gender, count(*) from emp where age < 60 group by gender;
select name , age from emp where age <= 35 order by age asc , entrydate desc;
select * from emp where gender = '男' and age between 20 and 40 order by age asc ,
entrydate asc limit 5 ;
8.执行顺序
验证:
select name , age from emp where age > 15 order by age asc;
select e.name , e.age from emp e where e.age > 15 order by age asc;
select e.name ename , e.age eage from emp e where eage > 15 order by age asc;
由此我们可以得出结论: from 先执行,然后执行 where , 再执行select 。
select e.name ename , e.age eage from emp e where e.age > 15 order by eage asc;
二.DCL
1.管理用户
select * from mysql.user;
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; 1
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;
DROP USER '用户名'@'主机名' ;
• 在 MySQL 中需要通过用户名 @ 主机名的方式,来唯一标识一个用户。• 主机名可以使用 % 通配。• 这类 SQL 开发人员操作的比较少,主要是 DBA (Database Administrator 数据库 管理员)使用。
create user 'itcast'@'localhost' identified by '123456'; 1
create user 'heima'@'%' identified by '123456';
alter user 'heima'@'%' identified with mysql_native_password by '1234';
drop user 'itcast'@'localhost';
2.权限控制
1). 查询权限 文章来源:https://www.toymoban.com/news/detail-515625.html
SHOW GRANTS FOR '用户名'@'主机名' ;
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名'; 1
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
• 多个权限之间,使用逗号分隔• 授权时, 数据库名和表名可以使用 * 进行通配,代表所有
show grants for 'heima'@'%';
grant all on itcast.* to 'heima'@'%';
revoke all on itcast.* from 'heima'@'%';
创作不易,求关注,点赞,收藏,谢谢~ 文章来源地址https://www.toymoban.com/news/detail-515625.html
到了这里,关于MySQL——DQL,DCL语言学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!