DQL
(Data Query Language):数据查询语言
1.所有的查询操作都用它 Select4
2.简单的查询和复杂的查询它都能做
3.数据库中最核心的语言,最重要的语句
4.使用频率最高的语句
指定查询字段
--查询全部的学生
SELECT * FROM student
--查询全部的成绩
SELECT * FROM result
--查询指定的字段
SELECT `studentno`,`studentname` FROM student
--别名,给结果起名字
SELECT `studentno` AS 学生学号,`` AS 学生姓名 FROM student
--函数 concat(a,b)
SELECT CONCAT('姓名:',studentname) AS 新名字 FROM student
语法:SELECT 字段,......FROM 表
去重distinct
作用:去除select查询出来的结果中重复的数据,重复的数据只显示一条
--查询哪些同学参加了考试
SELECT * FROM result
--查询有哪些同学参加了考试
SELECT `studentno` FROM result
--发现重复数据,去重 distinct
SELECT DISTINCT `studentno` FROM result
数据库的列(表达式)
查询系统版本
SELECT VERSION()
--可以用来计算
SELECT 100*3-1 AS 计算结果
--查询自增的步长
SELECT @@auto_increment_increment AS 自增的不长
--学员考试成绩加1分查看
SELECT `studentno`,`studentresult`+1 AS 提分后 FROM result
数据库中的表达式:文本值,列,Null,函数,计算表达式,系统变量........
select 表达式 from 表
where条件子句
作用:检索数据中符合条件的值
逻辑与算符
运算符 | 语法 | 描述 |
and && | a and b a&&b | 逻辑与,两个都为真,结果为真 |
or || | a or b a||b | 逻辑或,其中一个为真,则结果为真 |
Not ! | not a ! a | 逻辑非,真为假,假为真 |
--查询考试成绩在95~100之间
SELECT `studentno`,`studentresult` FROM result
WHERE studentresult>=70 AND studentresult<=100
--查询考试成绩大于60分以上的同学
SELECT `studentno`,`studentresult` FROM result
WHERE studentresult >60;
--AND &&
SELECT `studentno`,`studentresult` FROM result
WHERE studentresult>=70 && studentresult<=100
--模糊查询(区间)
SELECT `studentno`,`studentresult` FROM result
WHERE studentresult BETWEEN 70 AND 100
--查询除了1000号学生以外的同学的成绩
SELECT `studentno`,`studentresult` FROM result
WHERE studentno!=1000;
--查询除了1000号和1002号学生以外的同学的成绩
select `studentno`,`studentresult` FROM result
WHERE studentno!=1000 AND studentno!=1002
--!= not
SELECT `studentno`,`studentresult` FROM result
WHERE NOT `studentno`=1000;
模糊查询:比较运算符
运算符 | 语法 | 描述 |
IS NULL | a is null | 如果操作符为NULL,结果为真 |
IS NOT NULL | a is not null | 如果操作符不为NULL,结果为真 |
BETWEEN | a between and c | 若a在b和c之间,则结果为真 |
LIKE | a like b | SQL匹配,如果a匹配b,则结果为真 |
IN | a in(a1,a2,a3.......) | 假设a在a1,或者a2....其中的某一个值中,那么结果为真 |
-----------模糊查询------------
--查询姓张的学生
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 '%强%'
---=======IN=====---
---查询1000,1001号学员
--查询在北京朝阳的学生
SELECT `studentno`,`studentname` FROM `student`
WHERE `address` IN('北京朝阳')
--查询地址为空的同学
SELECT `studentno`,`studentname` FROM `student`
WHERE `address`= '' OR `address` IS NULL
--查询地址不为空的同学
SELECT `studentno`,`studentname` FROM `student`
WHERE `address` IS NOT NULL
--查询出生日期为空的同学
SELECT `studentno`,`studentname` FROM `student`
WHERE `borndate`= '' OR `borndate` IS NULL
--查询地址不为空的同学
SELECT `studentno`,`studentname` FROM `student`
WHERE `borndate` IS NOT NULL
联表查询
JOIN
-----连表查询 join----
查询参加了考试的同学(学号,姓名,科目,分数)
SELECT *FROM student
SELECT * FROM result
/*
思路
1.分析需求,分析查询的字段来自哪些表(连接查询)
2.确定使用哪种连接查询?7种
3.确定交叉点(两个表中哪个数据是相同)
4.判定条件:学生表中的studentno = 成绩表中的studentno
*/
-----INNER JOIN ----
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
INNER JOIN result AS r
WHERE s.studentno = r.studentno
-- RIGHT JOIN
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
RIGHT JOIN result AS r
ON s.studentno = r.studentno
--LEFT JOIN
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
LEFT JOIN result AS r
ON s.studentno = r.studentno
操作 | 描述 |
Inner join | 如果表中至少有一个匹配上,就返回行 |
left join | 会从左表中返回所有的值,即使右表中没有匹配 |
right join | 会从右表中返回所有的值,即使左表中没有匹配 |
/*--思考题(查询了参加考试的同学信息:学号,学生姓名,科目名,分数)
思路
1.分析需求,分析查询的字段来自哪些表(连接查询)
2.确定使用哪种连接查询?7种
3.确定交叉点(两个表中哪个数据是相同)
4.判定条件:学生表中的studentno = 成绩表中的studentno
*/
SELECT s.studentno,studentname,subjectname,studentresult
FROM student AS s
RIGHT JOIN result AS r
ON s.studentno = r.studentno
LEFT JOIN `subject`AS sub
ON r.subjectno = sub.subjectno
--我要查询哪些数据 select
--从哪几个表中查from表,xxx join 连接的表 on 交叉条件
--假设存在一种多张表查询,慢慢来,先查询两张表然后在慢慢增加
自连接(了解即可)
自己的表和自己的表连接,核心:一张表拆分为两张一样的表
父类
categroyid | categoryname |
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
子类
pid | categroyid | categoryname |
3 | 4 | 数据库 |
3 | 6 | web开发 |
5 | 7 | ps技术 |
2 | 8 | 办公信息 |
查询父类对应的子类
父类 | 子类 |
信息技术 | 办公信息 |
软件开发 | 数据库 |
软件开发 | web开发 |
美术设计 | ps技术 |
--自连接
--查询父子信息,把一张表看成两个一模一样的表
SELECT c.`categoryname` AS '父类',d.`categoryname` AS '子类'
FROM `category` AS c , `category` AS d
WHERE c.`categoryid` = d.`pid`
分页和排序
排序:ASC(升序) DESC(降序)
--分页limit和排序 ORDER BY--
--根据查询的结果,根据成绩来排序
--升序 ASC 降序 DESC
SELECT s.studentno,studentname,subjectname,studentresult
FROM student AS s
INNER JOIN result AS r
ON s.studentno =r.studentno
INNER JOIN `subject` AS sub
ON r.subjectno = sub.subjectno
WHERE subjectname = '数据库结构-1'
ORDER BY studentresult ASC
分页:limit
--分页
--为什么要分页:缓解数据库压力,给人的体验更好
--分页,每页只显示5条数据
--语法:LIMIT 当前页、页面大小
--LIMIT 0,5
SELECT s.studentno,studentname,subjectname,studentresult
FROM student AS s
INNER JOIN result AS r
ON s.studentno =r.studentno
INNER JOIN `subject` AS sub
ON r.subjectno = sub.subjectno
WHERE subjectname = '数据库结构-1'
ORDER BY studentresult ASC
LIMIT 0,5
思考题
--思考题:
--查询java第一学年 课程成绩排名前十的学生,并且分数要大于70分的学生
SELECT s.studentno,studentname,subjectname,studentresult
FROM student AS s
INNER JOIN result AS r
ON s.studentno = r.studentno
INNER JOIN `subject` AS sub
ON r.subjectno = sub.subjectno
WHERE subjectname = '高等数学-1' AND studentresult>70
ORDER BY studentresult DESC
LIMIT 0,3