# 单表操作 ## 增删查改 ### 增 ```sql /* 插入用户输入数据的记录 */ insert into testTable1 (id, name, age, joindate, note) --列名列表必须和数据保持一一对应,不插入数据的字段必须是可以为null的数据列 values (1, 'Tony', 18, '2021/04/10', 'A'), (2, '小船', 21, '2021/04/10', 'center'), (3, '航咪', 19, '2021/04/10', 'A'), (4, '小连', 23, '2021/04/10', 'A'), (5, 'JoJo', 23, '2021/04/10', 'N'), (6, '大龙', 20, '2021/04/10', 'A'), (7, '星星', 23, '2021/04/10', 'A'), (8, '妖僧', 24, '2021/04/10', 'B'), (9, '隽宝', 24, '2021/04/10', 'A') /* 从数据库表中插入数据 */ --创建临时表 create table #temp ( id int not null primary key, name nvarchar(50) not null, age int not null, joindate date null, note nvarchar(50) null ) insert into #temp --括号和字段列表可省略;当省略括号和字段时,插入数据必须与字段一一对应 values (10,'厂花', 23, '2021/04/10', 'N') --插入数据 insert into testTable1 select * from #temp --插入其他表中已有数据时,两张表的数据结构必须相同 /* 自动创建表并添加数据 */ select * into #testInsert --执行前表#testInsert不能存在,执行后会自动创建表并将testTable1的数据结构和行数据都复制给#testInsert from testTable1 select * from #testInsert order by id ``` 插入记录后的结果 ![](./static/images/03_insert_01.png) 新建并插入数据后的结果 ![](./static/images/03_insert_02.png) ### 删 ```sql delete from testTable1 where id > 9 --如果不填写where条件,则删除表中所有行数据 ``` 删除 id > 9 的记录后的结果 ![](./static/images/03_delete_01.png) ### 查 ```sql /* 查询行数据 */ select id, name, age, joindate, note --选择要查询的字段,用*表示所有字段 from testTable1 where age > 20 --筛选出符合条件的数据 order by id --默认升序排序 /* 汇总查询 */ select note as 等级, avg(age) 平均年龄 --可以在查询结果中重命名列,在列名后面空格[+as]+新列名;分组查询时,结果列必须为 group by 后面的列,或者被聚合函数处理的列 from testTable1 group by note --按照note列对行数据进行分组,结果为分组汇总数据,而不是行数据 having note in ('A', 'B', 'C', 'N') --对分组后的数据进行筛选 /* 去重查询 */. select distinct age, joindate --distinct 关键字会匹配后面的所有列 from testTable1 order by age /* 查询处理后的数据 */ select id, 'xls-'+name name, --拼接字符串 (case when age > 18 then 1 else 0 end) 是否成年, --通过判断数据获取某种结果 datediff(day, joindate, getdate()) 时间间隔, --通过函数获取结果 note from testTable1 ``` 查询年龄大于20的记录 ![](./static/images/03_select_01.png) 分组汇总的结果 ![](./static/images/03_select_02.png) 去重查询的结果 ![](./static/images/03_select_03.png) 查询处理后的结果 ![](./static/images/03_select_04.png) ### 改 ```sql /* 自定义更新后的值 */ update testTable1 set note = 'A', name = '船船子' --可同时更新多个字段 where name like '%船%' --如果不填写where条件,更新表中所有行的备注为'A',where条件筛选出数据库表中 name 包含“船”的记录 /* 更新为空 */ update testTable1 set note = null -- set 值为空时用 "=" ,不用 is ,和 where 条件区别开 where id = 9 ``` 更新 name 包含“船”的记录后的结果 ![](./static/images/03_update_01.png) 更新备注为空后的结果 ![](./static/images/03_update_02.png) ## where条件 ### 比较 ```sql --唯一确定 select * from testTable1 where id = 5 --需要根据主键或唯一索引才能唯一确定一条数据 --不相等 select * from testTable1 where note <> 'A' --<> 和 != 都是不等于,是等价的 select * from testTable1 where note != 'N' --大小 select * from testTable1 where age > 20 ``` ![](./static/images/03_where_01.png) ### 集合 ```sql --在某个集合中 select * from testTable1 where name in ('Tony', '小船') select * from testTable1 where age between 18 and 21 --between and 包含两个边界值,相当于闭区间 --不在某个集合中 select * from testTable1 where note not in ('B', 'C', 'N') select * from testTable1 where age not between 18 and 21 --和 between and 相反,相当于闭区间的补集 ``` ![](D:\软件安装目录\Typora\images\03_where_02.png) ### 字符匹配 ```sql --更多种格式见通配符一节 --符合某种格式 select * from testTable1 where name like '%小%' --筛选名字中包含"小"的记录 --不符合某种格式 select * from testTable1 where name not like '__' --筛选名字不是两个字符的记录 ``` ![](./static/images/03_where_03.png) ### 空值 ```sql --取为空的记录 select * from testTable1 where note is null --取不为空的记录 select * from testTable1 where note is not null ``` ![](./static/images/03_where_04.png) ### 逻辑 ```sql --优先级:() > not > and > or --1:备注为B或N 或 id在前五且年龄大于22 select * from testTable1 where note not in ('A', 'center') or not(id > 5) and age > 22 --2:(备注为B或N)或id在前五 且 年龄大于22 select * from testTable1 where (note not in ('A', 'center') or not(id > 5)) and age > 22 --3:(备注为B或N)且id在前五 或 年龄大于22 select * from testTable1 where note not in ('A', 'center') and not(id > 5) or age > 22 --4:备注为B或N 且 id在前五或年龄大于22 select * from testTable1 where note not in ('A', 'center') and (not(id > 5) or age > 22) ``` 表中数据: ![](./static/images/03_where_05.png) 查询结果: ![](./static/images/03_where_06.png) ## 通配符 在查询数据库中的数据时,配合 **like** 运算符一起使用,用于匹配符合某种格式的数据。 通配符可以替代一个或多个字符。 在 SQL 中,可使用以下通配符:_、%、[]、[^]或[!]。 ### _ "_"表示一个字符 ```sql select * from testTable1 where note not like '_' --匹配 note 不是一个字符的数据 select * from testTable1 where name like '_o__' --匹配第二个字符为 o 总共4个字符的数据 select * from testTable1 --即使不是字符类型的列也可以匹配 where age like '1_' --匹配第一个字符是1开头且只有两个字符的数据 ``` ![](./static/images/03_character_01.png) ### % "%"表示0或n个字符 ```sql select * from testTable1 where name like 'J_%' --匹配 name 列以 J 开头,至少有两个字符的数据 select * from testTable1 --匹配时也会匹配null值 where age not like '%3%' --匹配 age 列不包含3的数据 select * from testTable1 --匹配时不区分大小写 where note like 'C%' --匹配 note 列以 C 开头的数据 ``` ![](./static/images/03_character_02.png) ### [] "[]"判断某个字符是不是子字符列表中的某个值 ```sql select * from testTable1 where name like '[大小宝]_' --匹配 name 列第一个字是 大或小或宝 ,共有两个字符的数据 select * from testTable1 where age like '%[13579]%' --匹配 age 列中包含奇数的数据 select * from testTable1 where note not like '%[mn]%' --匹配 note 列不包含mn的数据 ``` ![](./static/images/03_character_03.png) ### [^] 或 [!] "[^]"或"[!]"判断某个字符是否不等于字符列表中的值 ```sql select * from testTable1 where name like '%[^龙妖]%' --匹配 name 列中不包含 龙和妖 的数据 select * from testTable1 where age like '[^1]%' --匹配 age 列不以1开头的数据 select * from testTable1 where note not like '[!abc]' --匹配 note 列为 A或B或C 的数据,双重否定等于肯定 ``` ![](./static/images/03_character_04.png)