- 作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
- 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
- 个人主页:团儿.-CSDN博客
目录
前言:
一.DQL 介绍
二.select 语句的应用
1.select单独使用的情况***
2.select 通用语法(单表) *****
3.学习环境的说明
如何熟悉数据库业务?
4.SELECT 配合 FROM 子句使用
(1) 查询表中所有的信息(生产中几乎是没有这种需求的)
(2) 查询表中 name和population的值
5.SELECT 配合 WHERE 子句使用
-- where等值条件查询 *****
-- where 配合比较判断查询(> < >= <=) *****
-- where 配合 逻辑连接符(and or)
-- where 配合 like 子句 模糊查询 *****
-- where 配合 in 语句
6.GROUP BY
小扩展(拼接,自定义分隔符)
7.SELECT 配合 ORDER BY 子句
8.SELECT 配合 LIMIT 子句
9. union 和 union all
面试题: union 和 union all 的区别 ?
三.多表连接查询(内连接)
分类:
1.多表连接基本语法
2.多表连接例子
(5).别名应用
表别名 :
列别名:
(6).语句嵌套
前言:
在信息爆炸的时代,数据已成为企业运营决策和个人生活分析不可或缺的基石。而数据库,作为数据存储与管理的核心工具,其重要性不言而喻。在众多数据库管理系统中,MySQL以其开源、稳定、高效的特点,赢得了广泛的用户群体,从个人开发者到大型企业,无一不将其视为数据存储与检索的首选方案。
在MySQL的广阔世界中,DQL(Data Query Language)占据了举足轻重的地位。作为SQL(Structured Query Language)的精髓之一,DQL专注于数据检索与查询,是用户与数据库之间沟通的桥梁。通过DQL,用户可以灵活地构造查询语句,从浩如烟海的数据中提取出有价值的信息,无论是简单的数据浏览,还是复杂的统计分析,DQL都能提供强有力的支持。
本文将深入探索MySQL数据库中的DQL,从基础语法讲起,逐步揭开其高级特性与实战技巧的神秘面纱。
我们将一起学习如何使用SELECT语句从表中检索数据,掌握WHERE子句在过滤结果中的应用,理解ORDER BY如何帮助我们对数据进行排序,以及如何通过聚合函数和GROUP BY子句实现数据的分组统计。
此外,本文还将探讨DQL在实际应用中的案例,展示如何结合业务需求,构建高效、准确的查询语句。
一.DQL 介绍
select show
DQL是Data Query Language缩写,数据查询语言,用于检索数据库中的数据。DQL是作为查询语句,不会对数据库的数据进行修改。
二.select 语句的应用
1.select单独使用的情况***
mysql> select @@basedir; #mysql安装目录
mysql> select @@port; #mysql端口号
mysql> select @@innodb_flush_log_at_trx_commit; #日志刷新策略
mysql> show variables like 'innodb%'; #模糊查看innodb开头的配置
mysql> select database(); #查看当前库名
mysql> select now(); #查看当前系统时间
mysql> select @@server_id; #查看本实例id号,群集中不能重复
2.select 通用语法(单表) *****
select 显示的列名(多列逗号分开)
from 表名(多个表逗号分开)
where 过滤条件的列
group by 分组的列
having 分组后的过滤聚合函数
order by 排序的列
limit 显示前几行
3.学习环境的说明
world数据库
city 城市表
country 国家表
countrylanguage 国家的语言
ID : 城市序号(1-...)
name : 城市名字
countrycode : 国家代码,例如:CHN,USA
district : 区域: 中国 省 美国 洲
population : 人口数
如何熟悉数据库业务?
快速和研发人员打好关系
找到领导要ER图
DESC ,show create table
select * from city limit 5;
4.SELECT 配合 FROM 子句使用
-- select 列,列,列 from 表
--- 例子:
(1) 查询表中所有的信息(生产中几乎是没有这种需求的)
use world ;
select id,name,countrycode,district,population from city;
或者:
select * from city;
(2) 查询表中 name和population的值
select name,population from city;
5.SELECT 配合 WHERE 子句使用
-- select 列,列,列 from 表 where 过滤条件
-- where等值条件查询 *****
例子:
查询中国所有的城市名和人口数
select name,population from city where countrycode='CHN';
-- where 配合比较判断查询(> < >= <=) *****
例子:
世界上小于100人的城市名和人口数
select name,population from city where population<100;
-- where 配合 逻辑连接符(and or)
例子:
(1) 查询中国人口数量大于800w的城市名和人口
select name,population from city where countrycode='CHN' and population>8000000;
(2) 查询中国或美国的城市名和人口数
select name,population from city where countrycode='CHN' or countrycode='USA';
(3) 查询人口数量在500w到600w之间的城市名和人口数
select name,population from city where population>=5000000 and population<=6000000;
或者:
select name,population from city where population between 5000000 and 6000000;
-- where 配合 like 子句 模糊查询 *****
例子:
查询一下contrycode中带有CH开头,城市信息
select name,countrycode from city where countrycode like 'CH%';
注意:不要出现类似于 %CH%,前后都有百分号的语句,因为不走索引,性能极差
如果业务中有大量需求,我们用"Elasticsearch"来替代
-- where 配合 in 语句
例子:
查询中国或美国的城市信息.
select name,population from city where countrycode in ('CHN','USA');
或
select name,population from city where countrycode='CHN' or countrycode='USA';
6.GROUP BY
将某列中有共同条件的数据行,分成一组,然后在进行聚合函数(sum,avg,count,max,min)操作.
例子:
(1) 统计每个国家,城市的个数
select countrycode,count(name) from city group by countrycode;
(2) 统计每个 国家 省 的个数(distinct 去除重复)
select countrycode,count(distinct district) from city group by countrycode;
(3) 统计中国 每个省城市的名字列表GROUP_CONCAT() #列转行
select district,group_concat(name) from city where countrycode='CHN' group by district;
注:若不加GROUP_CONCAT(),则会报错,听为实一对多的形式,不可显示
小扩展(拼接,自定义分隔符)
anhui : hefei,huaian ....
SELECT CONCAT(district,":" ,GROUP_CONCAT(NAME)) FROM city
WHERE countrycode='CHN'
GROUP BY district ;
7.SELECT 配合 ORDER BY 子句
例子:
统计所有国家的总人口数量,
将总人口数大于5000w的过滤出来,
并且按照从大到小顺序排列
select countrycode,sum(population) from city group by countrycode having sum(population)>50000000
order by sum(population) desc;
注:默认为升序,asc ; 降序为desc
8.SELECT 配合 LIMIT 子句
例子:
统计所有国家的总人口数量,
将总人口数大于5000w的过滤出来,
并且按照从大到小顺序排列,只显示前三名
select countrycode,sum(population) from city group by countrycode having sum(population)>50000000
order by sum(population) desc limit 3;
LIMIT M,N :跳过M行,显示一共N行
LIMIT Y OFFSET X: 跳过X行,显示一共Y行
9. union 和 union all
作用: 多个结果集合并查询的功能
需求: 查询中或者美国的城市信息
SELECT * FROM city WHERE countrycode='CHN' OR countrycode='USA';
改写为:
SELECT * FROM city WHERE countrycode='CHN'
UNION ALL
SELECT * FROM city WHERE countrycode='USA';
面试题: union 和 union all 的区别 ?
union all 不做去重复
union 会做去重操作
三.多表连接查询(内连接)
分类:
inner join 内连接,企业普遍使用,inner可以省略
left join 左外连接
right join 右外连接
full join 完整外连接
cross join 求笛卡尔积
1.多表连接基本语法
student :学生表
===============
sno: 学号
sname:学生姓名
sage: 学生年龄
ssex: 学生性别
teacher :教师表
================
tno: 教师编号
tname:教师名字
course :课程表
===============
cno: 课程编号
cname:课程名字
tno: 教师编号
sc :成绩表
==============
sno: 学号
cno: 课程编号
score:成绩
素材:
create database school default charset utf8mb4 collate utf8mb4_bin;
use school
create table student (
sno int not null primary key auto_increment comment "学号",
sname varchar(20) not null comment "学生姓名",
sage int not null comment "学生年龄",
ssex char(4) not null comment "学生性别");
create table teacher (
tno int not null,
tname varchar(20)
);
create table course (
cno int not null,
cname varchar(20) not null,
tno int not null
);
create table sc (
sno int not null,
cno int not null,
score int not null
);
INSERT INTO student(sno,sname,sage,ssex)
VALUES (1,'zhang3',18,'m');
INSERT INTO student(sno,sname,sage,ssex)
VALUES
(2,'zhang4',18,'m'),
(3,'li4',18,'m'),
(4,'wang5',19,'f');
INSERT INTO student
VALUES
(5,'zh4',18,'m'),
(6,'zhao4',18,'m'),
(7,'ma6',19,'f');
INSERT INTO student(sname,sage,ssex)
VALUES
('maliu',20,'m'),
('zhuqi',20,'f'),
('sunjiu',25,'m');
INSERT INTO teacher(tno,tname) VALUES
(101,'laowu'),
(102,'laoxia'),
(103,'laoli');
DESC course;
INSERT INTO course(cno,cname,tno)
VALUES
(1001,'linux',101),
(1002,'python',102),
(1003,'mysql',103);
DESC sc;
INSERT INTO sc(sno,cno,score)
VALUES
(1,1001,80),
(1,1002,59),
(2,1002,90),
(2,1003,100),
(3,1001,99),
(3,1003,40),
(4,1001,79),
(4,1002,61),
(4,1003,99),
(5,1003,40),
(6,1001,89),
(6,1003,77),
(7,1001,67),
(7,1003,82),
(8,1001,70),
(9,1003,80),
(10,1003,96);
SELECT * FROM student;
SELECT * FROM teacher;
SELECT * FROM course;
SELECT * FROM sc;
2.多表连接例子
(1). 统计zhang3,学习了几门课
select student.sname,count(sc.score) from student inner join sc
on student.sno=sc.sno
where student.sname='zhang3';
(2).查询laoli老师教的学生名和个数.
select teacher.tname,group_concat(student.sname),count(student.sname)
from teacher join course on teacher.tno=course.tno
join sc on course.cno=sc.cno
join student on sc.sno=student.sno
where teacher.tname='laoli';
(3).每位老师所教课程的平均分,并按平均分降序排列
select teacher.tname,avg(sc.score)
from teacher join course on teacher.tno=course.tno
join sc on course.cno=sc.cno
group by teacher.tname
order by avg(sc.score) desc;
(4).查询所有老师所教学生不及格的信息(扩展)
第一种方法:
select teacher.tname,student.sname,sc.score from
teacher join course on teacher.tno=course.tno
join sc on course.cno=sc.cno
join student on sc.sno=student.sno
where sc.score<60;
第二种方法:
SELECT teacher.tname,GROUP_CONCAT(CONCAT(student.sname,":",sc.score))
FROM teacher
JOIN course
ON teacher.tno=course.tno
JOIN sc
ON course.cno=sc.cno
JOIN student
ON sc.sno=student.sno
WHERE sc.score<60
GROUP BY teacher.tname;
(5).别名应用
表别名 :
SELECT t.tname,GROUP_CONCAT(CONCAT(st.sname,":",sc.score))
FROM teacher as t
JOIN course as c
ON t.tno=c.tno
JOIN sc
ON c.cno=sc.cno
JOIN student as st
ON sc.sno=st.sno
WHERE sc.score<60
GROUP BY t.tname;
表别名是全局调用的.
列别名:
SELECT t.tname as 讲师名 ,GROUP_CONCAT(CONCAT(st.sname,":",sc.score)) as 不及格的
FROM teacher as t
JOIN course as c
ON t.tno=c.tno
JOIN sc
ON c.cno=sc.cno
JOIN student as st
ON sc.sno=st.sno
WHERE sc.score<60
GROUP BY t.tno
列别名可以被 having 和 order by 调用
(6).语句嵌套
create database hehe default charset utf8mb4 collate utf8mb4_bin;
use hehe
create table t1 (id int,name varchar(20));
insert into t1 values (1,'zhangsan'),(2,'lisi'),(3,'zhangsan'),(4,'wangwu'),(5,"zhangsan"),(6,'lisi');
要求:查找重复两次及以上的人员,按id号从大到小排列。
select t1.name,id from t1
join (select name from t1 group by name having count(name)>1) as t2
on t1.name=t2.name order by id desc;
期待您的关注~