所有的查询操作都用它 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】



