1. CRUD
CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写,就是数据库基本操作中针对表的一系列操作.
2. 新增(create) -->insert
语法:
insert into 表名 [列名1,列名2...] values (val1,val2...)
[注意]
- 列名可以没有,如果没有列名,所有的列都应该插入,即val包含所有列的值.
- 后面的val必须和前面的列名对应.
- 各个数据之间用,隔开.
2.1 单行数据+全列插入
insert into emp values (null,'张十一','java程序员',16000);
在这里我们看到,salary一列原生是decimal类型的数据,但是我们这里在插入的时候salary一列输入的是int类型的数据,也插入成功了,这是因为sql对int类型进行了隐式类型转换 这里我们就提到了sql语言的特性:
sql语言是一种弱类型的语言,在一种语言中越支持隐式类型转换,类型越弱.
2.2 多行插入+指定列插入
insert into emp (id,name,role) values(8,'李十二','测试工程师');
3. 查询(retrieve) -->select
语法:
select 列名1,列名2(或是表达式) from 表名
3.1 全列查询 -->*
select * from emp
查询该表中所有数据
[注意]
这是一个危险的操作,虽然这个操作在现在看来没有什么异样,但是如果数据非常多,这个操作很容易造成损失,这种查询引起服务器的响应之后,返回的数据量非常大,会把网络带宽吃满 ,导致别的客户端出现异常.
3.2 指定列查询
select id,name from emp;
查询id和name两列数据
3.3 查询字段为表达式
select id ,name,role,salary+100 from emp;
查询的时候返回的结果集为所有人的工资加100
[注意]
查询的所有操作都不会对原生存在硬盘上的数据进行改变,这里虽然是在原来的薪水加上了100,但是只是返回的结果加上了100,返回的结果是一张临时表.
3.4 别名 -->as
语法:
select 列名 as 别名 from 表名;
select id ,name , chinese+math+english as total from student;
返回所有学生的总成绩,并设置为total
3.5 去重 -->distinct
语法:
select distinct 列名 from 表名;
select distinct chinese from student;
上述结果我们看到返回的值把周八那一行的语文成绩去重.
当然我们也可以对多列进行去重:
select distinct chinese,math from student;
3.6 排序 -->order by
语法:
asc为升序,desc为降序,默认为asc
select 列名 from 表明 order by 列名 [升降序]
select * from student order by math desc;
我们看到,学生们的顺序按数学成绩的降序排列了起来.
[注意]
- 没有order by的句子返回的查询,返回的顺序都是未定义的,永远不要依赖这个顺序.
- NULL数据排序的时候,视为比任何数据都小.升序在上面,降序在下面.
- 可以使用表达式或者别名 进行排序.
select id,name,chinese+math+english as total from student order by total ;
把学生的成绩按照总分升序排序.
- 可以对多个字段进行排序,优先级随书写顺序 .
select * from student order by chinese,math;
这里我们看到田七和周八的语文成绩是一样的,最后按math排序.田七在周八的后面.
3.7 条件查询 -->where
比较运算符:
运算符 | 说明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, ...) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
逻辑运算符:
运算符 | 说明 |
---|---|
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1),结果为 FALSE(0) |
[注意]
- where可以使用表达式,但是不可以使用别名 .
原因: 是执行顺序的缘故,遍历表-->带入条件-->计算列名中的表达式,定义别名-->排序,聚合,
定义别名在带入条件的后面,所以无法识别. - AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分.
案例:
- 基本查询
select * from student where english < 100;
查询英语成绩小于100的同学.
select * from student where chinese+math+english<320;
查询总分小于320的同学
- and 和 or
select * from student where chinese+math+english<320 and math>=120;
查询总分小于320但数学成绩大于等于120的同学
select * from student where chinese+math+english<320 or math>=120;
查询总分小于320和数学成绩大于等于120的同学
- 范围查询
- between...and...
select * from student where math between 100 and 110;
查询数学成绩在100~110之间的同学 - in
针对每个记录,带入到条件中,看当前这个数值是否在( )描述的集合中存在.
select * from student where math in (120,133);
- between...and...
- 模糊查询 -->like
select name from student where name like '周%';
%代表的是一个或者多个字符,找到所有姓周的人.select name from student where name like '周_';
找到姓周但是是两个字的名字.
3.8 分页查询-->limit
这个语法限制了最多返回多少条记录 .
语法:
select 列名 from 表名 limit n 限制返回的记录为n
select 列名 from 表名 limit n offset s 从s开始查询,返回n条记录
案例:
select name,math+chinese+english as total from student order by total desc limit 3;
查询班级前三名
select name,math+chinese+english as total from student order by total desc limit 3 offset 1;
查询班级总成绩2~4名
4. 修改 -->update
语法:
update 表名 set 列名=表达式 限制条件
案例:
update student set english=92 where name='周八';
把周八的英语成绩改成92update student set english= english+10;
将所有人的英语成绩加10分
5. 删除 -->delete
语法:
delete from 表名 限制条件
案例:
delete from student where name ='周八';
删除周八的成绩