DQL命令查询数据实现方法详解

 更新时间:2022年09月23日 09:10:37   作者:方片6  
DQL(Data Query Language,数据查询语言),查询数据库数据,如SELECT语句,简单的单表查询或多表的复杂查询和嵌套查询,数据库语言中最核心、最重要的语句,使用频率最高的语句

一、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   }] ;  //分页查询

排序可以是升序(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;

二、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   }] ;  //分页查询
	offset://偏移量 
	row_count://显示的记录数
	LIMIT //LIMIT 子句:MySQL查询语句中使用LIMIT子句限制结果集
	如:SELECT studentno,studentresult 
		FROM result
		WHERE subjectno=1 AND YEAR(examdate)=2019
		ORDER BY studentresult DESC
		LIMIT 5 //限制显示的结果集的行数,只显示5条

三、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   }] ;  //分页查询
GROUP BY作用:使用GROUP BY关键字对查询结果分组
	对所有的数据进行分组统计
	分组的依据字段可以有多个,并依次分组
	与HAVING结合使用,进行分组后的数据筛选
GROUP BY子句经常和聚合函数结合使用完成分组统计功能

四、WHERE与HAVING对比

WHERE子句

用来筛选 FROM 子句中指定的操作所产生的行

GROUP BY子句

用来分组 WHERE 子句的输出

HAVING子句

用来从分组的结果中筛选行

五、子查询

基本语法:

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

1.外层查询称为父查询,圆括号中的查询称为子查询。

2.执行SQL语句时,先执行子查询,返回所有来自子查询的结果,再执行外围的父查询,返回查询的最终结果。

3.将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个。

1、IN子查询

IN后面的子查询可以返回多条记录。

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

2、EXISTS子查询

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

有结果为“True”,执行语句;无结果为“False”,不执行语句。

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

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

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

六、多表连接查询

1、内连接

内连接使用比较运算符根据每个表的通用列中的值匹配两个表中的行。

SELECT   字段列表   FROM   表1  INNER JOIN  表2 ON    表1.通用字段名=表2.通用字段名
SELECT   字段列表 FROM   表1 ,表2 WHERE    表1.通用字段名=表2.通用字段名

需要注意的是:

如果两个表中有相同的字段名,必须在列名前加表名。否则将出现 错误代码:1052 Column ‘studentno’ in field

list is ambiguous

查询学生的学号、姓名和成绩,并按照成绩降序排列
//第一种写法
SELECT s.studentno,s.studentname,r.studentresult FROM 
student AS s INNER JOIN  result AS r
ON s.studentno=r.studentno ORDER BY r.studentresult DESC
//第二种写法
SELECT s.studentno,s.studentname,r.studentresult FROM 
student AS s,result AS r
WHERE s.studentno=r.studentno
ORDER BY r.studentresult DESC

2、多表内连接

ELECT   字段列表 FROM   表1 join 表2 on 表1.通用字段名=表2.通用字段名 
join 表3 on 表1.通用字段名=表3.通用字段名
join 表4 on 表4.通用字段名=表3.通用字段名;

3、左外连接

左表(表1)的记录将会全部表示出来,而右表(表2)只会显示符合匹配条件的记录。如图:

匹配,返回到结果集

无匹配,NULL值返回到结果集

SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 表1.通用字段名=表2.通用字段名

4、右外连接

右外连接:右表(表2)的记录将会全部表示出来,而左表(表1)只会显示符合匹配条件的记录。如图:

匹配,返回到结果集

无匹配,NULL值返回到结果集

SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON 表1.通用字段名=表2.通用字段名

5、自连接

自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。

SELECT  c1.cname AS "父名称",c2.cname AS  "子名称" 
FROM tbl_category AS c1, tbl_category  AS c2 
WHERE c1.cid = c2.pid; 

6、不同的SQL JOIN对比

如图片:

到此这篇关于DQL命令查询数据实现方法详解的文章就介绍到这了,更多相关DQL命令查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解mysql的自连接和join关联

    深入理解mysql的自连接和join关联

    这篇文章主要给大家介绍了关于mysql的自连接和join关联的相关资料,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-04-04
  • Mysql数据类型与CRUD操作详细讲解

    Mysql数据类型与CRUD操作详细讲解

    这篇文章主要介绍了Mysql数据类型与CRUD操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • mysql报错:Deadlock found when trying to get lock; try restarting transaction的解决方法

    mysql报错:Deadlock found when trying to get lock; try restarti

    这篇文章主要给大家介绍了关于mysql出现报错:Deadlock found when trying to get lock; try restarting transaction的解决方法,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-07-07
  • mysql5.6批量设置表ROW_FORMAT =DYNAMIC问题

    mysql5.6批量设置表ROW_FORMAT =DYNAMIC问题

    这篇文章主要介绍了mysql5.6批量设置表ROW_FORMAT =DYNAMIC问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 可以改善mysql性能的InnoDB配置参数

    可以改善mysql性能的InnoDB配置参数

    MySQL与MSSQL 有一个区别在于MySQL建表的时候需要选择存储引擎,常用的存储引擎有MyISAM和InnoDB
    2011-05-05
  • MySQL如何利用存储过程快速生成100万条数据详解

    MySQL如何利用存储过程快速生成100万条数据详解

    在MySQL数据库中,如果要插入上百万级的记录,用普通的insertinto来操作非常不现实,速度慢人力成本高,这篇文章主要给大家介绍了关于MySQL如何利用存储过程快速生成100万条数据的相关资料,需要的朋友可以参考下
    2021-08-08
  • Mysql中创建高性能索引详解

    Mysql中创建高性能索引详解

    这篇文章主要介绍了Mysql中创建高性能索引详解,索引相信大家都听说过,但是真正会用的又有几人,平时工作中写SQL真的会考虑到这条SQL如何能够用上索引,如何能够提升执行效率,文本就来详细解读如何创建高性能索引,需要的朋友可以参考下
    2023-07-07
  • insert into … on duplicate key update / replace into 多行数据介绍

    insert into … on duplicate key update / replace into 多行数据介绍

    当我插入一条数据时,我要判断(k1,k2)是否已经存在(1条selete),若存在就update,不存在就insert
    2013-08-08
  • Windows平台下MySQL安装与配置方法与注意事项

    Windows平台下MySQL安装与配置方法与注意事项

    这篇文章主要介绍了Windows平台下MySQL安装与配置方法与注意事项,需要的朋友可以参考下
    2017-04-04
  • MySQL9.0新特性向量存储的使用

    MySQL9.0新特性向量存储的使用

    MySQL 9.0 正式版已经发布,其中一个亮点就是向量(VECTOR)数据类型的支持,本文主要介绍了MySQL9.0新特性向量存储的使用,感兴趣的可以了解一下
    2024-08-08

最新评论