MySQL的DQL

DQL( Data Query Language 数据查询语言 )

是SQL语言之一。

基本语法:

/*
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
    [left | right | inner join table_name2]  #联合查询
    [WHERE ...]  #指定结果需满足的条件
    [GROUP BY ...]  #指定结果按照哪几个字段来分组
    [HAVING]  #过滤分组的记录必须满足的次要条件
    [ORDER BY ...]  #指定查询记录按一个或多个条件排序
    [LIMIT {[offset,]row_count | row_countOFFSET offset}];
    # 指定查询的记录从哪条至哪条
*/

注意 : [ ] 中代表可选 , { }中代表必要

SELECT查询语句

  • 指定查询字段

  • 查询表结果时 , 可指定查询结果的数据列,但是效率低 , 不推荐

SELECT * FROM student;   ##查询所有学生

SELECT studentno,studentname FROM student;  # 查询指定列(学号 , 姓名)

AS

  • 子句作为别名

  • AS子句作用 :

    • 可给数据列取一个新别名
    • 可给去一个新别名
    • 可把经计算或总结的结果用另一个新名称来代替
# 这里是为列取别名(当然as关键词可以省略)
SELECT studentno AS 学号,studentname AS 姓名 FROM student;

# 使用as也可以为表取别名
SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;

# 使用as,为查询结果取一个新名字
SELECT studentname AS 新姓名 FROM student;

CONCAT()

  • 函数拼接字符串
# CONCAT()函数拼接字符串  这里输出结果为 姓名:**
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;

DISTINCT关键字

  • 作用 : SELECT查询返回的结果中去掉重复的记录(返回所有列的值都相同),只返回一条
# 查看有成绩的学生(去除重复项)
SELECT * FROM result; # 查看考试成绩
SELECT studentno FROM result; # 查看哪些同学参加了考试
SELECT DISTINCT studentno FROM result;
# 了解:DISTINCT 去除重复项 , (默认是ALL)

使用表达式的列

数据库中的表达式 : 一般由文本值 , 列值 , NULL , 函数和操作符等组成

应用场景 :

  • SELECT语句返回结果列中使用
  • SELECT语句中的ORDER BY , HAVING等子句中使用
  • DML语句中的where条件语句中使用表达式
# selcet查询中可以使用表达式
SELECT @@auto_increment_increment; # 查询自增步长
SELECT VERSION(); #查询版本号
SELECT 100*3-1 AS 计算结果; # 表达式

# 学员考试成绩集体提分一分查看
SELECT studentno,StudentResult+1 AS '提分后' FROM result;
  • 避免SQL返回结果中包含 ’ . ’ , ’ * ’ 和括号等干扰开发语言程序.

where条件语句

  • 用于检索数据表中 符合条件 的记录
  • 搜索条件可由一个或多个逻辑表达式组成 , 结果一般为真或假.
  • 搜索条件的组成

逻辑操作符:

操作符名称 语法 描述
AND或&& a AND b 或 a && b 逻辑与,同为真结果为真
OR或|| a OR b 或 a||b 逻辑或,只要一个为真,则结果为真
NOT或! NOT a 或 !a 逻辑非,若原值为真,则结果为假
# 满足条件的查询(where)
SELECT Studentno,StudentResult FROM result;
# 查询考试成绩在95-100之间的
SELECT Studentno,StudentResult 
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;
# AND也可以写成 &&
SELECT Studentno,StudentResult 
FROM result
WHERE StudentResult>=95 && StudentResult<=100;
# 模糊查询(对应的词:精确查询)
SELECT Studentno,StudentResult 
FROM result
WHERE StudentResult BETWEEN 95 AND 100;
# 除了1000号同学,要其他同学的成绩
SELECT studentno,studentresult
FROM result
WHERE studentno!=1000;

# 使用NOT
SELECT studentno,studentresult
FROM result
WHERE NOT studentno=1000;

比较操作符:

操作符名称 语法 描述
IS NULL a IS NULL 若a为NULL,则结果为真
IS NOT NULL a IS NOT NULL 若a 不为NULL ,则结果为真
BETWEEN…AND a BETWEEN b AND c 若 a 的范围在 b 与 c 之间,则结果为真
LIKE a LIKE b SQL模式匹配,若a匹配b,则结果为真
IN a IN (a1,a2,a3,…) 若 a 为 a1,a2,a3…中的任意一个,则结果为真
  • 注意 :
  • 数值数据类型的记录之间才能进行算术运算;
  • 相同数据类型的数据之间才能进行比较;

模糊查询

#模糊查询 between and \ like \ in \ null

#=============================================
# LIKE
#=============================================
#查询姓李的同学的学号及姓名
#like结合使用的通配符 : % (代表0到任意个字符)  _ (一个字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李%';

#查询姓李的同学,后面只有一个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李_';

#查询姓李的同学,后面只有两个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李__';

#查询姓名中含有 文 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '%文%';

#查询姓名中含有特殊字符的需要使用转义符号 '\'
#自定义转义符关键字:  ESCAPE ':'

#=============================================
# IN
#=============================================
#查询学号为1000,1001,1002的学生姓名
SELECT studentno,studentname FROM student
WHERE studentno IN (1000,1001,1002);

#查询地址在北京,南京,河南洛阳的学生
SELECT studentno,studentname,address FROM student
WHERE address IN ('北京','南京','河南洛阳');

#=============================================
# NULL 空
#=============================================
#查询出生日期没有填写的同学
#不能直接写=NULL , 这是代表错误的 , 用 is null 
SELECT studentname FROM student
WHERE BornDate IS NULL;

#查询出生日期填写的同学
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;

#查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;

连接查询

JOIN

操作符名称 描述
INNER JOIN(JOIN) 如果表中有至少一个匹配,则返回行
LEFT JOIN 即使右表中没有匹配,也从左表中返回所有的行
RIGHT JOIN 即使左表中没有匹配,也从右表中返回所有的行
FULL OUTER JOIN 从左表 和右表 那里返回所有的行。如果其中一个表的数据行在另一个表中没有匹配的行,那么对面的数据用NULL代替

在这里插入图片描述
注:ON后面为两张表的共同点

Inner JOIN

SELECT <select_list> 
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key

Left JOIN

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key

Right JOIN

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key

FULL Outer JOIN

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key

Left Excluding JOIN

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

Right Excluding JOIN

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL

Outer Excluding JOIN

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL

自连接

自连接是连接的一种用法,但并不是连接的一种类型,因为他的本质是把一张表当成两张表来使用。

mysql有时在信息查询时需要进行对自身连接(自连接),所以我们需要为表定义别名。

排序和分页

排序

  • 语法 : ORDER BY
    • ORDER BY 语句用于根据指定的列对结果集进行排序。
    • ORDER BY 语句默认按照ASC升序对记录进行排序。
    • 如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
# 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
# 按成绩降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno

分页

  • 语法 :

    • SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
    • 好处 : (用户体验,网络传输,查询压力)
  • 推导:
    第一页 : limit 0,5
    第二页 : limit 5,5
    第三页 : limit 10,5

    第N页 : limit (pageNo-1)*pageSzie,pageSzie
    [pageNo:页码,pageSize:单页面显示条数]

# 每页显示5条数据
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5

综合练习:

查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)

SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='JAVA第一学年'
ORDER BY StudentResult DESC
LIMIT 0,10

子查询

  • 什么是子查询?
    • 在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句
    • 嵌套查询可由多个子查询组成,求解的方式是由里及外;
    • 子查询返回的结果一般都是集合,故而建议使用IN关键字;
# 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列
#方法一:使用连接查询
SELECT studentno,r.subjectno,StudentResult
FROM result r 
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = '数据库结构-1'
ORDER BY studentresult DESC;

#方法二:使用子查询(执行顺序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
    SELECT subjectno FROM `subject` 
    WHERE subjectname = '数据库结构-1'
)
ORDER BY studentresult DESC;

#查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名
#方法一:使用连接查询
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.`StudentNo` = r.`StudentNo`
INNER JOIN `subject` sub
ON sub.`SubjectNo` = r.`SubjectNo`
WHERE subjectname = '高等数学-2' AND StudentResult>=80

#方法二:使用连接查询+子查询
#分数不小于80分的学生的学号和姓名
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80

#在上面SQL基础上,添加需求:课程为 高等数学-2
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80 AND subjectno=(
    SELECT subjectno FROM `subject`
    WHERE subjectname = '高等数学-2'
)

#方法三:使用子查询
#分步写简单sql语句,然后将其嵌套起来
SELECT studentno,studentname FROM student WHERE studentno IN(
    SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
        SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2'
    )
)

发布了21 篇原创文章 · 获赞 0 · 访问量 119

猜你喜欢

转载自blog.csdn.net/qq_44776943/article/details/104421076
今日推荐