笔记:SQL查漏补缺

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

    1. 使用not in且相应列有not null约束
    1. 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);
发布了11 篇原创文章 · 获赞 0 · 访问量 680

猜你喜欢

转载自blog.csdn.net/weixin_42871941/article/details/104873830