飞道的博客

MySQL Day03 DQL查询数据、WHERE子句、联表查询

408人阅读  评论(0)

MySQL DQL查询数据、WHERE子句、联表查询

前言:本文采用的数据库是我之前博客中发表的测试数据库,可以戳链接查看:https://blog.csdn.net/qq_44958172/article/details/105362696

1 DQL概述

(Date Query Language: 数据查询语言)

  • 所有的查询操作都用到Select
  • 简单的查询,复杂的查询它都能做
  • 数据库中过最核心的语言,最重要的语言
  • 使用频率最高的语句

2 指定查询字段

2.1 简单查询测试代码:

-- 查询全部学生 SELECT 字段 FROM 表
SELECT * FROM `student`;

-- 查询指定字段
SELECT `StudentNo`, `Name` FROM `student`;

-- 别名,给结果起一个名字 AS :可以给字段起别名,也可以给表起别名
SELECT `StudentNo` AS 学号, `Name` AS 学生姓名 FROM `student` AS s;

-- 函数 CONCAT(a,b) 拼接字符串
SELECT CONCAT('姓名:',Name) AS 新名字 FROM `student`;

语法:SELECT 字段... FROM 表

在列名字并不容易见名知意时,我们可以使用字段名 AS 别名 表名 AS 别名来进行“起别名”操作。

2.2 去重 (DISTINCT)

作用:去除SELECT查询结果中重复的数据,重复的数据只显示一条。

-- 查询有哪些同学参加了考试,并展示成绩
SELECT * FROM `result` -- 查询全部考试成绩

SELECT `StudentNo` FROM result -- 查询有哪些同学参加了考试
-- 以上语句中发现了重复数据,所以需要去重操作

SELECT DISTINCT `StudentNo` FROM result

2.3 数据库的列(表达式)

SELECT VERSION() -- 查询系统版本(函数)
SELECT 100*3-1 AS 计算结果 -- 用来计算(表达式)
SELECT @@auto_increment_increment -- 查询自增的步长(变量)

数据库中的表达式:文本值,列,NULL,函数,计算表达式,系统变量…

格式:SELECT 表达式 FROM 表名

2.4 “所有成绩+1”小案例

测试代码:

-- 学生原考试成绩查看
SELECT `StudentNo`,`StudentResult` AS '提分前' FROM result;

-- 学生考试成绩 + 1分查看
SELECT `StudentNo` ,`StudentResult`+1 AS '提分后' FROM result;

原考试成绩:

更改后考试成绩:

3 WHERE 条件字句

作用:检索数据中符合条件的值

搜索的条件由一个或多个表达式组成,结果为布尔值!

3.1 逻辑运算符

运算符 语法 描述
AND && a AND b a&&b 逻辑与
OR || a OR b a||b 逻辑或
NOT ! NOT a !a 逻辑非

尽量使用英文字母!

测试代码:

-- ==================== WHERE ==================== --
SELECT `StudentNo`,`StudentResult` FROM result

-- 查询成绩在95~100之间,使用AND或&&均可!
SELECT `StudentNo`,`StudentResult` FROM result 
WHERE `StudentResult`>=95 AND `StudentResult`<=100

-- 模糊查询(区间)
SELECT `StudentNo`,`StudentResult` FROM result 
WHERE `StudentResult` BETWEEN 95 AND 100


-- 除了10001号学生之外的同学的成绩 NOT 或 !=均可!
SELECT `StudentNo`, `StudentResult` FROM `result`
WHERE `StudentNo` != 10001

SELECT `StudentNo`,`StudentResult` FROM `result`
WHERE NOT `StudentNo` = 10001

3.2 模糊查询

模糊查询的本质是比较运算符。

运算符 语法 描述
IS NULL a IS NULL 如果操作符为NULL,结果为真
IS NOT NULL a IS NOT NULL 如果操作符不为NULL,结果为真
BETWEEN a BETWEEN b AND c 若a在[b, c]之间,则结果为真
LIKE a LIKE b SQL匹配,如果a匹配到b,则结果为真
IN a IN (a1, a2, a3…) 假设a在a1|a2|…中,结果为真

测试代码:

-- ==================== 模糊查询 ==================== --

-- LIKE结合 %(代表0到任意个字符) _(一个字符)
-- 查询姓名为C开头的同学
SELECT `StudentNo`,`Name` FROM `student`
WHERE Name LIKE 'C%'

