|
@@ -1,9 +1,344 @@
|
|
|
+
|
|
|
+
|
|
|
# 单表操作
|
|
|
|
|
|
## 增删查改
|
|
|
|
|
|
+### 增
|
|
|
+
|
|
|
+```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)
|