•  作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
  •  座右铭:   云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
  •  个人主页:团儿.-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;


期待您的关注~

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