数据库
首页 > 数据库> > MySQL之DQL(数据查询语言)-常见关键字

MySQL之DQL(数据查询语言)-常见关键字

作者:互联网

目录

一、简介

   DDL
****

CREATE TABLE `tb_student` (
  `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `class_code` int NOT NULL DEFAULT '0' COMMENT '所属班级编号',
  `user_code` int unsigned NOT NULL DEFAULT '0' COMMENT '学生编号',
  `user_name` varchar(10) NOT NULL DEFAULT '' COMMENT '学生姓名',
  `gender` char(1) NOT NULL DEFAULT '男' COMMENT '性别',
  `birthday` date NOT NULL DEFAULT '1970-01-01' COMMENT '生日',
  `home_address` varchar(100) NOT NULL DEFAULT '' COMMENT '家庭住址',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_class_user_code` (`class_code`,`user_code`),
  UNIQUE KEY `uk_user_code` (`user_code`),
  KEY `idx_class_code` (`class_code`)
) ENGINE=InnoDB AUTO_INCREMENT=1081 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学生信息表';

我们这里有一个表总共有18个班,一个班60个学生。

二、SELECT

   SELECT 就是选择的意思,此处一般是结果集中的列,如果有多列就用逗号分隔,查询列表的最后一个字段后没有逗号。(英文符号的逗号)

2.1、查询所有

select * from tb_student;

  不推荐上面这种写法,因为可能实际中会有很多数据的冗余,造成IO压力,推荐列出指定的列,如:

select id,class_code,user_code,user_name,gender,birthday,home_address,create_time,update_time from tb_student;

2.2、查询指定的列

  有时我们并不需要那么多的信息,比如只想要学号,或者只要基本的信息

#只查学号列
select user_code from tb_student;
#查询学生基本的信息
select class_code,user_code,user_name,gender,birthday,home_address from tb_student;

2.3、别名

  有时你可能还是看不懂,就给列取个别名mysql里可以直接在列名后面再写一个名字,或者使用AS。

select 
	class_code as '班级编号',
	user_code as '学号',
	user_name  as '姓名',
	birthday as '出生年月',
	home_address as '家庭地址' 
from tb_student;
+--------------+--------+-----------+--------------+------------------------------------------------------------+
| 班级编号     | 学号   | 姓名      | 出生年月     | 家庭地址                                                      |
+--------------+--------+-----------+--------------+------------------------------------------------------------+
|         3001 |   6080 | 陈晓畅    | 2009-03-07   | 盐田区田心东路9号                                            |
|         3001 |   6079 | 康又蓝    | 2009-11-30   | 福田区农林路1号                                              |
|         3001 |   6078 | 蒋芸溪    | 2009-09-07   | 福田区皇岗路莲花一村华富街道办事处综合楼                       |
|         3001 |   6077 | 王淑慧    | 2009-02-27   | 盐田区东海四街2号盐田街道办事处213室                          |
|         3001 |   6076 | 朱米琪    | 2009-07-26   | 光明区新湖街道旧围1号                                        |
+--------------+--------+-----------+--------------+------------------------------------------------------------+

2.4、其他特别使用

  我们还可以用在一些特定的函数或者常量的处理

select user(), now(), current_date(), current_time(), current_timestamp();
+----------------+---------------------+----------------+----------------+---------------------+
| user()         | now()               | current_date() | current_time() | current_timestamp() |
+----------------+---------------------+----------------+----------------+---------------------+
| root@localhost | 2022-03-04 06:06:12 | 2022-03-04     | 06:06:12       | 2022-03-04 06:06:12 |
+----------------+---------------------+----------------+----------------+---------------------+

  有时导出数据,可能需要固定的一列,就可以类似的用法

select user_name as '姓名','学生' as '类型' from tb_student;
+-----------+--------+
| 姓名      | 类型   |
+-----------+--------+
| 陈晓畅    | 学生   |
| 康又蓝    | 学生   |
| 蒋芸溪    | 学生   |
+-----------+--------+

