HAVING 语句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。
SELECT release_year
FROM films
GROUP BY release_year
HAVING COUNT(title) > 200;
USING 语句
在SQL中连接两张表,如果连接的两个字段相等时,可以用USING等同于ON。
SELECT c.name AS country, continent, l.name AS language, official
FROM countries AS c
INNER JOIN languages AS l
USING(code);
SELECT c.name AS country, continent, l.name AS language, official
FROM countries AS c
INNER JOIN languages AS l
ON c.code = l.code;
SELECT INTO 语句
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
SELECT country_code, size,
CASE WHEN size > 50000000 THEN 'large'
WHEN size > 1000000 THEN 'medium'
ELSE 'small' END
AS popsize_group
INTO pop_plus
FROM populations
WHERE year = 2015;
UNION 和 UNION ALL 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SELECT code, year
FROM economies
UNION ALL
SELECT country_code, year
FROM populations
ORDER BY code, year;
INTERSECT 语句
和 UNION 指令类似,INTERSECT 也是对两个 SQL 语句所产生的结果做处理的。不同的地方是, UNION 基本上是一个 OR (如果这个值存在于第一句或是第二句,它就会被选出),而 INTERSECT 则比较像 AND ( 这个值要存在于第一句和第二句才会被选出)。UNION 是联集,而 INTERSECT 是交集。
SELECT code, year
FROM economies
INTERSECT
SELECT country_code, year
FROM populations
ORDER BY code, year;
EXCEPT 语句
EXCEPT 返回两个结果集的差(即从左查询中返回右查询没有找到的所有非重复值)。
SELECT name
FROM cities
EXCEPT
SELECT capital
FROM countries
ORDER BY name;
CROSS JOIN 交叉连接
如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;
SELECT c.name AS city, l.name AS language
FROM cities AS c
CROSS JOIN languages AS l
WHERE c.name LIKE 'Hyder%';
semi-join 和 anti-join
Semi-join通常出现在使用了exists或in的sql中,所谓semi-join即在两表关联时,当第二个表中存在一个或多个匹配记录时,返回第一个表的记录;与普通join的区别在于semi-join时,第一个表里的记录最多只返回一次;
SELECT DISTINCT name
FROM languages
WHERE code IN
(SELECT code
FROM countries
WHERE region = 'Middle East')
ORDER BY name;
而anti-join则与semi-join相反,即当在第二张表没有发现匹配记录时,才会返回第一张表里的记录;
当使用not exists/not in的时候会用到,两者在处理null值的时候会有所区别
何时选择anti-join
-
- 使用not in且相应列有not null约束
-
- not exists,不保证每次都用到anti-join
SELECT *
FROM countries
WHERE continent = 'Oceania'
AND code NOT in
(SELECT code
FROM currencies);
增、改、更、删(表的一系列操作)
1. 新建表
CREATE TABLE table_name (
column_a data_type,
column_b data_type,
column_c data_type
);
例如:
CREATE TABLE universities(
university_shortname text,
university text,
university_city text
);
2. 已有表中新增列
ALTER TABLE table_name
ADD COLUMN column_name data_type;
例如:
ALTER TABLE professors
ADD COLUMN university_shortname text;
3. 重命名列名
ALTER TABLE table_name
RENAME COLUMN old_name TO new_name;
例如:
ALTER TABLE affiliations
RENAME COLUMN organisation TO organization;
4. 删除列
ALTER TABLE table_name
DROP COLUMN column_name;
例如:
ALTER TABLE affiliations
DROP COLUMN university_shortname;
5. 迁移数据到新表
INSERT INTO ...
SELECT DISTINCT ...
FROM ...;
例如:
INSERT INTO professors
SELECT DISTINCT firstname, lastname, university_shortname
FROM university_professors;
6. 删除表
DROP TABLE table_name;
例如:
DROP TABLE university_professors;
7. 更改数据类型
ALTER TABLE table_name
ALTER COLUMN column_name
TYPE data_type_new;
例如:
ALTER TABLE professors
ALTER COLUMN firstname
TYPE varchar(64);
数据类型强制转换
SELECT CAST(some_column AS data_type)
FROM table;
例如:
SELECT transaction_date, amount + CAST(fee AS integer) AS net_amount
FROM transactions;
添加唯一约束
新增表:
CREATE TABLE table_name (
column_name UNIQUE
);
现有表:
ALTER TABLE table_name
ADD CONSTRAINT some_name UNIQUE(column_name);
例如:
ALTER TABLE organizations
ADD CONSTRAINT organization_unq UNIQUE(organization);
添加主键约束
ALTER TABLE table_name
ADD CONSTRAINT some_name PRIMARY KEY (column_name)
例如:
ALTER TABLE universities
ADD CONSTRAINT university_pk PRIMARY KEY(id);
创建一个自增主键
ALTER TABLE professors
ADD COLUMN id serial; # 新增一个类型为serial的字段
ALTER TABLE professors
ADD CONSTRAINT professors_pkey PRIMARY KEY (id);
合并字段创造一个新主键
ALTER TABLE cars
ADD COLUMN id varchar(128);
UPDATE cars
SET id = CONCAT(make, model);
ALTER TABLE cars
ADD CONSTRAINT id_pk PRIMARY KEY(id);
创建外键
ALTER TABLE a
ADD CONSTRAINT a_fkey FOREIGN KEY (b_id) REFERENCES b (id);
例如:
ALTER TABLE professors
ADD CONSTRAINT professors_fkey FOREIGN KEY (university_id) REFERENCES universities (id);