目录
一、CRUD
二、新增(Create)
(1)语法
(2)单行数据+全列插入
(3)多行数据+指定列插入
三、查询(Retrieve)
(1)语法
(2)全列查询
(3)指定列查询
(4)查询字段为表达式
1、表达式不包含字段:
2、表达式包含一个字段
表结构如下:
3、表达式包含多个字段
(5)别名
(6)去重:DISTINCT
(7)排序:ORDER BY
1、语法:
2、升序
3、降序
4、使用表达式及别名排序
5、可以对多个优先级进行排序,排序优先级随书写顺序
(8)条件查询:WHERE
1、比较运算符
2、逻辑运算符
3、基本查询:
4、AND和OR:
5、范围查询
(1) BETWEEN ... AND
(2)IN
6、模糊查询:LIKE
7、NULL的查询:IS [NOT] NULL
8、分页查询:LIMIT
四、修改(Update)
案例:
-- 将孙悟空同学的数学成绩变更为 80 分
-- 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
-- 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
-- 将所有同学的语文成绩更新为原来的 2 倍
五、删除(Delete)
案例:
-- 删除孙悟空同学的考试成绩
-- 删除整张表数据
六、内容重点总结
新增编辑
查询编辑
修改编辑
删除编辑
都看到这了,点个赞再走吧,谢谢谢谢谢!!!
注释:在SQL中可以使用“--空格+描述”来表示注释说明
CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写
已有的表结构和表数据:
INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...
语法:insert into 表名 values(要插入的数据, ...)
注意:插入的数据顺序要和表结构相同,不然插入会失败
代码展示:
insert into books values('数学', '张三', 6.66, '数学类'); insert into books values('英语', '李四', 8.88, NULL);
结果如下:
语法:insert into 表名 (指定的列名, ...) values(指定列名数据)
代码展示
insert into books (name, price, sort) values('语文', 5.55, '语文类'), ('物理', 7.77, '物理类');
结果如下:
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
注意:select查询操作的全都是临时表,不会改变原本的数据
语法:select * from 表名
代码展示:
select * from books;
结果如下:
注意:通常情况下不建议使用 * 进行全列查询
-- 1. 查询的列越多,意味着需要传输的数据量越大;(要处理的信息太多,服务器可能会堵塞,大量的硬盘IO和网络IO就可能把硬盘或者网卡的宽带给吃满,一旦宽带吃满了,此时服务器就无法正常响应其他的客户端的请求了,在其他的客户端视野中,就会认为服务器挂了)
-- 2. 可能会影响到索引的使用
语法:select 指定的列名,... from 表名
代码展示:
select name, author, price from books;
结果如下:
注意:指定列查询可以不按这个表的列顺序查询,如图
语法:select 表达式, ... from books
代码演示:
select name, price, 10 from books;
结果如下
因为没有10,所以会创建一个字段10,下面都放10
语法:select 含有一个字段的表达式, ... froms 表名
代码演示:
select name, author, price + 10 from books;
结果如下:
表结构如下:
语法:select 含有多个字段的表达式,... from 表名
整型数据代码演示:
select name, chinese + math + english from report;
结果如下:
不是整型数据代码演示:
select price, name + author + sort from books;
结果如下:
可以看到,表达式包含多行字段,有只要有NULL都为NULL,字符串相加等于0的现象
语法:select 列名,... as 别名 from report
注意(as可以不加,但是加上更好,容易区分)
代码演示:
select id, chinese + math + english as 总分 from report;
结果如下:
现有的表:
语法:select distinct 列名,... from 表名
代码展示:
select distinct math from exam_result;
结果如下:
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
语法:select * (或者其他列名也可以) from 表名 order by 列名
代码展示:
select * from exam_result order by math;
结果如下:
语法:select * (或者其他列名也可以) from 表名 order by 列名 desc
代码展示:
select * from exam_result order by math desc;
结果如下:
语法:select 列名, 表达式 from 表名 order by 表达式;
代码展示:
select name, math + chinese + english as total from exam_result order by math + chinese + english;
结果如下:
注意:
这里order by后面可以使用别名
语法:select 要查询的列 exam_result order by 列名,列名...;
代码演示:
select * from exam_result order by math, english;
结果如下:
注意:where条件可以用表达式,但不可以用别名
注意:1. AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分
2. WHERE条件可以使用表达式,但不能使用别名。
如图示例:
sql语句的执行顺序:
第一步:取出一条记录(遍历表)
第二步:把记录带入条件带入条件,判断是否满足
第三步:如果条件满足,再把select指定的列取出来,并进行一些表达式运算
所以条件查询的where后面不能用别名
查询英语成绩大于70分的同学:
代码如下:
select name, english from exam_result where english > 70;
结果如下:
查询英语成绩大于语文成绩的同学:
代码如下:
select name, english, chinese from exam_result where english > chinese;
结果如下:
查询总成绩小于200的同学:
代码如下:
select name, chinese + math + english from exam_result where (chinese + math + english) < 200;
结果如下:
查询语文成绩大于80分,且英语成绩大于80分的同学
代码如下:
select name, chinese, english from exam_result where (chinese > 80) and (english > 80);
结果如下:
查询语文成绩大于80分,或英语成绩大于80分的同学
代码如下:
select name, chinese, english from exam_result where (chinese > 80) or (english > 80);
结果如下:
注意:and优先级高于or,在使用的时候,有需要可以用括号括起来
代码展示:
select * from exam_result where chinese between 80 and 90;
结果展示:
代码:
select * from exam_result where chinese >= 80 and chinese <= 90;
代码如下:
select name, math from exam_result where math in(58, 59, 98, 99);
结果展示:
这里也可以用or
代码:
select name, math from exam_result where math = 58 or math = 59 or math = 98 or math = 99;
% 匹配任意多个(包括 0 个)字符
_ 匹配严格的一个任意字符
代码展示:select name from exam_result where name like '孙%';
结果如下:
代码展示:
select name from exam_result where name like '孙_';
结果如下:
注意:%也可以这样使用:%孙,就是以“孙”结尾的字段;%孙%,只要包含“孙”的字段
_也可以这样使用:_孙,就是前面只有一个字符,结尾带“孙”的字段,下划线_也可以使用多个。
判断表里面某个列是否为NULL,或者不是NULL
代码如下:
select name from exam_result where name is not null;
结果如下:
代码如下:
select name from exam_result where name is NULL;
结果如下:
语法:
-- 起始下标为 0
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
从 0 开始,筛选 3 条结果
代码展示:
select * from exam_result limit 3;
结果如下:
从0开始,筛选3条记录,按 id 进行分页,顺序
代码展示:
select * from exam_result limit 3;
结果如下:
从3开始,筛选3条记录,按id进行分页,顺序
代码展示:
select * from exam_result order by id limit 3 offset 3;
结果如下:
语法:
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
语法:
update 表名 set 要修改的列名 = 要修改的值 where 列名 = 要指定修改的列里的值
代码如下:
mysql> update exam_result set math = 80 where name = '孙悟空';
结果如下:
代码如下:
update exam_result set math = 60, chinese = 70 where name = '曹孟德';
结果如下:
代码如下:
结果如下:
代码如下:
update exam_result set chinese = chinese * 2;
结果如下:
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
代码如下:
delete from exam_result where name = '孙悟空';
结果如下:
准备一张表,如下:
代码如下:
delete from for_delete;
结果如下: