数据操作data manipulation,包括DDL、DML。从创建数据库到查询。SQL语言。
一些操作
database
1 | create database DBNAME |
table
1 | create table TABNAME(COL1 DATA_TYPE [primary key|unique][not null],COL2...) |
- “ [ ] ”表示其括起的内容可以省略,“ | ” 表示其隔开的两项可取其一
- 我用大写表示需要人为定义的内容,小写表示SQL既定的语句。实际中SQL语句基本不区分大小写
一些数据类型
- char(n): 固定长度的字符串
- varchar(n): 可变长度的字符串
- interval:一段时间
- integer
insert
1 | insert into TABNAME values() #insert 所有列 |
- 非数值型数据必须用单引号引起来
- 数值型一定不能用引号
delete
1 | delete from TAB #delete这个表中所有数据,但是表本身还在 |
update
1 | update TABNAME set COL1='STR' [where COL2='STR'] |
- 如果不加where判断条件,则将COL1所有项的值都修改
SQL Server
老师给的SQL Server2019,连接不上的话打开服务看看是不是SQL Server相关的服务没启动,尤其是有个什么代理。
Select
1 | select [distinct|all] 列名或表达式 |
- “*”==“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 | select..from..where COL like '%STRING%' |
- %:代替0或多个字符
- _:代替单个字符
order by
1 | select..from..order by COL1,COL2.. asc|desc |
- asc:升序
- desc:降序
- 排序结果与列名的放置先后有关
聚合查询/分组
聚合函数只能用于select列表和having子句中
- count
- sum
- avg
- min/max
行数对应问题
1 | select COL1,count(COL2) as mycount from.. |
由于COL1和mycount行数不对应,该查询语句会报错。
group by
当 WHERE ⼦句和GROUP BY 子句同时使用时,必须首先使用 WHERE ⼦句
group by可以接多个列???
having
分组过滤+条件
HAVING ⼦句使用的列名必须出现在 GROUP BY ⼦句列表中,或包括在聚集函数中。
示例

- 返回结果中的行是根据group by分为的组
- having使用的列名staffNo包含在了聚集函数中,原因???
一些很难的例子:



嵌套查询/子查询
- 默认的情况下,⼦查询中列名取自⼦查询的 FROM ⼦句中给出的表,也可通过限定列名的办法指定取自外查询的 FORM ⼦句中的表
- ⼦查询 SELECT 列表必须由单个列名或表达式组成,除非⼦查询使用了关键词EXISTS
[not] in
some|all
- some(any):子查询产生的结果中存在一个值满足条件即可
- all:子查询中所有值满足结果
1 | select..from..where COL>some(select子查询) |
- not in 与<>all等价
[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...) |