栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

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

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 对比


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


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、分页和排序

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



-- 每页显示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)


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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784974.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号