-- 查询姓名C开头的同学,且C后只有3个字符的
SELECT `StudentNo`,`Name` FROM `student`
WHERE `Name` LIKE 'C___'

-- 查询姓名中有包含ai的同学
SELECT `StudentNo`,`Name` FROM `student`
WHERE `Name` LIKE '%ai%'

-- ===== IN(具体的一个或多个值) ===== --
-- 查询10157,10111,10090号学生
SELECT `StudentNo`,`Name` FROM `student`
WHERE `StudentNo` IN (10157,10111,10090)

-- ====== NULL 和 NOT NULL====== --
-- 查询地址为空的学生 NULL ''
SELECT `StudentNo`,`Name` FROM `student`
WHERE `Address`='' OR `Address` IS NULL

-- 查询出生日期不为空的同学
SELECT `StudentNo`,`Name` FROM `student`
WHERE `Birth` IS NOT NULL

4 联表查询

4.1 JOIN ON 语句

JOIN ON语句: INNER JOIN…ON…、LEFT JOIN…ON…、RIGHT JOIN…ON…

操作 描述
INNER JOIN 如果表中至少有一个匹配,就返回
LEFT JOIN 从左表返回所有的值,即使右表中没有匹配,
RIGHT JOIN 会从右表中返回所有的值,即使左表中没有匹配

先使用案例对该语句进行测试:

测试代码:

-- ============ 联表查询 join ============ --
-- 查询参加了考试的同学(学号,姓名,科目编号,分数)

/*思路
1. 分析需求,分析查询的字段来自哪种表(连接查询)
2. 确定使用哪种连接查询? 7种
确定交叉点(几个表中相同的数据)
判断条件:学生表中的StudentNo = 成绩表中的StudentNo
*/
-- JOIN ON (连接的表)ON (判断的条件) 连接查询
-- WHERE 等值查询

-- INNER JOIN
SELECT s.`StudentNo`,`Name`,`SubjectNo`,`StudentResult`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.`StudentNo`=r.`StudentNo`

-- RIGHT JOIN
SELECT s.`StudentNo`,`Name`,`SubjectNo`,`StudentResult`
FROM `student` s
RIGHT JOIN result r
ON s.`StudentNo`=r.`StudentNo`

-- LEFT JOIN
SELECT s.`StudentNo`,`Name`,`SubjectNo`,`StudentResult`
FROM `student` s
LEFT JOIN result r
ON s.`StudentNo`=r.`StudentNo`

测试结果:

– INNER JOIN:

– RIGHT JOIN:

– LEFT JOIN:

4.2 思考题

1 思考题(查询参加考试的同学信息:学号,姓名,科目名称,成绩)

解题思路:

  1. 所要查询字段来自于 student、subject、result
  2. 确定以result表为基准 查询
  3. 交叉点为:student与result表中StudentNo相同,subject与result表中SubjectNo相同;

代码:

SELECT s.`StudentNo`, `Name`,`SubjectName`,`StudentResult`
FROM `student` s
RIGHT JOIN `result` r
ON r.`StudentNo` = s.`StudentNo`
INNER JOIN `subject` sub
ON r.`SujectNo` = sub.`SubjectNo`

结果:

2 查询学生学号、姓名、年级名称

代码:

-- 学生学号、姓名、年级名称
SELECT `studentno`, `name`,`gradename`
FROM student s
INNER JOIN `grade` g
ON s.`gradeid` = g.`gradeid`

结果:

3 查询参加了Finances考试的同学信息:学号、学生姓名、科目名、分数

代码:

-- 查询参加了Finances考试的同学信息:学号、学生姓名、科目名、分数
SELECT s.`studentno`, `name`, `subjectname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno` = r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno` = sub.`subjectno`
WHERE `subjectname` = 'Finances'

结果:

4.3 联表查询解题思路

解题思路

  • 首先明确要查询哪些数据SELECT…
  • 从哪几个表中查找 FROM 表 XXX JOIN 连接的表 ON 交叉条件
  • 假设需要多张表查询,慢慢来,先查询两张表然后慢慢增加

– FROM a LEFT JOIN b ON… 以a表为基准
– FROM a RIGHT JOIN b ON… 以b表为基准

写在最后

And this is my prayer: that your love may abound more and more in knowledge and depth of insight, so that you may be able to discern what is best and may be pure and blameless for the day of Christ, filled with the fruit of righteousness that comes through Jesus Christ—to the glory and praise of God. (Philippians 1: 9-11)
To Demut!


转载:https://blog.csdn.net/qq_44958172/article/details/105375778
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场