【mysql的DQL简单介绍】

文章介绍了MySQL中的DQL(DataQueryLanguage)基本操作,包括单表查询、多表查询、子查询、联合查询、交叉连接、内连接、外连接以及自连接等。同时,展示了如何使用WHERE、LIKE、IN、BETWEEN等条件进行数据筛选,以及如何利用COUNT、AVG、MAX、SUM等聚合函数进行数据分析。此外,还提到了查询语句的执行顺序和一些效率优化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境准备

[ root@rocky2 ~]#mysql < hellodb_innodb.sql
[ root@rocky2 ~]#mysql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
6 rows in set (0.00 sec)

mysql> use hellodb

mysql> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| teachers          |
| toc               |
+-------------------+
7 rows in set (0.00 sec)

mysql> select * from students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
25 rows in set (0.00 sec)

查询DQL

select

直接跟字符串跟echo用法差不多

单表操作

students表结构
students表结构

常用选项

select * from student;                                     #查看表里的所有列,也可指定列
select stuid 学员号,name 姓名, gender 性别 from student;      #列后面跟值可更改显示的列名,别名alias
select * from student where age <=20;                      #where指定符合age <=20的行,where后面跟指定符合条件的子句
select * from student where age <=20 and gender = 'F';     #指定符合age <=20并且gender = 'F'的行,或者用or
select * from student where classid in (1,2,3);            #取符合范围的值
select * from student where age between 20 and 30 ;        #大于20,小于30
select * from student limit3;                              #limit3只显示前三行
select * from student limit 2,3;                           #跳过前两行显示后面的三行
select * from student where classid is null;               #取空值用is,非空 not null
select * from student where name like 'ma%';               #模糊查询,%=*  ,like类似于
select distinct age from student;                          #将查询出的值去重distinct
select count(*) from student;                              #统计表里的记录数量count(*)
select avg(age) from student;                              #取平均值avg(age)
select max(age) from student;                              #取最大值max(age)
select sum(age) from student;                              #总和数sum(age)
select avg(age)/count(*) from student;                     #除法运用
select gender,avg(age) from student group by gender;       #对性别分组group by取各自平均值,注意是取所分组的列或者聚合函数,先分组后进行筛选条件用having,先进行筛选条件后分组可用where
select classid,gender,avg(age) from student group by classid,gender;   #多项分组,空值也会显示
#建议效率法,先分组再过滤
select * from student order by age;                        #根据年龄排序order by,倒序加上desc,    order by desc
select * from student order by age desc,classid;           #优先根据年龄倒数排列,相同值再根据classid的值正排序
select gender,group_concat(name) from student group by gender;  #把gender分组并将对应的值放在一行中
多表查询
子查询
#调用其他子句查询结果
update teachers set age = (select max(age) from student) where id=2;
select * from teachers where age = (select max(age) from student);
联合查询union

竖向合并,需两个表的数据类型相同,且表头类型一样,以防数据不一

#表头用的是第一张表的表头,可改
select stuid,name,age,gender from student union select * from teachers;

#自己跟自己合并会默认去重,可加all取消去重
select * from teachers union all select * from teachers;
交叉连接cross

横向合并,完全组合,不常用

#将student表的每一行都与teacher表的每一行相合并,简单化:11,12,13,21,22,23,31,32,33
select * from student cross join teacher;
内连接inner

挑出两张表中都符合同一条件的值

select * from student inner join teacher on student.teacherid=teacher.tid;

#将重复出现的表名用别名代替,from来自哪个表,students s中间省略不写as,定义别名
select s.stuid,s.name,s.teacherid,t.tid,t.name from students s inner join teacher t on s.teacherid=t.tid;
左右外连接

左外连接left outer

#两张表取左边的全部值和右边所包含的相同左边的值
select * from student s left outer join teacher t on s.teacherid=t.id;

#完全外连接,不取相同部分
select * from student s left outer join teacher t on s.teacherid=t.id where t.tid is null; 

右外连接right outer

#两张表取右边的全部值和左边所包含的相同右边的值
select * from student s right outer join teacher t on s.teacherid=t.id;

#完全外连接,不取相同部分
select * from student s right outer join teacher t on s.teacherid=t.id where s.teacherid is null; 
三张表查询
#取student表的name和scores表的score加courses表的course
select st.name,sc.score,co.course 
from student st inner join scores sc on st.stuid=sc.stuid 
inner join courses co on sc.courseid=co.courseid;
自连接

自己调用自己

#将一张表定义两个别名,然后将两个别名当成两张表来用,函数IFNULL(l.name,'无上级')判断是否为空值,为空则显示'无上级'的内容
select e.name emp_name,IFNULL(l.name,'无上级') leader_name from emp e left join emp l on e.leaderid=l.id;
语句优先级
FROM Clause起始指令 --> WHERE Clause子句 --> GROUP BY分组 --> HAVING Clause筛选条件 -->SELECT查看 --> ORDER BY排序 --> LIMIT限制

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值