三、FROM

   FROM 一般就是从哪个表或者结果集进行操作

3.1、表

#从学生表中查询
select user_code,user_name from tb_student;

3.2、结果集

  这种情况的使用场景是,其他表得出一个结果,然后再对结果集进行过滤。

#字段1  和  字段2 必须是 查询语句的查出来的列名
select 字段1,字段2 from (子查询语句) as 结果集的别名;

四、WHERE

   WHERE 就是一个条件过滤,比如要查询,修改或者删除数据,不加条件就是全表操作了。因为有时我们只是操作我们需要的数据,所以这个 WHERE 就是我们的条件了。

#从学生表中查询学生编号为6080的学生姓名
select user_name from tb_student where user_code=6080;

   WHERE 不仅可以用在查询,还可以用在修改或删除的语句中。

#更新学生编号为6080学生的生日为2020-12-12
update tb_student set birthday='2020-12-12' where user_code=6080;
#删除学生编号为6080学生
delete from tb_student where user_code=6080;

五、COUNT

   COUNT 可以用来统计符合条件的记录数。

#使用count(*)查询学生表的学生的总数
select count(*) from tb_student;

或者使用

#使用count(非空列)查询学生表的学生的总数
select count(user_code) from tb_student;

  使用count(*),count(列),这两者有区别的,count(*)是统计所有行记录,count(列)一般是非空列的记录,假设有5个学生,有4个学生填了生日,有一个为空,如果这时按照生日这列去统计就结果就是4了,但是如果你按照唯一编号去统计就是5了

六、LIMIT

  数据库有很多记录,有时我们可能只需要指定的几条, LIMIT 就是限制查询结果的行数。

6.1、LIMIT m

  查询 m 条记录

#查询学生表的前5条记录
select user_code, user_name from tb_student limit 5;
+-----------+-----------+
| user_code | user_name |
+-----------+-----------+
|      6080 | 陈晓畅    |
|      6079 | 康又蓝    |
|      6078 | 蒋芸溪    |
|      6077 | 王淑慧    |
|      6076 | 朱米琪    |
+-----------+-----------+

6.2、LIMIT n,m

  查询 m 条记录,但是索引是从 n 开始(数据库查询结果索引是从0开始)

#查询学生表记录,从1第一条开始(索引是0),查询三条
select user_code, user_name from tb_student limit 1,3;
+------------+-----------+
| class_code | user_name |
+------------+-----------+
|       3001 | 康又蓝    |
|       3001 | 蒋芸溪    |
|       3001 | 王淑慧    |
+------------+-----------+

七、LIKE

7.1、LIKE中的( % )

  LIKE中的( % )表示的是任意的意思,可以前面任意,后面任意,或者前后都任意(分别如下):

#比如我们查询姓“张”的学生的学号和姓名
select user_code, user_name from tb_student where user_name like '张%';
+-----------+-----------+
| user_code | user_name |
+-----------+-----------+
|      6023 | 张雪珍    |
|      5690 | 张梦露    |
|      5542 | 张悦和    |
|      5467 | 张妙意    |
|      5404 | 张香岚    |
|      5298 | 张娇洁    |
|      5255 | 张水蓉    |
+-----------+-----------+
#比如我们查询叫“雨文”的学生的学号和姓名
select user_code, user_name from tb_student where user_name like '%雨文';
+-----------+-----------+
| user_code | user_name |
+-----------+-----------+
|      6074 | 余雨文    |
|      5200 | 刘雨文    |
+-----------+-----------+
#比如我们查询名字中含有“雨”的学生的学号和姓名
select user_code, user_name from tb_student where user_name like '%雨%';
+-----------+-----------+
| user_code | user_name |
+-----------+-----------+
|      6074 | 余雨文    |
|      5942 | 崔昕雨    |
|      5850 | 丁小雨    |
|      5814 | 丁雨灵    |
|      5695 | 曹雨竹    |
|      5651 | 钱雨兰    |
|      5639 | 田雨旋    |
|      5521 | 康雨彤    |
|      5478 | 韩新雨    |
|      5368 | 陆雨柏    |
|      5341 | 苏雨真    |
|      5331 | 胡雨琴    |
|      5263 | 沈甘雨    |
|      5244 | 戴雨双    |
|      5216 | 邹雨筠    |
|      5200 | 刘雨文    |
|      5078 | 赵雨云    |
+-----------+-----------+

7.2、LIKE中的( _

  LIKE中的( _ )表示的是任意一位的意思,只表示一位,和 % 有区别,如果想要表示任意两位就两个下划线。

#比如我们查询名字中第三个字是“雨”的学生的学号和姓名
select user_code, user_name from tb_student where user_name like '__雨';
+-----------+-----------+
| user_code | user_name |
+-----------+-----------+
|      5942 | 崔昕雨    |
|      5850 | 丁小雨    |
|      5478 | 韩新雨    |
|      5263 | 沈甘雨    |
+-----------+-----------+
#比如我们查询名字中第二个字是“雨”的学生的学号和姓名
select user_code, user_name from tb_student where user_name like '_雨_';
+-----------+-----------+
| user_code | user_name |
+-----------+-----------+
|      6074 | 余雨文    |
|      5814 | 丁雨灵    |
|      5695 | 曹雨竹    |
|      5651 | 钱雨兰    |
|      5639 | 田雨旋    |
|      5521 | 康雨彤    |
|      5368 | 陆雨柏    |
|      5341 | 苏雨真    |
|      5331 | 胡雨琴    |
|      5244 | 戴雨双    |
|      5216 | 邹雨筠    |
|      5200 | 刘雨文    |
|      5078 | 赵雨云    |
+-----------+-----------+

7.3、LIKE混合使用

#家庭地址第四到第六位是"观光路"的学生的学号,姓名和具体地址
SELECT user_code, user_name,home_address FROM tb_student where home_address like '___观光路%';
+------------+-----------+---------------------------+
| class_code | user_name | home_address              |
+------------+-----------+---------------------------+
|       6075 | 史采枫    | 龙华区观光路1199号         |
|       6059 | 周虹颖    | 龙华区观光路1446号         |
|       6057 | 卢友桃    | 南山区观光路65号           |
|       5979 | 梁宛亦    | 龙岗区观光路               |
+------------+-----------+---------------------------+

八、IN 和NOT IN

8.1、IN

   IN 表示在指定的值中,如果是字符串则用引号,一般的写法是:

in(值1,值2,值3,...,值n)
#查询学号为3007,3008,3015学生的姓名和住址
SELECT user_name,home_address FROM tb_student where user_code in(3007,3008,3015);
+-----------+----------------------------------------------+
| user_name | home_address                                 |
+-----------+----------------------------------------------+
| 陈绮烟    | 盐田区大梅沙盐葵路88号                        |
| 杜晓蕾    | 福田区松岭路56号                              |
| 余施诗    | 罗湖区东湖路92号东湖街道办事处                 |
+-----------+----------------------------------------------+

8.2、NOT IN

  和 IN 差不多,只是前面多个 NOT 一般的写法是:

not in(值1,值2,值3,...,值n)
#查询三班(3001)学号不是3007,3008,3015学生的姓名和住址
SELECT class_code,user_code, user_name FROM tb_student where class_code=3001 and user_code not in(3007,3008,3015);
+------------+-----------+-----------+
| class_code | user_code | user_name |
+------------+-----------+-----------+
|       3001 |      6080 | 陈晓畅    |
|       3001 |      6079 | 康又蓝    |
|       3001 |      6078 | 蒋芸溪    |
|       3001 |      6077 | 王淑慧    |
|       3001 |      6076 | 朱米琪    |
|       3001 |      6075 | 史采枫    |
|       3001 |      6074 | 余雨文    |
|       3001 |      6073 | 尹滢渟    |
|       3001 |      6072 | 谢骊艳    |
|       3001 |      6071 | 吴恬美    |
|       3001 |      6070 | 唐静珊    |
|       3001 |      6069 | 宋芳蕙    |
|       3001 |      6068 | 邹蓉城    |
|       3001 |      6067 | 萧谷蓝    |
|       3001 |      6066 | 罗香之    |
|       3001 |      6065 | 崔愉心    |
|       3001 |      6064 | 傅燕楠    |
|       3001 |      6063 | 高北辰    |
|       3001 |      6062 | 郑雪巧    |
|       3001 |      6061 | 孔韵诗    |
|       3001 |      6060 | 唐涵易    |
|       3001 |      6059 | 周虹颖    |
|       3001 |      6058 | 杜半雪    |
|       3001 |      6057 | 卢友桃    |
|       3001 |      6056 | 魏舒兰    |
|       3001 |      6055 | 王从霜    |
|       3001 |      6054 | 薛秀曼    |
|       3001 |      6053 | 徐初阳    |
|       3001 |      6052 | 郝灵寒    |
|       3001 |      6051 | 郭艳蕙    |
|       3001 |      6050 | 潘安春    |
|       3001 |      6049 | 罗惜文    |
|       3001 |      6048 | 顾初雪    |
|       3001 |      6047 | 余天欣    |
|       3001 |      6046 | 陆静姝    |
|       3001 |      6045 | 姜傲南    |
|       3001 |      6044 | 冯代柔    |
|       3001 |      6043 | 黄青柏    |
|       3001 |      6042 | 薛夏青    |
|       3001 |      6041 | 邱畅然    |
|       3001 |      6040 | 姜月明    |
|       3001 |      6039 | 洪敏叡    |
|       3001 |      6038 | 袁璇玑    |
|       3001 |      6037 | 郭忆灵    |
|       3001 |      6036 | 蔡斯乔    |
|       3001 |      6035 | 韦醉柳    |
|       3001 |      6034 | 於南莲    |
|       3001 |      6033 | 侯姣丽    |
|       3001 |      6032 | 石忆秋    |
|       3001 |      6031 | 唐欣悦    |
|       3001 |      6030 | 侯菱凡    |
|       3001 |      6029 | 郭以南    |
|       3001 |      6028 | 潘思柔    |
|       3001 |      6027 | 孙冰蓝    |
|       3001 |      6026 | 沈寄瑶    |
|       3001 |      6025 | 袁娟秀    |
|       3001 |      6024 | 於晓丝    |
|       3001 |      6023 | 张雪珍    |
|       3001 |      6022 | 石清妙    |
|       3001 |      6021 | 吴娴静    |
+------------+-----------+-----------+

九、BETWEEN AND

  之前 IN 或者 NOT IN 都是具体的值,其实还可以指定范围,比如我们说的 BETWEEN AND ,大概语法是

between 开始区间 and 结束区间
#查询在2009-02-17到2009-02-22出生的学生的信息
SELECT user_code, user_name,birthday FROM tb_student where birthday between '2009-02-17' and '2009-02-22';
+-----------+-----------+------------+
| user_code | user_name | birthday   |
+-----------+-----------+------------+
|      6071 | 吴恬美    | 2009-02-17 |
|      6032 | 石忆秋    | 2009-02-17 |
|      6013 | 董莺韵    | 2009-02-22 |
|      5858 | 刘木兰    | 2009-02-19 |
+-----------+-----------+------------+

  从结果我们也知道, BETWEEN AND 的结果是 包含开始区间和结束区间的

十、GROUP BY

#按班级统计每班的人数
select class_code,count(*) from tb_student group by class_code;
+------------+----------+
| class_code | count(*) |
+------------+----------+
|       3001 |       60 |
|       3002 |       60 |
|       3003 |       60 |
|       3004 |       60 |
|       3005 |       60 |
|       3006 |       60 |
|       3007 |       60 |
|       3008 |       60 |
|       3009 |       60 |
|       3010 |       60 |
|       3011 |       60 |
|       3012 |       60 |
|       3013 |       60 |
|       3014 |       60 |
|       3015 |       60 |
|       3016 |       60 |
|       3017 |       60 |
|       3018 |       60 |
+------------+----------+

  需要注意的是,如果你使用 GROUP BY 进行分组,除了分组的字段,其他的字段,你就不能进行选取了。

十一、HAVING

HAVING 一般和 GROUP BY 使用居多,对分组后的数据进行过滤

#按班级统计每班的人数,并筛选出大于60人的班级
select class_code,count(*) as num from tb_student group by class_code having num > 60;
Empty set (0.00 sec)

十二、ORDER BY

12.1 升序

ORDER BY 就是排序,可以是升序,或者降序,默认是升序。

#比如按出生日期查询最大的5名学生的姓名和生日
select user_name,birthday from tb_student order by birthday asc limit 5;
+-----------+------------+
| user_name | birthday   |
+-----------+------------+
| 邓闲华    | 2007-01-06 |
| 夏芷雁    | 2007-01-07 |
| 崔晓青    | 2007-01-10 |
| 汪易松    | 2007-01-10 |
| 王绿凝    | 2007-01-11 |
+-----------+------------+

12.2 降序

#比如按出生日期查询最小的5名学生的姓名和生日
select user_name,birthday from tb_student order by birthday desc limit 3;
+-----------+------------+
| user_name | birthday   |
+-----------+------------+
| 傅紫文    | 2010-12-23 |
| 康子薇    | 2010-12-22 |
| 郭飞柏    | 2010-12-21 |
| 金丹烟    | 2010-12-19 |
| 段贞婉    | 2010-12-19 |
+-----------+------------+

12.3 多字段排序

#比如按出生日期查询10名学生的姓名、生日和学号,要求按照生日升序,学号降序
select user_name,birthday,user_code from tb_student order by birthday asc, user_code desc limit 10;
+-----------+------------+-----------+
| user_name | birthday   | user_code |
+-----------+------------+-----------+
| 邓闲华    | 2007-01-06 |      5356 |
| 夏芷雁    | 2007-01-07 |      5161 |
| 汪易松    | 2007-01-10 |      5106 |
| 崔晓青    | 2007-01-10 |      5090 |
| 范玉琲    | 2007-01-11 |      5338 |
| 王绿凝    | 2007-01-11 |      5247 |
| 赵流逸    | 2007-01-11 |      5227 |
| 杜觅双    | 2007-01-14 |      5317 |
| 雷慧月    | 2007-01-16 |      5279 |
| 谭代曼    | 2007-01-18 |      5184 |
+-----------+------------+-----------+

可以看到生日是升序的,生日相同的情况下,学号是降序的。

十三、DISTINCT

#查询学号为5781和5546的学生的姓名
select user_name from tb_student where user_code in(5781,5546);
+-----------+
| user_name |
+-----------+
| 夏晶晶    |
| 夏晶晶    |
+-----------+
#查询学号为5781和5546的学生的姓名
select distinct user_name from tb_student where user_code in(5781,5546);
+-----------+
| user_name |
+-----------+
| 夏晶晶    |
+-----------+

需要注意的是,如果你选择的是多列,比如你是

select distinct user_name,user_code from tb_student where user_code in(5781,5546);

那么它就是按照user_name+user_code 这个组合是否重复来处理的
±----------±----------+
| user_name | user_code |
±----------±----------+
| 夏晶晶 | 5546 |
| 夏晶晶 | 5781 |
±----------±----------+

标签:code,name,3001,user,student,MySQL,DQL,查询语言,tb
来源: https://blog.csdn.net/Alian_1223/article/details/123156745