4、DQL查询数据(重点)
Data Query Language : 数据查询语言
- 使用频率高
4.2 指定查询字段
-- 查询全部的学生,select 字段 from 表
SELECT * FROM student
-- 查询指定字段----起别名
SELECT `SNO` AS 学号,`SNAME` AS 学生姓名 FROM student
-- 也可以给字段起别名
SELECT `SNO` AS 学号,`SNAME` AS 学生姓名 FROM student AS S1
-- 函数 Concat(a,b)
SELECT CONCAT(‘姓名: ‘,SNAME) AS 新名字 FROM student
-- 结果展示:如下图
有时候,列明不是那么的见名知意,
我们起别名: 使用AS
- 字段名 AS 别名1
- 表名 AS 别名2
去重 DISTINCT
去除SELECT查询出来的结果中重复的数据,重复的数据只显示一条
-- 查询那些同学参加了考试
SELECT * FROM result -- 全部考试成绩
-- 查询成绩
SELECT DISTINCT `GRADE` FROM result
一些自带的可以查询的东西,了解下
SELECT VERSION() -- 查询系统版本(函数)
SELECT 100+3-1 AS 计算结果 -- 用来计算(表达式)
SELECT @@auto_increment_increment -- 查询自增的步长(变量)
-- 学员的考试成绩 +1 查看
SELECT `SNO`,`result`+1 AS ‘提分后‘ FROM result
数据库中的表达式:文本值,列,函数,NULL,计算表达式,系统变量
select 表达式 from 表
4.3、where条件子句
作用:检索数据中符合条件的数据
搜索的条件是由一个或者多个表达式组成,结果为布尔值
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
&& and | a and b a && b | 逻辑与 |
|| or | a or b a || b | 逻辑或 |
! Not | not a !a | 逻辑非(取反) |
尽量使用英文字母
+++
代码展示
-- where
SELECT `sno` AS ‘学号‘,`grade` AS ‘成绩‘
FROM SC
where grade >= 95 AND grade <= 100
-- 上面的例子尽量使用 AND 不要使用 &&
-- 模糊查询
SELECT sno,`grade`
FROM SC
WHERE grade between 95 and 100
-- c除了1000号学生的成绩
SELECT sno,`grade`
FROM SC
WHERE NOT sno = 1000
-- 或者是下面的这种方式
SELECT sno,`grade`
FROM SC
WHERE sno != 1000
-- 多个条件查询
-- 成绩在95~100之间且学号不是1002的学生
SELECT sno,`grade`
FROM SC
WHERE grade between 90 AND 100 AND sno != 1002
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
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其中的某个值,则结果为真 |
-- 模糊查询
-- 查询姓刘的同学
SELECT `sno`,`sname`
FROM `student`
WHERE sname LIKE ‘刘%‘;
-- 查询姓刘的同学,名字后面只有一个字
SELECT `sno`,`sname`
FROM `student`
WHERE sname LIKE ‘刘_‘;
-- 查询姓刘的同学,名字后面只有2个字
SELECT `sno`,`sname`
FROM `student`
WHERE sname LIKE ‘刘__‘;
-- 查询名字中间有 ‘嘉’字的同学
SELECT `sno`,`sname`
FROM `student`
WHERE sname LIKE ‘%嘉%‘;
-- -----------IN-------------------------------------
-- 查询指定的学员信息--1001 1002 1003
SELECT `sno`,`sname`
FROM `student`
WHERE sno IN (‘1001‘,‘1002‘,‘1003‘);
-- 查询在北京的人
SELECT sno ,sname
FROM `student`
WHERE `address` IN (‘北京‘);
-- 查询地址为空的学生
SELECT `sno`,`sname`
FROM `student`
WHERE `address` = ‘ ‘ OR `address` IS NULL
-- 查询有出生日期的同学,意思就是出生日期不为空
SELECT `sno`,`sname`
FROM `student`
WHERE `bornDate` IS NOT NULL
4.4、 联表查询
JOIN对比
---------------------联表查询--------------------------
-- 1、分析需求<分析需要的数据来自那几个表>
-- 2、确定使用什么查询 上面的7种
-- 3、使用共同的属性来连接属性
-- 查询参加考试的同学信息及成绩
SELECT s.sno,`sname`,`cno`,`grade`
FROM student AS ‘s‘
INNER JOIN SC AS ‘r‘ -- 连接两个表并取别名
ON s.sno = r.sno
-- Right JOIN
SELECT s.sno,`sname`,`cno`,`grade`
FROM student AS ‘s‘ -- 取别名可以 一个空格解决
RIGHT JOIN SC AS ‘r‘ -- 连接两个表并取别名
ON s.sno = r.sno
-- LIFT JOIN
SELECT s.sno,`sname`,`cno`,`grade`
FROM student AS ‘s‘ -- 取别名可以 一个空格解决
LEFT JOIN SC AS ‘r‘ -- 连接两个表并取别名
ON s.sno = r.sno
-- 左表和右表的位置
-- 是由LIGHT JOIN 前后的位置决定的,join之前的就是左表,后边就是右表
操作 | 描述 |
---|---|
INNER JOIN(并集) | 如果表中至少有一个匹配就返回行<元组>, |
LEFT JOIN | 会从左表中返回所有的值,即使在右表中没有匹配到。-----例子:kuangshen同学没有考试,会有记录,但是成绩为NULL |
RIGHT JOIN | 会从右表中返回所有的值,即使在左表中没有匹配到。 |
-- 查询缺考的同学
SELECT s.sno,`sname`,`cno`,`grade`
FROM student AS ‘s‘
LEFT JOIN SC AS ‘r‘
ON s.sno = r.sno
WHERE grade IS NULL;
join <连接的表>on <判断的条件> 是连接查询
WHERE 等值查询
-- 思考:查询参加考试的同学的所有信息,包括使用科目信息
SELECT s.sno,`sname`,`cname`,`grade`
FROM student s
Right Join sc r -- 第一次连接
ON r.sno = s.sno
Inner JOIN course sub -- 第二次连接
ON r.cno = sub.cno
-- 假设存在一种多张表查询,慢慢来,先查询两张表再慢慢增加
4.6、自连接以及联表查询
自连接: 了解
自己的表和自己的表连接,核心:一张表拆成两个一样的表来即可
父表
categoryid | categoryName |
---|---|
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
子表
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 数据库 |
2 | 8 | 办公信息 |
3 | 6 | Web开发 |
5 | 7 | ps技术 |
操作:查询父类对应的子类关系
父类 | 子类 |
---|---|
信息技术 | 办公信息 |
软件开发 | 数据库 |
美术设计 | web开发 |
软件开发 | ps技术 |
-- 查询父子信息
SELECT a.`categoryName` AS ‘父栏目‘,b.`categoryName` AS ‘子栏目‘
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`;
-- 查询学员所属的年级,学号,学生姓名,年级名称
SELECT s.`sno`,`sname`,`gradeName`
FROM student s
INNER JOIN `SC` g
ON S.`GRADEID` = G.`GRADEID`;
-- 查询科目所属的年级(科目名称,年级名称)
SELECT c.`cno`,`gradeName`
FROM Course c
INNER JOIN `SC` g
ON c.`cno` = g.`cno`;
-- 查询参加数据库-1 考试的同学信息,学号,学生姓名,科目名,分数
SELECT
FROM student s
INNER JOIN `SC` g
ON s.sno = g.sno -- 连接学生表和成绩表
INNER JOIN course c
ON g.cno = c.cno -- 连接科目表和 前面已经连接的表
WHERE c.cno = ‘数据库-1‘;
select完整的语法结构: