SQL
1 基本概念
DBMS(Datebase Managment System)
DBS(Datebase System)
DBA(Datebase Administrator)
1.1 SQL分类
-
Data Definition Language(DDL)
-
Data Manipulation Language(DML)
-
Data Control Language(DCL)
-
数据库(database)
- 保存有组织的数据的容器(通常是一个文件或一组文件)。 -
数据表(table)
- 某种特定类型数据的结构化清单。 -
模式(schema)
- 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。 -
列(column)
- 表中的一个字段。所有表都是由一个或多个列组成的。 -
行(row)
- 表中的一个记录。 -
主键(primary key)
- 一列(或一组列),其值能够唯一标识表中每一行。
关系型数据库关系型数据库(RDB,Relational Database)就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系(一对一、一对多、多对多)。
2 创建表
create table <table_name>( |
primary key vs unique
-
主键只能有一个
-
主键属性不能为NULL
-
UNQIUE可以为NULL
-
NOT NULL
- 指示某列不能存储 NULL 值。 -
UNIQUE
- 保证某列的每行必须有唯一的值。 -
PRIMARY KEY
- NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。 -
FOREIGN KEY
- 保证一个表中的数据匹配另一个表中的值的参照完整性。 -
CHECK
- 保证列中的值符合指定的条件。 -
DEFAULT
- 规定没有给列赋值时的默认值。
3 Select查询
DISTINCT
用于返回唯一不同的值。它作用于所有列,也就是说所有列的值都相同才算相同。
LIMIT
限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。
#属性重命名 |
运算符 | 描述 |
---|---|
= | 等于 |
<> | 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 != |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE/not like | 搜索某种模式,%(any string) _(any character) |
IN | 指定针对某个列的多个可能值 |
AND/OR.NOT |
3.1 查询结果重排序
-
ascending (ASC):升序
-
descending(DESC)
select * from sells where bar='' order by price ASC; |
3.2 子查询
子查询就是指将一个
select
查询(子查询)的结果作为另一个 SQL 语句(主查询)的数据来源或者判断条件。子查询可以被用作a value or set
子查询可以用在from和where子句中
子查询可以嵌入 SELECT
、INSERT
、UPDATE
和 DELETE
语句中,也可以和 =
、<
、>
、IN
、BETWEEN
、EXISTS
等运算符一起使用。
子查询常用在 WHERE
子句和 FROM
子句后边:
-
当用于
WHERE
子句时,根据不同的运算符,子查询可以返回单行单列、多行单列、单行多列数据。子查询就是要返回能够作为WHERE
子句查询条件的值。 -
当用于
FROM
子句时,一般返回多行多列数据,相当于返回一张临时表,这样才符合FROM
后面是表的规则。这种做法能够实现多表联合查询。
3.2.1 IN
<tuple> IN (<subquery>) |
3.2.2 EXISTS
EXISTS(<subquery>) is true if and only if the subquery result is not empty. |
3.2.3 ANY
x = ANY(<subquery>) is a boolean condition that is true iff x equals at least one |
3.2.4 ALL
x <> ALL(<subquery>) is true iff for every tuple t in the relation, x is not equal to |
3.2.5 Bag语义
-
Sslect-from-where:bag semantics
-
union 、intersection、difference:set semantic
3.2.6 控制Duplicate Elimination
Force the result to be a set by SELECT DISTINCT . . . |
4 连接(join)
SQL JOIN 子句用于将两个或者多个表联合起来进行查询。连接表时需要在每个表中选择一个字段,并对这些字段的值进行比较,值相同的两条记录将合并为一条。连接表的本质就是将不同表的记录合并起来,形成一张新表。当然,这张新表只是临时的,它仅存在于本次查询期间。
Drinkers(name, addr) |
inner join:2表值都存在
outer join:附表中值可能存在null的情况。
①A inner join B:取交集
②A left join B:取A全部,B没有对应的值,则为null
③A right join B:取B全部,A没有对应的值,则为null
④A full outer join B:取并集,彼此没有对应的值为null
连接类型 | 说明 |
---|---|
INNER JOIN 内连接 | (默认连接方式)只有当两个表都存在满足条件的记录时才会返回行。 |
LEFT JOIN / LEFT OUTER JOIN 左(外)连接 | 返回左表中的所有行,即使右表中没有满足条件的行也是如此。 |
RIGHT JOIN / RIGHT OUTER JOIN 右(外)连接 | 返回右表中的所有行,即使左表中没有满足条件的行也是如此。 |
FULL JOIN / FULL OUTER JOIN 全(外)连接 | 只要其中有一个表存在满足条件的记录,就返回行。 |
SELF JOIN | 将一个表连接到自身,就像该表是两个表一样。为了区分两个表,在 SQL 语句中需要至少重命名一个表。 |
CROSS JOIN | 交叉连接,从两个或者多个连接表中返回记录集的笛卡尔积。 |
where>group by>having>order by
添加更新
if not exists (select 1 from t where id = 1)
insert into t(id, update_time) values(1, getdate())
else
update t set update_time = getdate() where id = 1
5 外键约束
外键约束的作用是维护表与表之间的关系,确保数据的完整性和一致性。
主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性
外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的。所以说,如果谈到了外键,一定是至少涉及到两张表。例如下面这两张表:
6 聚合函数
sum、avg、count、min、max:can be applied to a column in
a SELECT clause to produce that aggregation on the column
使用 DISTINCT
可以让汇总函数值汇总不同的值。
7 分组(group by)
SELECT-FROM-WHERE-GROUP BY
查询出的关系
If any aggregation is used, then each element of the SELECT list
must be either:
-
Aggregated, or
-
An attribute on the GROUP BY list.
8 HAVING
SELECT-FROM-WHERE-GROUP BY-HAVING
-
having
用于对汇总的group by
结果进行过滤。 -
having
一般都是和group by
连用。 -
where
和having
可以在相同的查询中。
9 组合
9.1 union、intersection、except
满足任一条件满足所有条件满足指定条件(排除满足条件的部分)
From Likes(drinker, beer) and Sells(bar, beer, price), Find the beer which is the favorite of ‘Lynn Conway’ or the price is above 40
(SELECT beer FROM Likes |
10 数据库修改
INSERT INTO <relation>(属性列表) VALUES ( <list of values>); |
11 第一范式、第二范式、第三范式、BCNF
-
第一范式:列不可再分,要求数据库表的每一列都是不可分割的原子数据项。
-
第二范式:建立在第一范式基础上,消除部分依赖。确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
-
第三范式:建立在第二范式基础上,消除传递依赖。第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。