【MySQL】数据查询——DQL基本数据库查询

目录

  • 查询
  • 语法
    • 1. 查询表中所有的数据行和列,采用“*”符号
    • 2. 查询表中指定列的数据。
    • 3. 在查询中使用别名,使用“AS”关键字。
    • 4. 在查询中使用常量列:如果需要将一些常量的默认信息添加到输出结果中,以方便统计或计算。可以使用常量列
    • 5. DISTINCT关键字的使用:去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条
  • WHERE条件
  • NULL空值条件查询
    • 语法
  • BETWEEN AND范围查询
    • 语法
  • LIKE模糊查询
  • 使用IN进行范围查询
    • 语法
  • 排序
  • 分页
  • 分组查询
  • 子查询
    • 语法
    • 案例
    • IN子查询
      • 语法
      • SQL示例
    • 综合案例
    • EXISTS 子查询
      • 语法
      • SQL示例

查询

在这里插入图片描述

  1. 查询产生一个虚拟表。
  2. 看到的是表形式显示的结果,但结果并不真正存储。
  3. 每次执行查询只是从数据表中提取数据,并按照表格的形式显示出来。

语法

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   }] ;  #分页查询
  1. 括号代表可选的;
  2. { } 括号代表必须的;
  3. #MySQL语句中的注释符,也可以用 /**/

1. 查询表中所有的数据行和列,采用“*”符号

SELECT * FROM 表名;

SELECT   *   FROM student;

2. 查询表中指定列的数据。

SELECT 字段名1,字段名2,…字段名n FROM 表名;

SELECT  studentno, studentname, phone FROM student;

3. 在查询中使用别名,使用“AS”关键字。

  • 可给数据列取一个新别名
  • 可给表取一个新别名
  • 可把经计算或总结的结果用另外一个新名称来代替

SELECT field1 [ AS alias1] [,field2 [AS alias2]] […,fieldn [AS aliasn]]
FROM table_name [ AS table_ alias ];

SELECT   studentno   AS “学号”   FROM  student;
SELECT   s.studentno   FROM   student AS  s;
SELECT CONCAT("S",studentno) FROM student;

4. 在查询中使用常量列:如果需要将一些常量的默认信息添加到输出结果中,以方便统计或计算。可以使用常量列

SELECT  studentno AS “学号”, studentname AS “姓名”,phone AS “手机号”,address AS “家庭住址”,‘郑州’ AS “市区”FROM student;

5. DISTINCT关键字的使用:去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条

SELECT DISTINCT field1 [ AS alias1] [,field2 [AS alias2]] […,fieldn [AS aliasn]] FROM table_name [ AS table_ alias ];

#查询学生表中所包含的年级IDSELECT   DISTINCT  gradeid  FROM  student;

WHERE条件

  • WHERE条件:用于检索数据表中符合条件的记录
  • 搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假
  • 搜索条件的组成
    • 逻辑操作符
      在这里插入图片描述

    • 比较操作符
      在这里插入图片描述数值数据类型的记录之间才能进行算术运算
      相同数据类型的数据之间才能进行比较

NULL空值条件查询

  • NULL代表“无值”
  • 区别于零值0和空符串“”
  • 只能出现在定义允许为NULL的字段
  • 须使用 IS NULL 或 IS NOT NULL 比较操作符去比较

语法

SELECT 字段1,字段2 ,…FROM 表名 WHERE 字段x IS NULL

BETWEEN AND范围查询

  • BETWEEN AND范围查询:根据一个范围值来检索
  • 等同于 >= 和 <= 联合使用

语法

SELECT 字段1,字段2 ,…FROM 表名 WHERE 字段x BETWEEN 值1 AND 值2

#查询课程表中课时在110和120之间的所有记录SELECT * FROM subject WHERE classhour BETWEEN  110 AND 120;
#等同于:SELECT * FROM subject WHERE classhour >= 110 AND classhour <=120;

LIKE模糊查询

  • 在WHERE子句中,使用LIKE关键字进行模糊查询
  • 与“%”一起使用,表示匹配0或任意多个字符
  • 与“_”一起使用,表示匹配单个字符
#查询包含“数学”的所有课程
SELECT   *  FROM subject WHERE SubjectName  LIKE  "%数学%";
#查询所有姓名为“李**”三个字的学生信息
SELECT  StudentNo,StudentName FROM student  
WHERE StudentName LIKE "李__";

