三、DQL查询数据

1.指定查询字段

1
2
3
4
5
6
7
8
--选择所有的信息
SELECT * FROM `student`;
--选择特定的信息
SELECT `studentno`,`sex` FROM `student`;
--给选出来的信息数据取一个别名
SELECT `studentno` as `学号` ,`sex` AS `性别` FROM `student`;
--在选出的数据上加上一些自己想加上的字符串,在前面还是后面都可以添加
SELECT CONCAT("sno:",`studentno`) as "sno" FROM student;

2.去重

1
2
--1.不显示重复的数据
SELECT DISTINCT`studentno` FROM result;

3.其他

1
2
3
4
5
6
7
8
--1.查询版本号
SELECT VERSION()
--2.计算算数
SELECT 100*3-3 as result
--3.显示自增的步长
SELECT @@auto_increment_increment
--4.数据运算(在每个数据上加上1)
SELECT `studentresult`+1 as "成绩" FROM result

4.where 语句

1.指定查询条件
1
SELECT * FROM `result` WHERE `subjectno`=3 and `studentno`=1002;
2.模糊查询(运用比较运算符)
1
SELECT * FROM `result` WHERE `subjectno`>3;

==运算符:is null,is not null,beetween…and….,==

运算符 语法 描述
Like a like b SQL语句匹配,如果匹配成功就返回一个true
In a in b SQL语句匹配,数据是一个具体的值的时候匹配成功

用法

1
2
3
4
5
6
7
8
9
--通配符:%:长度可能是0也可能是无限。_:就是代表一个字符这个通配符只可以在like里面使用
SELECT * FROM student WHERE `studentname` LIKE '%伟';--末尾是伟字的,长度不确定,如果是下划线的话,长度就固定了
SELECT * FROM student WHERE `studentname` LIKE '_伟';
----------------------------------------------------------------------------------------------
SELECT * FROM student WHERE `studentname` IN ("张伟");--只有确定的才可以被选出来
SELECT * FROM student WHERE `studentname` IN ("张伟""saxon");--多个用,隔开
----------------------------------------------------------------------------------------------
SELECT * FROM student WHERE `studentname` IS NOT NULL;
SELECT * FROM student WHERE `studentname` is NULL or `studentname`="";

5.联表查询

1.3种联表操作
操作 描述
Inner join 查询两张表共同的部分
left join 以左边的表为基准,查询左表的字段,哪怕链接的表没有也会显示出来
right join 以右边的表为基准,查询右表的字段,哪怕左边的表没有也会显示出来

就是会匹配字段,以左右为主,匹配出字段就显示,在一个表没有数据的时候也会显示出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--inner join
SELECT student.studentno,`studentname`,`studentresult`
FROM student
INNER JOIN result
ON student.studentno=result.studentno
--left join
SELECT student.studentno,`studentname`,`studentresult`
FROM student
LEFT JOIN result
ON student.studentno=result.studentno
--right join
SELECT student.studentno,`studentname`,`studentresult`
FROM student
RIGHT JOIN result
ON student.studentno=result.studentno
2.匹配语句间可以连接实现多表查询
1
2
3
4
5
6
SELECT student.studentno,`studentname`,`studentresult`,subjectname
FROM student
INNER JOIN result
ON student.studentno=result.studentno--查询结果在向下查询
INNER JOIN `subject`
ON result.subjectno=`subject`.subjectno
3.自联查询(把一张表看成两张表查询)
1
2
3
4
5
--可以查询一些所属关系
SELECT a.studentno,s.`studentname`
FROM student a
INNER JOIN student s
ON a.studentno=s.studentno

6.分页和排序

1
2
3
4
5
SELECT * FROM `subject`
ORDER BY subjectno ASC--排序 ASC升序 Desc降序
LIMIT 0,5--分页 页面起始页和页面大小组成
--页面起始页=页面大小*(页面序号-1);
--数据总数/页数=页面大小

7.子查询和嵌套查询

1
2
3
4
5
6
7
8
--子查询:分为对两个表的查询结果筛选
SELECT subjectname FROM `subject` WHERE subjectno IN (
SELECT subjectno FROM result WHERE result.studentresult>80)
--嵌套查询:逐步向下进行筛查
select * from student WHERE studentno IN(
SELECT result.studentno FROM result WHERE result.subjectno IN(
SELECT `subject`.subjectno FROM `subject` WHERE subjectname='高等数学-1')
)

8.分组和过滤

1
2
3
4
5
6
--一个语句内只可以有一个where循环
--group by 顾名思义就是按照xxx进行分组,它必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标识字段。
--having必须在group by 后面
SELECT AVG(result.studentresult) as '平均值' FROM result
GROUP BY result.studentresult
HAVING 平均值>70;--过滤