使用DQL命令查询数据(二)

SELECT语法

SELECT   [ALL | DISTINCT]
{  * |  table.* | [ table.field1 [ as  alias1] [,table.field2 [as  alias2]][,…]] }
FROM  table_name  [ as  table_ alias  ][left|out|inner  join  table_name2]    #联合查询[ WHERE  … ]     #指定结果需满足的条件[ GROUP BY …]    #指定结果按照哪几个字段来分组[ HAVING …]  #过滤分组的记录必须满足的次要条件[ ORDER BY… ]  #指定查询记录按一个或者多个条件排序[ LIMIT  {   [ offset,] row_count   |   row_count OFFSET offset   }] ;  #指定查询的记录从哪条至哪条
/*
[]   括号代表可选的;                                              {}   括号代表必须的;
#    MySQL语句中的注释符,也可以用   /*该处为注释*/
*/
  • 简单易懂版:
-- 语法:
SELECT 列名 FROM 表名 [ WHERE 条件 ] [ GROUP BY …] [ HAVING …] [ ORDER BY… ][ LIMIT ];

ORDER BY排序

  • ORDER BY排序查询

    • 对SELECT语句查询得到的结果,按某些字段进行排序
    • 与DESC或ASC搭配使用,默认为ASC
-- 示例:
-- 排序
--  order by 字段 asc(升序——默认)|desc(降序)
select * from result
ORDER BY StudentResult desc,ExamDate desc;

MySQL的LIMIT

  • LIMIT [m,]n 或 LIMIT n OFFSET m

    • 限制SELECT返回结果的行数
    • m 制定第一个返回记录行的偏移量
    • n 制定返回记录行的最大数目
  • 注意:m不指定则偏移量为0,从第一条开始返回前n条记录
    LIMIT 常用于分页显示
SELECT * FROM `result` LIMIT 5       -- 返回前5条记录
SELECT * FROM `result` LIMIT 5,10    -- 返回6-15条记录
-- 示例:
-- limit
-- limit [m,]n
-- m 偏移量(从第几条开始)
-- n  最大记录数
select * from result
ORDER BY StudentResult desc,ExamDate desc limit 30,10;

子查询

  • 在查询语句中的WHERE条件子句中,又嵌套了另外一个查询语句

    • 注意: 嵌套查询可由多个子查询组成,求解的方式是由里及外
      子查询返回的结果一般都是集合,故而建议使用 IN 关键字

子查询类型

  • 列中子查询

    • 单列单行
-- 示例:
select a.StudentNo,a.SubjectNo,a.StudentResult,
(select b.SubjectName from `subject` b
where b.SubjectNo=a.SubjectNo) as 课程名称 -- 子查询作为列,返回只能是单列单行
from result a;
  • 表子查询

    • 必须有别名
-- 示例:
select tab.*,d.GradeName from
(
select SubjectName,a.StudentNo,c.GradeId,StudentName,StudentResult from result a LEFT JOIN `subject` b
on a.SubjectNo = b.SubjectNo
LEFT JOIN student c on a.StudentNo = c.StudentNo
) tab   -- 子查询作为表,但必须设置别名
LEFT JOIN grade d on tab.GradeId = d.GradeID;
  • 条件子查询

    • 单行单列
    • 多行单列
-- 示例:
select * from result a where a.StudentResult>80
and a.SubjectNo in -- 单行单列为‘=’,多行多列为‘in’
(
select SubjectNo
from `subject` b
where b.SubjectName = "高等数学-2" or b.SubjectName = "高等数学-1"
);  -- 子查询作为条件

GROUP BY分组

  • 使用GROUP BY关键字对查询结果分组

    • 对所有的数据进行分组统计
    • 分组的依据字段可以有多个,并依次分组
    • 与HAVING结合使用,进行分组后的数据筛选
-- 示例:
-- 按照不同的课程分组,分别算出其平均分、最高分和最低分,
-- 对于低于60分平均分的不予显示
-- 分组一般和聚合函数同时出现
--  GROUP BY 字段
select a.SubjectNo,b.SubjectName,
sum(a.StudentResult) sumScore,
avg(a.StudentResult) avgScore
from result a
LEFT JOIN `subject` b on a.SubjectNo = b.SubjectNo
GROUP BY SubjectNo HAVING avgScore>80 ORDER BY avgScore desc ;

表合并(UNION与UNION ALL)

  • 其使用时必须使各表相对应字段名数量一致,若不足:

    • 当不足的字段为数字类型,则使用 0 代替(定义个别名来使用)

      • count () 方法也可用于替代,但非常不推荐
    • 当不足的字段为字符串类型,则使用 ” “ 代替(定义个别名来使用)
  • 表合并(UNION与UNION ALL)其运行顺序为从上至下,所以应将先显示的表放在上面的顺序
  • 在表合并时,若在其连接表内写入order by 来排序没有意义,最理想的情况是将表合并之后将其用子查询作为表来最后统一进行排序

简单示例:

CREATE TABLE tab
select * from b1
UNION ALL
select * from b2

练习示例:

-- 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
(SELECT a.*,b.s_score as score1,c.c_name  FROM student a
LEFT JOIN score b ON a.s_id = b.s_id and b.c_id = 1
LEFT JOIN course c ON b.c_id = c.c_id
GROUP BY a.s_id ORDER BY score1 desc LIMIT 1,2)
UNION ALL
(SELECT a.*,b.s_score as score2,c.c_name  FROM student a
LEFT JOIN score b ON a.s_id = b.s_id and b.c_id = 2
LEFT JOIN course c ON b.c_id = c.c_id
GROUP BY a.s_id  ORDER BY score2 desc LIMIT 1,2)
UNION ALL
(SELECT a.*,b.s_score as score3,c.c_name FROM student a
LEFT JOIN score b ON a.s_id = b.s_id and b.c_id = 3
LEFT JOIN course c ON b.c_id = c.c_id
GROUP BY a.s_id ORDER BY score3 desc LIMIT 1,2);
  • UNIONUNION ALL的区别:

    • 1、对重复结果的处理:UNION在进行表链接后会去重,UNION All不会。
    • 2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
  • UNION ALL 要比UNION效率高,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。(一般UNION ALL更为常用,因为效率高,且并不应该让union进行去重,最好是UNION ALL返回后可用distinct来去重)

MySQL函数

  • 数学函数
  • 字符串函数

常用的字符串函数

1、LOWER(column|str):将字符串参数值转换为全小写字母后返回

mysql> select lower('SQL Course');
+---------------------+
| lower('SQL Course') |
+---------------------+
| sql course          |
+---------------------+

2、UPPER(column|str):将字符串参数值转换为全大写字母后返回

mysql> select upper('Use MYsql');
+--------------------+
| upper('Use MYsql') |
+--------------------+
| USE MYSQL          |
+--------------------+

3、CONCAT(column|str1, column|str2,…):将多个字符串参数首尾相连后返回

mysql> select concat('My','S','QL');
+-----------------------+
| concat('My','S','QL') |
+-----------------------+
| MySQL                 |
+-----------------------+

如果有任何参数为null,则函数返回null

mysql> select concat('My',null,'QL');
+------------------------+
| concat('My',null,'QL') |
+------------------------+
| NULL                   |
+------------------------+

如果参数是数字,则自动转换为字符串

mysql> select concat(14.3,'mysql');
+----------------------+
| concat(14.3,'mysql') |
+----------------------+
| 14.3mysql            |
+----------------------+

4、CONCAT_WS(separator,str1,str2,…):将多个字符串参数以给定的分隔符separator首尾相连后返回

mysql> select concat_ws(';','First name','Second name','Last name');
+-------------------------------------------------------+
| concat_ws(';','First name','Second name','Last name') |
+-------------------------------------------------------+
| First name;Second name;Last name                      |
+-------------------------------------------------------+

5、LENGTH(str):返回字符串的存储长度

mysql> select length('text'),length('张三');
+----------------+------------------+
| length('text') | length('张三')   |
+----------------+------------------+
|              4 |                6 |
+----------------+------------------+

注意:编码方式不同字符串的存储长度就不一样(‘张三’:utf8是6,gbk是4)

CHAR_LENGTH(str):返回字符串中的字符个数

