本篇博客接上篇:MySQL:表的增删查改——CRUD(一)-CSDN博客
目录
1、查询(Retrieve)
1.1 条件查询:WHERE
1.1.1 比较运算符
1.1.2 逻辑运算符
1.1.3 查询语句的执行顺序
1.1.3 SQL代码示例
1.2 分页查询:LIMIT
2、修改(Update)
2.1 SQL代码示例
1、查询(Retrieve)
1.1 条件查询:WHERE
语法:select 列名/表达式 from 表名 where 列名/表达式 运算符 条件
1.1.1 比较运算符
- = 号,既可用来比较是否相等,可以用来赋值;但是,NULL比较特殊,不可使用 = 号来比较是否为NULL。
- 若要比较值是否为NULL,需要 <=> 号,或者 IS NULL (是NULL返回1表示true,否则返回0表示false)与 IS NOT NULL(不是NULL返回true(1),否则返回false(0))。
- != 和 <> 均用来判断两者是否不相等。
- BETWEEN a0 AND a1,表示范围为[a0,a1],左闭右闭。
- IN (a1,a2,...) 若存在小括号中的值则返回true(1),否则返回false(0)。
- LIKE 表示模糊匹配。%表示0个或任意多个字符,_ 表示任意一个字符,_ _ 表示任意两个字符,.......
1.1.2 逻辑运算符
这里的逻辑运算符与Java、Cpp中的运算符含义相同。
- AND 相当于 &&
- OR 相当于 ||
- NOT 相当于 !
逻辑运算符之间具有优先级关系,其中NOT(逻辑非)> AND(逻辑与)> OR(逻辑或),但不建议特意记,建议编码时使用小括号手动指定优先级,提高可读性。
1.1.3 查询语句的执行顺序
查询时可配合去重、排序、条件一起使用,但是在where子句中,我们对于列名/表达式不能使用别名给出条件,这跟SQL语句的执行顺序有关。
当我们将别名换成表达式后就能够正常执行:
但是我们看到,order子句可以使用别名,其实这跟SQL语句的执行顺序有关:
- 通过from找到要查的表
- 通过where子句筛选出符合条件的数据行(此时还没有完成select子句中别名的定义,不能使用别名)
- 通过select子句抽选出指定的列或生成相应的表达式(此时才完成别名的定义)
- 通过order子句排序(此时已完成select子句中别名的定义,可以使用别名)
1.1.3 SQL代码示例
-- 基本查询
-- 查询英语不及格的同学及英语成绩
SELECT name,english FROM exam WHERE english < 60;
-- 查询语文成绩好于英语成绩的同学
SELECT name,chinese,english FROM exam WHERE chinese > english;
-- 查询总分在 200 分以下的同学
SELECT name,chinese+math+english 总分 FROM exam WHERE chinese+math+english < 200;
-- AND与OR
-- 查询语文成绩大于80分,且英语成绩大于80分的同学
SELECT name,chinese,english FROM exam WHERE chinese > 80 AND english > 80;
-- 查询语文成绩大于80分,或英语成绩大于80分的同学
SELECT name,chinese,english FROM exam WHERE chinese > 80 OR english > 80;
-- 范围查询
-- 查询语文成绩在 [80, 90] 分的同学及语文成绩
SELECT name,chinese FROM exam WHERE chinese BETWEEN 80 AND 90;
SELECT name,chinese FROM exam WHERE 80 <= chinese AND chinese <= 90;
-- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
SELECT name,math FROM exam WHERE math IN (58,59,98,99);
SELECT name,math FROM exam WHERE math = 58 OR math = 59 OR math = 98 OR math = 99;
-- 模糊查询:LIKE
-- % 匹配任意多个(包括0个)字符
SELECT * FROM exam WHERE name LIKE '孙%';
-- _ 匹配严格的一个任意字符
SELECT * FROM exam WHERE name LIKE '孙_';
-- NULL 的查询
-- IS [NOT] NULL
SELECT * FROM exam WHERE id IS NULL;
SELECT * FROM exam WHERE id <=> NULL;
SELECT * FROM exam WHERE id IS NOT NULL;
1.2 分页查询:LIMIT
我们之前所学的查询都是不限制记录条数的查询,其实这样的查询是非常危险的,因为在生产环境中,表中存储着大量的数据,不限制条数的查询会造成占用大量资源,非常的不安全。
而分页查询就是能够限制查询的条数,能够有效的减少数据库服务器的压力,分页查询的使用也是非常的多,我们也常常见到分页查询:
分页查询语法:
分页查询的同样可以配合顺序、条件查询一起使用,其前面的语法与我们之前所学查询语法相同,知识在结尾处加上LIMIT关键字,表示限制查询的条数。
表中记录的起始下标为0。
分页查询共有3种语法规则:
- SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n; 这里LIMIT 后的n指:(默认)从第0行开始查询,共查询n条记录。
- SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n; 这里LIMIT 后的s,n指:从第s行开始查询,共查询n条记录。
- SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;这里LIMIT 后的n指:共查询n条记录。这里OFFSET 后的s指:从第s行开始查询。
示例:
- 示例1:
- 示例2:
如果每页都有相同的查询条数,则当前页数查询的起始行数s = (当前页数-1)*每页查询的记录数。
或者记忆为:s += 每页查询的记录数。
-- 每页查询两条数据
-- 查询第1页
select * from exam order by id asc limit 0,2;
-- 查询第2页
select * from exam order by id asc limit 2,2;
-- 查询第3页
select * from exam order by id asc limit 4,2;
-- 查询第4页
select * from exam order by id asc limit 6,2;
2、修改(Update)
update 表名 set 列名 = 新值 [, 列名 = 新值 ... ] [where ... ] [order ... ] [limit ... ];
- 一条update语句可以修改多个属性,多个属性间使用逗号隔开
- where为修改条件,满足条件的记录才可以被修改
- order子句的作用是排序,limit子句的作用是限制修改条数即修改多少条。
- order和limit的配合使用能够达到修改排名前多少个记录的作用。
注意:使用update修改数据时,一定要加where子句来控制修改条件,否则修改的将是整张表中所有的记录,这是非常危险的操作!!!
2.1 SQL代码示例
注意:
如果要让数学成绩减少30分,则只能这样书写:math = math - 30;而不能这样书写:math -= 30;
-- 将孙悟空同学的数学成绩变更为80分
UPDATE exam SET math = 80 WHERE NAME = '孙悟空' ;
-- 将曹孟德同学的数学成绩变更为60分,语文成绩变更为70分
UPDATE exam SET math = 60,chinese = 70 WHERE name = '曹孟德';
-- 将数学成绩前三名的同学的数学分数减30分
UPDATE exam SET math = math - 30 ORDER BY math DESC LIMIT 3;
-- 将语文成绩低于50分的同学的语文分数变为原来的2倍
UPDATE exam SET chinese = chinese*2 WHERE chinese < 50;
END