一、插入
在SQL语句中,插入数据使用的关键字是insert
insert into 表名 values(value,value...);
(1)一次插入一条记录
(2)指定列插入记录
指定列查询,需要在表名后面加上 列名
insert into 表名 (列名) values(value,value...);
(3)插入多条记录
insert插入语句还可以一次插入多行,每条记录用逗号隔开
insert into 表名 values(value,value...),(value,value...)...;
一次插多条记录比一次插一条记录,分多次插入效率更高!!!
往数据库中插入记录也不是单纯的就往硬盘里一写就完事了,也是要做一些额外的工作的,一次插入多条记录只做一次额外工作,而插入多次记录要做多次额外的工作。
二、查询
SQL 中是使用select 关键字,表示查询
(1)全列查找
select * from 表名;
* 称为通配符,表示所有的列
上述全列查询,其实是一个危险操作!!!
select * 操作,会让服务器大规模的读取磁盘上的数据,在把数据通过网卡写会到客户端
如果当前存储的数据量级非常大,就会导致读磁盘和写网卡的时间非常长,甚至于把 磁盘带宽 和 网卡 都吃满!!
(2)指定列查询
select 列名 form 表名;
这里要求和表中的列名匹配,可以同时写多个列名,中间使用,分割。
相比于上述 select * 来说,指定列查询传输数据量少了不少!!!
思考:这里的查询只能看见两列,是否以为着其他的列就被删除了呢?
📍 在查询过程中,客户端这里显示的内容只是一个 临时表 ! 临时表是根据服务器的数据生成的!!! 所有查询操作,都不会影响服务器磁盘上是数据。
(3)查询字段为表达式
一遍查,一遍计算
1.对列进行计算
这里只是影响到临时表的数据展示!!对于数据库服务的原有数据没有温和影响!!!
2.列和列之间进行计算
如果我们想要求 学生成绩 综合,我们就可以把所有列加到一起。
注意:
1、我们不能拿字符串跟数字相加,不然会报警告
拓展:我们可以通过 show warinings; 来查看警告信息!
2、查询结果,是“临时表”的数据类型,其不一定和原始的标一模一样,会尽量保证数据的正确有效性。
3.给查询结果的列起别名
在上述表达式查询过程中,临时表的列名,也就是表达式的内容,有时候比较长可读性不高,因此 SQL 允许在进行查询的时候,给临时表的列 指定 别名!
select 表达式 as 别名 from 表名;
as 可以省略,但是 代码可读性不高,容易把 total 误以为是 表达式中的一部分。
(4)去重查询
distinct 关键字,修饰某个列,针对这列的数据进行去重!!会把重复的记录,合并成一个!!
去重操作,也可以针对多个列进行。
多列去重条件:当多多个列都是相同的时候,才会去重!!
(5)排序查询
排序查询结果,使用 order by 关键字(默认为升序)!!
select 列名 表名 order by 列名1;//指定按照列名1进行排序 ~~ 默认为升序
🔻如果想要进行降序排序,在最后加上一个 desc 来表示~~
这里大家不要跟 desc 描述表结构关键字弄混
desc tables;// 描述表的结构 describe
select * from exam_result order by Chinese desc; // 排序降序 descend
🔺与 desc 对应的就是 asc 升序,但是order by 默认就是升序,所以asc 加上没啥意义。
order by 既然能根据一个列排序,那必然也能根据多个列进行排序。
select 列名 from 表名 order by 列1 , 列2...;
多列排序规则:先根据 列1 进行排序,如果 列1 有数据重复,则根据 列2 排序,一次类推。
例如:对 数学 和 语文 进行排序,先根据 数学成绩 排序,遇到相同的数学成绩,在根据 语文成绩 进行排序。
💨而上述是升序排列,而对多列进行降序排列,那我们加多个 desc
(6)条件查询
查询的时候指定筛选条件~ 用 where 关键字 来表示条件!、
select * from 表名 where 条件;
条件相当于是针对表,进行遍历~
依次取出每一条记录,带入条件,进行计算,看条件是 true 还是 false
条件成立,就把记录留下来放到结果中!
在SQL中提供一些条件运算符,分为两类:比较运算符和逻辑运算符
🌒比较运算符:
运算符 | 说明 |
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,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) |
下面根据不同的条件进行举例讲解
- 基本查询(大于、小于、不等于)
🧡 ' < ' : 查询英语成绩 不及格的同学
💛' > ' : 查询语文成绩好于英语成绩的同学,总分大于 200 的学生
这里要注意一点,where 中条件不能写 我们重新命名的列,不然会报错
这里要注意一点,where 中条件不能写 我们重新命名的列,不然会报错
💚' = ' ' <=> ' : 查询语文成绩等于数学成绩的人
注意:‘ = ’ 只能比较非空值,如果比较 null 和 null 那结果就为 null
例如:我向表中插入 insert into exam_result values('9','公孙燕',null,null,null); 这行代码
再用 ‘=’ 进行查询
大家不难发现,没有公孙燕这一行
但是我用 ‘<=>’ 进行比较时,这一行就会出现
这个两个运算符的特点,希望大家能够记住
- and 与 or
💙' and ' : 查询语文成绩大于80分,且英语成绩大于80分的同学
🤎' or ' : 查询语文成绩大于80分,或英语成绩大于80分的同学
❗注意:在SQL中 and 的优先级 比 or 更高,当一个条件里同时有 and 和 or 的时候,先算 and。
- 范围查询
💕' between...and... ' : 查询语文成绩在 [80, 90] 分的同学及语文成绩
💗' in ' : 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
🤍 ' like' 模糊查询
like 模糊查询,依赖一些 通配符 来表示要匹配的值是啥样的~
select 列名 from 表名 where 列名1 like '通配符+文字';
通配符主要分为两种
% | 匹配任意多个(包括0个)字符 |
_ | 匹配严格的一个任意字符 |
例如:查找姓 ‘孙’ 的人(匹配以 ‘孙’ 开头的)
‘%孙’ 匹配以 ‘孙’ 结尾的
‘%孙%’ 匹配内容包含‘ 孙’
查询以 ‘孙’ 开头,名字字数为 2 的人
查询以 ‘孙’ 开头,名字字数为 2 的人那就是 '孙__'。
💟null 的查询
查询 null 我们可以用 is null, 查询非 null 可以用 is not null
例如:查询语文成绩为空的人
查询数学成绩非空的人
注意:查询 null 值时不能用 = 而要用 <=>,用 = 的话 会判断为假。
例如 a = b: 等号会先判断 a 和 b 是否为null,为空表达式直接为假。若不为空,则判断 a 是否等于 b,等于为真,否为假。
(7)分页查询
分页查询 用 limit 关键字
select 列名 from 表名 limit N; -- 查询前 N 条记录 select 列名 from 表名 limit N offset M; -- 从第 M 条记录开始,查询 N 条记录(M从0开始算)
例:查询前三条记录
从第三条开始,查询三条记录
上述查询方式是可以结合在一起使用的~~
例:找出总成绩三名,且姓名不为 猪悟能
select name,Chinese + math + English as total from exam_result where name !='猪悟能' order
这里 我们需要注意一点,一般 where 是紧跟 from 后面, order by 在where 后,limit 在最后
select 列名 from 表名 (where 条件) (order by 列名 (desc)) (limie N);