增删改查就是我们常说的CRUD:(Create,Retrieve,Update,Delete)
对应:新增数据,查询数据,修改数据,删除数据
注:常用的注释:在SQL中可以使用"-- 空格+描述"来表示注释说明…
新增(create)
insert into 表名 values(值,值...);
当然,插入的要和表结构一样
创建一张学生表:
他可以一次插入一行,也可以一次插入多行,也可以指定列插入,当然,每个都要一一对应:
单行数据 + 全列插入
多行数据 + 指定列插入
查询(Retrieve)
查找语句是SQL中最复杂的操作…
全列查找
select * from 表名;
这个 * 就叫做"通配符",表示一个表的所有列
刚才我们指定列插入的时候,没有对2和3插入email,他就是默认为空的
注意:像这种全列查找操作是一个危险的操作,如果直接在生产环境的服务器上,执行select * from 表名;很可能带来灾难,因为生产环境的保存的数据可能是非常大的,几个TB的存在,然后如果疯狂的读取硬盘的数据,瞬间就会把硬盘IO吃满,然后服务器又会立即返回响应数据,这么庞大的量,要是普通用户也要响应数据,此时服务器的硬盘和网络都被吃满了,那就只能干等着了.
指定列查询
select 列名,列名.. from 表名;
查询字段为表达式
这里先创一个表:
DROP TABLE IF EXISTS exam_result; -- 这是如果存在这张表就先删除
CREATE TABLE exam_result (
id INT,
name VARCHAR(20),
chinese DECIMAL(3,1),
math DECIMAL(3,1),
english DECIMAL(3,1)
);
插入数据:
INSERT INTO exam_result (id,name, chinese, math, english) VALUES
(1,'唐三藏', 67, 98, 56),
(2,'孙悟空', 87.5, 78, 77),
(3,'猪悟能', 88, 98.5, 90),
(4,'曹孟德', 82, 84, 67),
(5,'刘玄德', 55.5, 85, 45),
(6,'孙权', 70, 73, 78.5),
(7,'宋公明', 75, 65, 30);
期望查询结果中语文成绩比真实多10分
注意:select操作的结果是"临时表",虽然查询的结果跟原来的改变了,但他不会影响原来的数据
查询一下每个同学的总分(语文+数学+英语)
查询字段指定别名,相当于给查询的临时表指定新的列名
针对查询结果去重(distinct)
可以看下对比:
针对查询结果排序
select 列名... from 表名 order by asc/desc;
注意:asc如果省略不写,默认也是升序,desc降序
注: 有些数据记录中可能带有NULL的,默认就是最小值…
排序也可依据表达式或者别名来进行排序:
排序的时候还可以通过order by来指定多个列进行排序,先根据第一个列进行排序,如果第一个列相同,相同结果之间在通过第二个列排序…
select 中的条件查询
select 列名 from 表名 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) |
注意:1. WHERE条件可以使用表达式,但不能使用别名。
2. AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分
查询英语不及格的同学及英语成绩 ( < 60 )
查询语文成绩好于英语成绩的同学
这里指的是针对同一行的,语文和英语之间的进行比较,不涉及行和行之间的比较…
查询总分在200分以下的同学
注意:
查询语文成绩大于80分,且英语成绩大于80分的同学
查询语文成绩大于80分,或者英语成绩大于80分的同学
注意:and优先级大于or,要想打破优先级,得加括号
查询语文成绩在[80,90]分的同学及语文成绩
查询数学成绩是58 或者 59 或者 98 或者 99 分的同学及数学成绩
like:模糊查询
%代表任意个字符(也包含0个),_代表一个字符:
查找姓孙的同学成绩:
NULL的查询 is[not] null
分页查询
假设一页里面就显示 3 条记录:
修改(Update)
uptate 表名 set 列名 = 值,列名 = 值...where 条件;
这里的修改就会修改数据库服务器上的原始数据了…
将孙悟空同学的数学成绩变更为80分
将曹孟德同学的数学成绩变更为60分,语文变更为70分
将总成绩倒数前三的 3 位同学的数学成绩加上 10 分
将所有同学语文成绩更新为原来的一半
删除(Delete)
delete from 表名 where 条件;
一旦这里条件写错了,可能影响范围就会很大,如果不写条件,就会把整个表的数据都给删除掉(这个和drop table 还是不一样的,delete只是清数据,盒子还在,drop直接把盒子就删了)
删除孙悟空同学的考试成绩
总结
新增
-- 单行插入
insert into 表(字段1,...,字段N) values (value 1,....,value N);
-- 多行插入
insert into 表(字段1, ...,字段N) values
(value1,...),
(value2,...),
(value2,...);
查询
-- 全列查询
select * from 表
-- 指定列查询
select 字段1,字段2... from 表
-- 别名
select 字段1 别名1,字段2 别名2 from 表
-- 去重distinct
select distinct 字段 from 表
-- 排序order by
select * from 表 order by 排序字段
-- 条件查询where:
-- (1)比较运算符 (2)between ... and ... (3)in (4)is null (5)like (6)and (7)or (8)not
select * from 表 where 条件
修改
update 表 set 字段1 = value1,字段2 = value2... where 条件
删除
delete from 表 where 条件