mysql> select char_length('text'),char_length('你好');
+---------------------+-----------------------+
| char_length('text') | char_length('你好')   |
+---------------------+-----------------------+
|                   4 |                     2 |
+---------------------+-----------------------+

6、FORMAT(X,D[,locale]):以格式‘#,###,###.##’格式化数字X(常用于金钱计数)

D指定小数位数

locale指定国家语言(默认的locale为en_US)

mysql> SELECT format(12332.123456, 4),format(12332.2,0);
+-------------------------+-------------------+
| format(12332.123456, 4) | format(12332.2,0) |
+-------------------------+-------------------+
| 12,332.1235             | 12,332            |
+-------------------------+-------------------+mysql> SELECT format(12332.2,2,'de_DE');
+---------------------------+
| format(12332.2,2,'de_DE') |
+---------------------------+
| 12.332,20                 |
+---------------------------+

参考链接: https://www.cnblogs.com/geaozhang/p/6739303.html

  • 日期和时间函数

常用日期和时间函数

1、获得当前日期时间 函数

获得当前日期+时间(date + time)函数:now(), sysdate() (和now(一样))CURRENT_DATE(), CURRENT_TIME();

select now(),CURRENT_DATE(),CURRENT_TIME();

获得当前时间戳函数: current_timestamp, current_timestamp()

mysql> select current_timestamp, current_timestamp();
+---------------------+---------------------+
| current_timestamp | current_timestamp() |
+---------------------+---------------------+
| 2022-09-02 16:54:28 | 2022-09-02 16:54:28 |
+---------------------+---------------------+
2、日期转换函数、时间转换函数

日期/时间转换为字符串函数:date_format(date,format), time_format(time,format)

mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s'); -- '%Y%m%d%H%i%s'为要得到的格式,输多少返多少
+----------------------------------------------------+
| date_format('2022-09-02 16:54:28', '%Y%m%d%H%i%s') |
+----------------------------------------------------+
| 20220902165428 |
+----------------------------------------------------+
3、日期时间计算函数

为日期增加一个时间间隔:date_add(),减去一个时间间隔:date_sub()

set i = now();
-- interval 为增加
select date_add(i, interval 1 day); -- add 1 day
select date_add(i, interval 1 hour); -- add 1 hour
select date_add(i, interval 1 minute); -- ...
select date_add(i, interval 1 second);
select date_add(i, interval 1 microsecond);
select date_add(i, interval 1 week);
select date_add(i, interval 1 month);
select date_add(i, interval 1 quarter);
select date_add(i, interval 1 year);select date_add(@dt, interval -1 day); -- sub 1 day、

参考链接:https://www.cnblogs.com/ggjucheng/p/3352280.html

  • 系统信息函数

    • select version(); 用于查看数据库版本号

MySQL的统计函数

函数名称 描述
COUNT( ) 返回满足SELECT条件的记录总和数,如 SELECT COUNT()… (不建议使用,效率低)
SUM( ) 返回数字字段或表达式列作统计,返回一列的总和
AVG( ) 通常为数值字段或表达列作统计,返回一列的平均值
MAX( ) 可以为数值字段、字符字段或表达式列作统计,返回最大的值
MIN( ) 可以为数值字段、字符字段或表达式列作统计,返回最小的值
  • 示例:
-- 获得 武松 的考试次数
select b.StudentName,count(b.StudentNo) as countNumber,
sum(a.StudentResult),avg(a.StudentResult),
max(a.StudentResult),min(a.StudentResult)  from result a
LEFT JOIN student b on a.StudentNo=b.StudentNo
where b.StudentName = "武松";

使用DQL命令查询数据(二)相关推荐

  1. 使用DQL命令查询数据(一)

    使用DQL命令查询数据(一) DQL语言 指定查询字段 查询表中所有的数据列结果,采用"*"符号 可指定查询的结果数据列 AS子句 DISTINCT关键字的使用 使用表达式的列 在 ...

  2. 使用DQL命令查询数据一

    一,概念: DQL(Data Query Language 数据查询语言):用于查询数据库对象中所包含的数据. DQL语言主要的语句:SELECT语句. DQL语言是数据库语言中最核心.最重要的语句, ...

  3. 使用DQL命令查询数据(总篇1~3)

    目录 DQL语言 什么是查询 010 司马坡 新疆喀什 S201 SELECT语法 SELECT应用案例 WHERE条件 逻辑运算符 比较运算符 NULL空值条件查询 BETWEEN AND范围查询 ...

  4. 举例:MySQL 使用DQL命令查询数据

    DROP TABLE IF EXISTS `grade`; CREATE TABLE `grade` ( `GradeID` INT(11) NOT NULL AUTO_INCREMENT COMME ...

  5. 35.数据库的DQL的查询数据补充(二)

    一.查询的稳固和学习 下方所有的代码的查询语句,[ ]表示可选择的语句,{ }表示必须写的 | 表示或者的意思 1.查询的先后顺序: select [all默认 | distanct 去重] {* | ...

  6. MySQL 09 DQL → select 初识查询数据和别名的使用

    4.1 DQL → select 查询数据和别名的使用 DQL:Data Query LANGUAGE(数据查询语言) 所有的查询操作都用它 select 简单的查询,无论多么复杂的查询它 都可以做到 ...

  7. mysqldump命令备份数据 mysql备份数据

    一. mysqldump命令备份数据 二. mysqldump常用操作示例 三. 还原 MySQL 备份内容 1.编写BASH维护固定数量备份文件 2.使用crontab定期执行备份脚本 2.1 cr ...

  8. MySQL中DQL查询数据——(四)

    MySQL中DQL查询数据--(四) 本篇博客,是个人根据 西部开源-秦疆老师的教学视频整理出的笔记,想看最详细的教学笔记和提供的SQL语句素材,请点击如下链接: https://www.cnblog ...

  9. 【FFmpeg】ffmpeg 命令查询二 ( 比特流过滤器 | 可用协议 | 过滤器 | 像素格式 | 标准声道布局 | 音频采样格式 | 颜色名称 )

    FFmpeg 系列文章目录 [FFmpeg]Windows 搭建 FFmpeg 命令行运行环境 [FFmpeg]FFmpeg 相关术语简介 ( 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 ...

最新文章

  1. java丑数算法_LintCode Java算法练习(4)-----丑数II
  2. 《赤壁》:吴宇森恶搞三国的经过
  3. 手写自己的MyBatis框架-1.0 的不足
  4. 中国蚁剑 代码解压出错:【object Object】解决方法
  5. P3368-Frequent values【线段树】
  6. 【转】BASE64编码规则
  7. Express与传统Web应用(服务端渲染、art-template模板引擎、配置静态资源托管)
  8. 带进度条的文件复制。
  9. opencv学习笔记05
  10. K-means均值聚类算法的原理与实现
  11. linux安装vmware出现Gtk-Message: Failed to load module pk-gtk-module canberra-gtk-module的解决方法...
  12. 【Error】pwntools 解决安装terminator后 unable to find a shell
  13. sem常用的数据分析方法有哪些
  14. 只要能言之有理,持之有据,则可立于讲台
  15. 企业级服务器硬盘和,企业级硬盘与nas硬盘区别是什么,性能哪个好
  16. 国产安卓和原生android,定制安卓和原生Android到底有哪些不同?真相了!
  17. 怎样把计算机里的W0rd放到电脑桌面,电脑怎么把Word图标放到桌面?把Word图标放到桌面的设置方法...
  18. MVP+Dragger2+Rxjava2+Retrofit+OKhttp进行开发。
  19. String字符串转JSON对象(JSON的依赖)
  20. 海思3559:百兆网口的配置

热门文章

  1. tkinter tkinter 制作屏保制作屏保
  2. 如何在Windows 8或10上获取经典风格的主题
  3. AAC音频文件怎么转换格式
  4. 中国非接触温度传感器市场现状研究分析与发展前景预测报告(2022)
  5. windows安装 node-sass sass-loader
  6. 对球面线性插值的理解
  7. 在Linux上部署的项目(iwebshop) 不能打开界面
  8. 院内集成平台项目复盘
  9. 和口袋购物王珂聊移动电商的未来
  10. 兄弟2560打印机提示DRUM!