MySQL【DQL查询数据(最重点)】

DQL查询数据(最重点)

4.1、DQL(Data Query LANGUAGE:数据查询语言)

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

4.2、指定查询字段

-- 查询全部的学校 select 字段 from 表
SELECT * FROM student;

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

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

-- 函数 Concat(a,b)
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student;

语法:select 字段...FROM 表

有的时候,列名字不是那么见名知意,我们起别名 AS 字段名 as 别名 表名 as 别名

去重 distinct

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

-- 查询一下有哪些同学参加了考试,成绩
select * from result --查询全部的考试成绩
select `studentNo` from result --查询有哪些同学参加了考试
select distinct `StudentNo` from result --发现重复数据,去重

数据库的列(表达式)

select version() -- 查看系统版本
select 100*3-1 as 计算结果 -- 用来计算
select @@auto_increment_increment -- 查询自增的步长(变量)

-- 学员考试成绩+1分查看
select `StudentNo`,`StudentResult`+1 AS '提分后' from result

Select 完整的语法

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}];

    --指定查询的记录从哪条到哪条
注意:[]括号代表可选的,{}括号代表必选的

总结:

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

4.3、where条件子句

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

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

逻辑运算符

SELECT studentNo, `studentResult`FROM result
--查询考试成绩在95~100分之间
SELECT studentNo, `studentResult` FROM resultwHERE StudentResu7t>=95 AND studentResult<=100
-- and&&
SELECT studentno, `studentResult` FROMresultwHERE StudentResu7t>=95 && studentResult<=100
-- 模糊查询(区间)
SELECT studentNo, `studentResult` FROM resultwHERE StudentResult BETWEEN 95 AND 100
-- 除了1000号学生之外的同学的成绩
SELECT studentNo,`studentResult` FROM resultwHERE studentNo!=1000;
-- !=not
SELECT studentNo, `studentResu1t`FROM resultwHERE NOT studentNo = 1000

模糊查询:比较运算符

--查询姓刘的同学
-- like结合%(代表0到任意个字符)_(一个字符)
SELECT `studentNo` , `studentName` FROM `student` wHERE StudentName LIKE '刘%'
--查询姓刘的同学,名字后面只有一个字的
SELECT studentNo , `studentName` FROM `student`wHERE StudentName LIKE '刘_'
--查询姓刘的同学,名字后面只有两个字的
SELECT `studentNo` , `studentName` FROM `student`

--查询名字中间有嘉字的同学%嘉%
SELECT `studentNo`, `studentName` FROM studentWHERE studentName LIKE'%嘉%'
--=a=== in(具体的一个或者多个值)=三三==--查询1001,1002,1003号学员
SELECT `studentNo , studentName FROMstudentwHERE studentNo IN (1001,1002,1003);
--查询在北京的学生
SELECT studentNo ` , `studentName` FROM`student wHERE `Address` IN('安徽','河南洛阳');

--查询地址为空的学生nu11 
SELECT  `studentNo` , `studentName`FROM student wHERE address=''oR address IS NULL
--查询有出生日期的同学―不为空
SELECT `studentNo` , `studentName` FROM student wHERE `BornDate` IS NOT NULyI
--查询没有有出生日期的同学为空 
SELECT `studentNo` , `studentName` FROM `student wHERE `BornDate` IS NULL

4.4、联表查询

JOIN 对比

扫描二维码关注公众号,回复: 15790832 查看本文章

/*
连接查询
   如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
内连接 inner join
   查询两个表中的结果集中的交集
外连接 outer join
   左外连接 left join
       (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
   右外连接 right join
       (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)
       
等值连接和非等值连接

自连接
*/

-- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
SELECT * FROM student;
SELECT * FROM result;

/*思路:
(1):分析需求,确定查询的列来源于两个类,student result,连接查询
(2):确定使用哪种连接查询?(内连接)
*/
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno

-- 右连接(也可实现)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.studentno = s.studentno

-- 等值连接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s , result r
WHERE r.studentno = s.studentno

-- 左连接 (查询了所有同学,不考试的也会查出来)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno

-- 查一下缺考的同学(左连接应用场景)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
WHERE StudentResult IS NULL

-- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno

自连接(了解)

自己的表和自己的表连接,核心:一张表拆分为两张一样的表即可

父类

子类

操作:查询父类对应的子类关系

 

-- 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
-- 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'
FROM category AS a,category AS b
WHERE a.`categoryid`=b.`pid`

-- 查询学院所属的年级(学号,学生的姓名,年级名称)
SELECT studentno,studentname,`gradename`
FROM student s
INNER JOIN `grade` g
ON s.`gradeid`=g.`gradeid`

-- 查询科目所属的年级(科目名称,年级名称)
SELECT `subjectname`,`gradename`
FROM `subject` sub
INNER JOIN `grade` g
ON sub.gradeid=g.`gradeid`

-- 查询 数据库结构-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'

 4.5、分页和排序

/*============== 排序 ================
语法 : 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

/*============== 分页 ================
语法 : 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

语法:limit(查询起始下标,pageSize)

4.6、子查询

where(这个值是计算出来的)

本质: 在where语句中嵌套一个子查询语句

where(select * from)

/*============== 子查询 ================
什么是子查询?
   在查询语句中的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'
  )
)

摘录遇见狂神说【MySQL】

猜你喜欢

转载自blog.csdn.net/qq_48108092/article/details/123639945