本篇博客接上篇: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代码示例
3、删除(Delete)
3.1 delete操作注意事项
3.2 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代码示例
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 += 每页查询的记录数。
sql">-- 每页查询两条数据
-- 查询第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、新增(Create)
2.1 插入查询结果
到这里,我们已经掌握了简单查询的操作,这里讲一种新的插入方法——将查询到的数据插入到表中,即将旧表中的数据导入(复制)到一张新表中。
语法:insert into 新表名 列名 select 旧表中的列名 from 旧表名;
注意:insert语句中新表的列一定要和select子句中旧表的列相对应。
3、修改(Update)
update 表名 set 列名 = 新值 [, 列名 = 新值 ... ] [where ... ] [order ... ] [limit ... ];
- 一条update语句可以修改多个属性,多个属性间使用逗号隔开
- where为修改条件,满足条件的记录才可以被修改
- order子句的作用是排序,limit子句的作用是限制修改条数即修改多少条。
- order和limit的配合使用能够达到修改排名前多少个记录的作用。
注意:
- 使用update修改数据时,一定要加where子句来控制修改条件,否则修改的将是整张表中所有的记录,这是非常危险的操作!!!
- 如果符合where条件的有多条记录,且没有使用limit限制修改的条数,则所有符合条件的记录都将被修改!!!
3.1 SQL代码示例
注意:
如果要让数学成绩减少30分,则只能这样书写:math = math - 30;而不能这样书写:math -= 30;
sql">-- 将孙悟空同学的数学成绩变更为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;
4、删除(Delete)
delete from 表名 where条件 order by 列名 asc|desc limit n;
4.1 delete操作注意事项
使用删除操作时一定要加上where条件,否则整张表中的数据都将被删除(清空),这是一个非常危险的操作!!!
在生产环境中,我们很少使用delete操作来删除数据。
如果要删除一个数据,我们常常使用''伪删除'':一般在表中添加一个deleteState字段来做标记,0表示正常(未删除),1代表已删除,若要删除数据则使用update来更新deleteState字段,来实现删除功能,所以,这条被删除的数据仍然存在于数据库中,降低数据误删的风险。
4.2 SQL代码示例
删除英语成绩倒数前三的同学的所有考试成绩:
sql">-- 删除英语成绩倒数前三的同学的所有考试成绩
delete from exam order by english asc limit 3;
END