使用IN进行范围查询

  • 在WHERE子句中使用IN进行范围查询
  • 查询的字段x的值,至少与括号中的一个值相同
  • 多个值之间用英文逗号隔开

语法

SELECT 字段1,字段2 ,…FROM 表名 WHERE 字段x IN ( 值1,值2,值3…值n)

SELECT  *  FROM  subject  where    ClassHour = 100  OR ClassHour =110 OR ClassHour  = 120;  #普通处理方式
SELECT  *  FROM  subject  where ClassHour  IN ( 100, 110,120 );
#使用IN进行查询方式,更为简洁,效率更高

排序

  • ORDER BY子句:实现按一定顺序显示查询结果。
  • 排序可以是升序(ASC)或者降序(DESC),如果不指定ASC或DESC,结果集默认按ASC升序排序
#把成绩都降低10%后加5分,再查询及格成绩,并按照成绩从高到低排序。
SELECT studentno AS 学生编号,(studentresult*0.9+5 ) AS 综合成绩
FROM `result`
WHERE (`studentresult`*0.9+5) >=60
ORDER BY studentresult DESC;#把成绩都降低10%后加5分,再查询及格成绩,并按照成绩从高到低排序,如果成绩
#相同,再按照课程编号进行排序。
SELECT studentno AS 学生编号,(studentresult*0.9+5 ) AS 综合成绩
FROM `result`
WHERE (`studentresult`*0.9+5) >=60
ORDER BY studentresult DESC,subjectno;

分页

LIMIT 子句:MySQL查询语句中使用LIMIT子句限制结果集

  • 应用1:限制显示的结果集的行数(小说排行榜 新闻只显示最新的5条)
#查询课程编号为1的,考试日期为2019年的考试的前5名同学的学号和成绩
SELECT studentno,studentresult 
FROM result
WHERE subjectno=1 AND YEAR(examdate)=2019
ORDER BY studentresult DESC
LIMIT 5
  • 应用2:分页查询(分页显示数据)
    limit后跟连个数字时,第一个表示偏移量(索引),第二个显示条数
    #查询学生表的学号、姓名、电话 ,每页显示2条记录
    #第一条记录的偏移量为0
    #第一页
    #偏移量 0 1
SELECT studentno,studentname,phone FROM student
LIMIT 0,2

分组查询

  • [ GROUP BY …] #指定结果按照哪几个字段来分组
  • [ HAVING …] #过滤分组的记录必须满足的次要条件
  • 对所有的数据进行分组统计
  • 分组的依据字段可以有多个,并依次分组
  • 与HAVING结合使用,进行分组后的数据筛选
  • GROUP BY子句经常和聚合函数结合使用完成分组统计功能
#查询每门课程及格总人数和及格学生的平均分
SELECT SUBJECTNO,COUNT(1),AVG(STUDENTRESULT) FROM RESULT 
WHERE STUDENTRESULT >= 60
GROUP BY SUBJECTNO;#查询每门课程及格总人数和及格平均分在80分以上的记录
SELECT SUBJECTNO,COUNT(1),AVG(STUDENTRESULT) FROM RESULT 
WHERE STUDENTRESULT >= 60
GROUP BY SUBJECTNO
HAVING AVG(STUDENTRESULT) > 80;#查询每门课程的平均分,并按照降序排列
SELECT SUBJECTNO,AVG(STUDENTRESULT) AVG FROM RESULT
GROUP BY SUBJECTNO
ORDER BY AVG DESC;#查询每个学生参加的所有考试的总分,并按照降序排列
SELECT STUDENTNO,SUM(STUDENTRESULT) SUM FROM RESULT
GROUP BY STUDENTNO
ORDER BY SUM DESC;#查询每个年级学生的平均年龄
SELECT GRADEID,AVG(YEAR(NOW())-YEAR(BORNDATE)) FROM STUDENT 
GROUP BY GRADEID;#查询考试不及格的学生学号和不及格的次数
SELECT STUDENTNO,COUNT(STUDENTRESULT) FROM RESULT
WHERE STUDENTRESULT < 60
GROUP BY STUDENTNO;

子查询

子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询。

语法

SELECT … FROM 表名 WHERE 字段X 比较运算符(子查询)

  • 习惯上,外层查询称为父查询,圆括号中嵌入的查询称为子查询。
  • 执行SQL语句时,先执行子查询,返回所有来自子查询的结果,再执行外围的父查询,返回查询的最终结果(即求解方式为由里及外)。
  • 将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个(否则会出现提示信息:错误代号1242 Subquery returns more than 1 row)。

案例

编写SQL语句,查看年龄比“李斯文”小的学生,要求显示这些学生的信息(学号、姓名、出生日期)

SELECT studentno, studentname,borndate FROM student WHERE borndate > 
(SELECT borndate FROM student WHERE studentname= '李斯文’);

IN子查询

查询课程名称为”JavaOOP”且考试分数大于60分的学生信息(学号、姓名和联系电话)。

  • IN后面的子查询可以返回多条记录。
  • 常用IN替换等于(=)的子查询。

语法

SELECT … FROM 表名 WHERE 字段X IN(子查询)

SQL示例

#查询课程名称为”JavaOOP”且考试分数大于60分的学生信息(学号、姓名和联系电话)。
SELECT studentno,studentname,phone FROM student  WHERE studentno IN
(SELECT studentno FROM result WHERE studentresult>60 AND 
subjectno=(SELECT subjectno FROM `subject`WHERE subjectname='JAVAOOP'))

综合案例

#查询年级名称为"大一"开设的课程信息(课程编号、课程名称、课时数)
SELECT SUBJECTNO,SUBJECTNAME,CLASSHOUR FROM `SUBJECT`
WHERE GRADEID = (SELECT GRADEID FROM GRADE WHERE GRADENAME='大一');#查询课程名称为”高等数学-1”最近一次考试的学生信息(学号、姓名和联系电话)。
SELECT STUDENTNO,STUDENTNAME,PHONE FROM STUDENT
WHERE STUDENTNO IN (SELECT STUDENTNO FROM RESULT WHERE SUBJECTNO = (SELECT SUBJECTNO FROM `SUBJECT` WHERE SUBJECTNAME = '高等数学-1') AND EXAMDATE = (SELECT MAX(EXAMDATE) FROM RESULTWHERE SUBJECTNO = (SELECT SUBJECTNO FROM `SUBJECT` WHERE SUBJECTNAME = '高等数学-1'))
);#查询没有参加课程名称为”高等数学-1”最近一次考试的学生信息(学号、姓名和联系电话)。
SELECT STUDENTNO,STUDENTNAME,PHONE FROM STUDENT
WHERE STUDENTNO NOT IN (SELECT STUDENTNO FROM RESULT WHERE SUBJECTNO = (SELECT SUBJECTNO FROM `SUBJECT` WHERE SUBJECTNAME = '高等数学-1') AND EXAMDATE = (SELECT MAX(EXAMDATE) FROM RESULTWHERE SUBJECTNO = (SELECT SUBJECTNO FROM `SUBJECT` WHERE SUBJECTNAME = '高等数学-1'))
);

EXISTS 子查询

EXISTS 子查询:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”。

  • 子查询有返回结果: EXISTS子查询结果为TRUE,执行外层查询;
  • 子查询无返回结果: EXISTS子查询结果为FALSE, 外层查询不执行;

语法

SELECT …… FROM 表名 WHERE EXISTS(子查询);

SQL示例

# 检查“Logic Java”课程最近一次考试成绩,如果有 80分以上的成绩,显示分数排在前5名的学员学号和分数
SELECT sujectNo FROM `subjectl` WHERE subjectName='Logic Java'
SELECT MAX(examDate) FROM result WHERE subjectNo=(SELECT subjectNo FROM`subject` WHERE subjectName='Logic Java')
SELECT studentNO,studentResult
FROM result
WHERE EXISTS(SELECT * FROM resultWHERE studentResult>80AND subjectNo=(SELECT subjectNO FROM `subject` WHERE subjectName='Logic Java')AND  examDate=(SELECT MAX(examDate) FROM result WHERE subjectNo=(SELECT subjectNO FROM `subject`WHERE subjectName='Logic Java'))
)
AND subjectNo=(SELECT subjectNO FROM `subject`WHERE subjectName='Logic Java')
AND  examDate=(SELECT MAX(examDate) FROM result WHERE subjectNo=(SELECT subjectNO FROM `subject`WHERE subjectName='Logic Java'))
ORDER BY studentResult DESC
LIMIT 5# 检查“Logic Java”课程最近一次考试成绩,如果全部未通过考试(60分及格),认为本次考试偏难,计算的该次考试平均分加5分
SELECT  AVG(studentResult)+5
FROM result
WHERE subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')
AND examDate=(SELECT MAX(examDate) FROM result WHERE subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java'))
AND NOT EXISTS(SELECT * FROM resultWHERE subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')AND examDate=(SELECT MAX(examDate) FROM result WHERE subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java'))AND studentResult>100
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/502629.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

备战蓝桥杯Day21 - 堆排序的内置模块+topk问题

一、内置模块 在python中&#xff0c;堆排序已经设置好了内置模块&#xff0c;不想自己写的话可以使用内置模块&#xff0c;真的很方便&#xff0c;但是堆排序算法的底层逻辑最好还是要了解并掌握一下的。 使用heapq模块的heapify()函数将列表转换为堆&#xff0c;然后使用he…

Highest Price in Supply Chain (25)

1、题目&#xff1a; A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;经销商&#xff09;, and suppliers&#xff08;供应商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting …

Spring MVC 和 Spring Cloud Gateway不兼容性问题

当启动SpringCloudGateway网关服务的时候&#xff0c;没注意好依赖问题&#xff0c;出现了这个问题&#xff1a; Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway. 解决办法就是&#xff1a;删除SpringMVC的依赖&#xff0c;即下列依赖。 &…

蓝桥杯练习系统(算法训练)ALGO-996 车的放置

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 在一个n*n的棋盘中&#xff0c;每个格子中至多放置一个车&#xff0c;且要保证任何两个车都不能相互攻击&#xff0c;有多少…

深入探究Python多进程编程:Multiprocessing模块基础与实战【第98篇—Multiprocessing模块】

深入探究Python多进程编程&#xff1a;Multiprocessing模块基础与实战 在Python编程中&#xff0c;多进程处理是一项关键的技术&#xff0c;特别是在需要处理大规模数据或执行耗时任务时。为了充分利用多核处理器的优势&#xff0c;Python提供了multiprocessing模块&#xff0…

MYSQL02高级_目录结构、默认数据库、表文件、系统独立表空间

文章目录 ①. MySQL目录结构②. 查看默认数据库③. MYSQL5.7和8表文件③. 系统、独立表空间 ①. MySQL目录结构 ①. 如何查看关联mysql目录 [rootmysql8 ~]# find / -name mysql /var/lib/mysql /var/lib/mysql/mysql /etc/selinux/targeted/tmp/modules/100/mysql /etc/seli…

2024年新提出的算法|LEA爱情进化算法(Love Evolution Algorithm)

Love Evolution Algorithm: a stimulus–value–role theory-inspired evolutionary algorithm for global optimization 爱情进化算法Love Evolution Algorithm&#xff0c;LEA&#xff0c;于2024年2月发表在中科院3区SCI期刊 The Journal of Supercomputing。 1、简介 本文提…

13.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-如果没有工具就创造工具

内容参考于&#xff1a; 易道云信息技术研究院VIP课 上一个内容 &#xff1a;12.游戏网络通信存在的问题 现在把游戏网络的架构看了一个小小的大概&#xff0c;可以用它的接口发数据接收数据了&#xff0c;如果真正想用它这一套东西&#xff0c;真正核心不在于它的接口而在于…

(介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)

前言 本文详细介绍了如何利用物联网技术,通过NodeMCU ESP8266(ESP-12F)模块连接到新版的OneNet平台,使用MQTT协议实现数据的上传与指令的下发。文中首先对NodeMCU ESP8266模块及其特性进行了简介,随后详细阐述了如何配置和使用MQTT协议连接到OneNet平台,实现温湿度数据的…

华宽通招商合同履约管理系统:全流程把控,引领招商引资新篇章

在当今高速发展的经济时代&#xff0c;招商活动已成为推动产业园区发展的重要引擎。然而面对复杂多变的市场环境&#xff0c;传统的招商方式已无法满足现代产业园区的高效管理需求。华宽通招商合同履约管理系统应运而生&#xff0c;旨在通过科技手段&#xff0c;为招商引资提供…

外包干了7个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入北京某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Qt应用软件【测试篇】vargrid内存检查工具

文章目录 vargrid介绍vargrid官网vargrid安装常用命令Valgrind的主要命令vargrid介绍 Valgrind是一个用于构建动态分析工具的框架,能自动检测许多内存管理和线程错误,并详细分析程序性能。Valgrind发行版包括七个成熟工具:内存错误检测器、两个线程错误检测器、缓存和分支预…