查询
- 全列查询 select*from student. *:当前表中的所有字段
我们来准备一个数据表:
DROP TABLE IF EXISTS exam_result;
CREATE TABLE exam_result (
id INT, name VARCHAR(20),
chinese DECIMAL(3,1),
math DECIMAL(3,1),
english DECIMAL(3,1) );
INSERT INTO exam_result (
id,name, chinese, math, english)
VALUES (1,'唐三藏', 67, 98, 56),
(2,'孙悟空', 87.5, 78, 77),
(3,'猪悟能', 88, 98, 90),
(4,'曹孟德', 82, 84, 67),
(5,'刘玄德', 55.5, 85, 45),
(6,'孙权', 70, 73, 78.5),
(7,'宋公明', 75, 65, 30);
- 全列查询
- 指定列查询
select id,name from exam_result;
查询字段为表达式
- 将所有的数学成绩+10
- 查询总分
起别名关键字:as
起别名 : XXX as 别名
也可以给表起别名。
起别名的作用:就是当列名或者表名太复杂了 比如太长了其此时就可以用别名代替 - 条件查询
当我们需要特定信息时,我们可以使用一些关键字来限制我们所查询的信息,得到我们想要的数据。
现在我们有这样一张表:
- 我们查询所有人的数学成绩
select math from exam_result;
上面的结果有重复的数字,我们如何让它不重复呢----------使用关键字distinct
- 去重(distinct)
请问这样的语句是否可以?
select id,name,distinct math from exam_result;
答案是不可以的
以上这条语句位置不对!!需要把去重放在第一位!
select distinct math, id,name from exam_result;
那么,去重的原理到底是什么?记住了,去重 针对的是, 所有的字段!!只有当select distinct math, id,name from exam_result;中 的三个字段同时重复的时候,才会去 重!!!
排序
- 将查询结果 按照,根据数学成绩进行从低到高(升序)排序
或者:
如果升序排序数据,我们一般不用加关键字asc,因为在mysql中是默认升序排序的。 - 将查询结果 按照,根据数学成绩进行从高到低(降序)排序
此时我们要用到关键字desc
关键字不可以乱用,比如Java中你不可以将int作为变量名,类似的,mysql中你也不可以将desc等关键字用作表名,如果你那样干了,结果就会出错。但是如果你非要这样干,也并不是没有办法,在用作变量名的时候,一定要 加符号:‘desc’.
对于要排序的字段为NULL的时候:
排序查询:
总结:
- 1、order by asc 和 order by 默认是从低到高进行排序的
- 2、order by desc 是从高到第排序的
- 3、对于MySQL的关键字 ,在用作变量名的时候,一定要 加符号:‘ desc’
注意:查询的顺序问题:
为什么会出错呢?
原因是:他会首先执行:SELECT name, total FROM exam_result ; 但是 此时并不认识 total是啥
- 查询同学各门成绩,依次按 数学降序,英语升序,语文 升序的方式显示
- where 条件查询
--查询数学成绩大于80分的 同学的个人信息及数学成绩
select id,name,math from exam_result where math>80;
--查询数学成绩大于80分的 同学的个人信息及数学成绩, 然后根据数学成绩升序排序
select id,name,math from exam_result where math>80 order by math;
--查询数学成绩等于98分的同学及个人信息
select id,name,math from exam_result where math=98;
注意NULL: = 不安全 对于NULL 查不到
解决问题:使用 <=> 这个运算符
不等于运算符: <> !=
大家有没有发现,为什么math为NULL的没有显示?
原因就是 null 不能直接用算术运算符 进行比较
--查询数学成绩84-98之间的同学及成绩
select id,name,math from exam_result where math between 84 and 98;
--查询数学成绩在98,85,73 中的 所有同学的数学成绩和个 人信息
select id,name,math from exam_result where math in(98,73,85);
in : math in(98,73,85) 代表的是:只要数学成绩属于其中 的某一个就进行查询。
--此时使用的是or
select id,name,math from exam_result where math =98 or math = 73 or math=85;
- IS NULL
- IS NOT NULL
模糊查询:LIKE
--查找名字当中 包含 "三"的 学生的信息
select * from exam_result where name like '% 三%';
%代表的就是一个通配符。
- 下划线 _ 通配符
- 用途与%一样,但它只匹配单个字符,而不是多个字符
- NOT 是结合 使用的。
- 学到这了,我们来做个题练习一下
-- 查询英语不及格的同学及英语成绩 ( < 60 )
select id,name,english from exam_result where english<60;
-- 查询语文成绩好于英语成绩的同学
select id,name from exam_result where chinese>english;
-- 查询总分在 200 分以下的同学
注:where条件后不可以使用别名
select id,name,chinene+english+math as total
where chinene+english+math<200;
-- 查询语文成绩大于80分,且英语成绩大于80分的同学
select id,name,chinese,english from exam_result wher chinese>80 and english >80;
-- 查询语文成绩在 [80, 90] 分的同学及语文成绩
1: select id,name,chinese form exam_result where chinese between 80 and 90;
2: select id,name,chinese from exam_result where chinese>=80 and chinese<=90;
-- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学 及数学成绩
1:select id,name,math from exam_result where math in(58,59,98,99);
2:select id,name,math from exam_result where math=58 or math=59 or math=98 or math=99;
-- 查询 qq_mail 已知的同学姓名
select * from exam_result where qq_mail is not NULL;
分页查询Limit
开始之前先提个问题,为什么要分页?
主要是有时候,数据量太大了,那么一次性查找 数据的时候,系统会执行SQL语句,此时查询是需要时间 的。有可能系统就会被卡住!所以,一般优化的方案就是用 分页查询
原理:每次只查询当前页需要显示的数据即可。如果 每页10条数据,那么只查询10条数据。每次点击下一页的时候,又会请求 查询10条数据。这样效率就提高了!
语法:select * from exam_result limit s,n; 从偏移位置 为s的地方,取出n条数据。
举个例子 解释一下 LIMIT 2,1 的意思:
SQL 中,行号是从 0 开始的。所以 LIMIT 2,1 中, 2 是指从第三条记录开始,1
是指取一条记录。合起来就是,从第三条记录开始(包括第三条记录!),取一条记录
![在这里插入图片描述](https://img-blog.csdnimg.cn/5bc5c34e59874296ab055d12433bbdba.png
如果n的值过大,那么也没关系,只会查询到,能查询的内 容:
如果S过大 ,那么SQL不会报错,但是什么也查不到。
如果没有写S,那么默认是从0偏移开始取n个
- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT … FROM table_name [WHERE …] [ORDER BY …] LIMIT n OFFSET s;
- 更新update
– 将孙权的数学成绩,更新为99分。
`
> update exam_result set math=99 where name='孙 权';
– 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
UPDATE exam_result SET math = 60, chinese = 70
WHERE name = '曹孟德';
– 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
1、找总成绩倒数前3的同学。
2、 数学成绩加上 30 分,实际上是更新
UPDATE exam_result SET math = math + 30 ORDER BY chinese + math + english LIMIT 3;