数据操作data manipulation,包括DDL、DML。从创建数据库到查询。SQL语言。
一些操作
database
table
1
| create table TABNAME(COL1 DATA_TYPE [primary key|unique][not null],COL2...)
|
- “ [ ] ”表示其括起的内容可以省略,“ | ” 表示其隔开的两项可取其一
- 我用大写表示需要人为定义的内容,小写表示SQL既定的语句。实际中SQL语句基本不区分大小写
一些数据类型
- char(n): 固定长度的字符串
- varchar(n): 可变长度的字符串
- interval:一段时间
- integer
insert
1 2
| insert into TABNAME values() #insert 所有列 insert into TAB(COL1, COL2...) values(VAL1, VAL2...) #insert必须要有的数据
|
- 非数值型数据必须用单引号引起来
- 数值型一定不能用引号
delete
1 2
| delete from TAB #delete这个表中所有数据,但是表本身还在 delete from TAB [where...]
|
update
1
| update TABNAME set COL1='STR' [where COL2='STR']
|
- 如果不加where判断条件,则将COL1所有项的值都修改
SQL Server
老师给的SQL Server2019,连接不上的话打开服务看看是不是SQL Server相关的服务没启动,尤其是有个什么代理。
Select
1 2 3 4 5
| select [distinct|all] 列名或表达式 from TABNAME [where] [group by COL][having] [order by COL [asc|desc]]
|
- “*”==“all columns”
- as 给列命为新的名字
- 听说select返回的都是view/table?所以可以将select结果作为一列?
distinct
1
| select distinct COLNAME from TABNAME
|
返回选中列的不重复的
计算
数值型的列可以直接做算数运算,eg.
1
| select COL1+COL2 as sum,COL3*2 as mult from TABNAME
|
where
对每一行进行判断condition
> ,<, =, <>
between...and...
数值区间、时间区间
in, not in
+select结果
and, or
连接条件
is null, is not null
[not] exists
like
1 2
| select..from..where COL like '%STRING%' select..from..where COL like '_STRING%'
|
order by
1
| select..from..order by COL1,COL2.. asc|desc
|
- asc:升序
- desc:降序
- 排序结果与列名的放置先后有关
聚合查询/分组
聚合函数只能用于select列表和having子句中
行数对应问题
1
| select COL1,count(COL2) as mycount from..
|
由于COL1和mycount行数不对应,该查询语句会报错。
group by
当 WHERE ⼦句和GROUP BY 子句同时使用时,必须首先使用 WHERE ⼦句
group by可以接多个列???
having
分组过滤+条件
HAVING ⼦句使用的列名必须出现在 GROUP BY ⼦句列表中,或包括在聚集函数中。
示例
![image-20220505235552647](http://hexo-git.oss-cn-beijing.aliyuncs.com/img/image-20220505235552647.png)
- 返回结果中的行是根据group by分为的组
- having使用的列名staffNo包含在了聚集函数中,原因???
一些很难的例子:
![image-20220506155234585](http://hexo-git.oss-cn-beijing.aliyuncs.com/img/image-20220506155234585.png)
![image-20220506155418758](http://hexo-git.oss-cn-beijing.aliyuncs.com/img/image-20220506155418758.png)
![image-20220506155931149](http://hexo-git.oss-cn-beijing.aliyuncs.com/img/image-20220506155931149.png)
嵌套查询/子查询
- 默认的情况下,⼦查询中列名取自⼦查询的 FROM ⼦句中给出的表,也可通过限定列名的办法指定取自外查询的 FORM ⼦句中的表
- ⼦查询 SELECT 列表必须由单个列名或表达式组成,除非⼦查询使用了关键词EXISTS
[not] in
some|all
- some(any):子查询产生的结果中存在一个值满足条件即可
- all:子查询中所有值满足结果
1
| select..from..where COL>some(select子查询)
|
[not] exists
仅用于子查询中
1
| select..from..where exists(select...)
|
多表查询
1
| select a.COL,b.COL from TAB1 a,TAB2 b where a.COL=b.COL
|
join..on
1
| select a.COL,b.COL from TAB1 a join TAB2 b on a.COL=b.COL
|
- left join:最大程度保留前一个表
- right join:后
- full join:保留全部,以空值填充
join..using
1
| select a.COL,b.COL from TAB1 a join TAB2 b using COL
|
条件的书写形式与join on不同
cross..join
笛卡尔积?
交并差
- 可用标准的并、交和差集合操作,将多个查询结果表合并成⼀个查询结果表。
- 两个表必须有并相容性,即有相同结构(列类型相同)。
1
| union|intersect|difference [all]|[corresponding [by COL1...]]
|
all
查询包括一切的重复行
corresponding
- corresponding:集合操作就在两表共同的列上执⾏
- corresponding by COL:集合操作在给定的列上执⾏
intersect交
1
| (select...) intersect (select...)
|
union并
difference差/except