0%

数据库chp10-数据操作

数据操作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
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%'
  • %:代替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 ⼦句列表中,或包括在聚集函数中。

示例

image-20220505235552647

  • 返回结果中的行是根据group by分为的组
  • having使用的列名staffNo包含在了聚集函数中,原因???

一些很难的例子:

image-20220506155234585

image-20220506155418758

image-20220506155931149

嵌套查询/子查询

  • 默认的情况下,⼦查询中列名取自⼦查询的 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...)

union并

difference差/except