数据库操作DML
CREATE TABLE
CREATE TABLE
语句用于创建数据库中的表。语法是:
1 | CREATE TABLE 表名称 ( |
例:
1 | CREATE TABLE user ( |
注意:字段类型char
和varchar
区别:
- 容纳固定长度的字符串。
- 容纳可变长度的字符串。
CONSTRAINT
约束、限制,常见的约束如下:
CHECK
(检查约束)NOT NULL
(非空约束)UNIQUE
(唯一约束)Primary Key
(主键)Foreign Key
(外键)
例:
1 | -- 各种约束的使用示例 |
ALTER TABLE
ALTER TABLE
用来添加,删除或修改现有表中的列,也可以用来添加和删除现有表上的各种制约因素。语法如下:
1 | -- 现有表中添加一个新的列 |
DROP TABLE
DROP TABLE
语句是用来删除表定义及其所有相关的数据表的索引,规则,触发器和约束。语法如下:
1 | DROP TABLE table; |
TRUNCATE TABLE
TRUNCATE TABLE
命令用于从现有的表删除完整的数据。在每个表上的DELETE(删除)具有相同的效果,但是,因为它没有实际扫描的表,它的速度快。语法如下:
1 | TRUNCATE TABLE table; |
DELETE FROM
DELETE FROM
用来从一个表中删除现有的记录。可以使用WHERE子句DELETE查询删除所选行,否则所有的记录会被删除。语法如下:
1 | DELETE FROM table WHERE [condition]; |
INSERT INTO
INSERT INTO
语句允许一个到一个表中插入新行。一个可以作为一个查询的结果,在一个时间或几行插入一行。基本语法如下:
1 | INSERT INTO table (column1, column2, column3,...columnN)] |
注:
1.这里 column1, column2,…columnN是要插入数据的表中的列名。
- 可以以任何顺序列出目标列名。 VALUES子句或查询的值都与显式或隐式的列列表从左到右。
如果要添加表中的所有列的值,可能不需要在SQL查询中指定列(次)名称。但要确保表中是在相同的顺序的列值的顺序。INSERT INTO语法如下:
1 | INSERT INTO table VALUES (value1,value2,value3,...valueN); |
UPDATE
UPDATE
被用来修改现有的表中的记录。可以使用UPDATE
查询的WHERE
子句更新选定行,否则会被更新的所有行。基本语法如下:
1 | UPDATE table SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition]; |
SQL基础
SELECT
1 | SELECT column FROM table; |
DISTINCT
找出表内的不同值的情况。
1 | SELECT DISTINCT column FROM table; |
例:
1 | SELECT DISTINCT id, email FROM user; |
WHERE
1 | SELECT column FROM table WHERE [condition]; |
AND / OR
1 | SELECT column FROM table WHERE [condition1] [AND|OR] [condition2]; |
IN / NOT IN
1 | SELECT column FROM table WHERE column IN ('value1', 'value2', ...); |
例:
1 | SELECT * FROM user WHERE user_name IN ('张三', '李四'); |
BETWEEN … AND …
1 | SELECT column FROM table WHERE column BETWEEN 'value1' AND 'value2'; |
例:
1 | SELECT * FROM user WHERE age BETWEEN 18 AND 25; |
LIKE
1 | SELECT column FROM table WHERE column LIKE {模式}; |
例:
1 | SELECT * FROM user WHERE user_name LIKE '%张%'; |
ORDER BY
1 | SELECT column FROM table [WHERE condition] ORDER BY column [ASC, DESC]; |
注:ASC(默认)代表结果会以由小往大的顺序列出,而DESC代表结果会以由大往小的顺序列出。
例:
1 | SELECT user_name, email, age FROM user ORDER BY age DESC; |
GROUP BY
1 | SELECT column1, SUM(column2) FROM table GROUP BY column1; |
例:
1 | SELECT user_name, SUM(age) FROM user GROUP BY user_name; |
HAVING
对函数产生的值来设定条件。
1 | SELECT column1, SUM(column2) FROM table GROUP BY column1 HAVING [condition]; |
例:
1 | SELECT user_name, SUM(ages) FROM user GROUP BY user_name HAVING SUM(age) > 1500; |
ALIAS
SELECT ‘表别名’.’列名’ AS ‘列别名’ FROM table AS ‘表别名’;
例:
1 | SELECT u.user_name AS name, sum(age) ages FROM user AS u GROUP BY u.store_name; |
函数
AVG
(平均)COUNT
(计数)MAX
(最大值)MIN
(最小值)SUM
(总合)
1 | SELECT fun_name(column) FROM table; |
例:
1 | SELECT count(u.id) AS user_count FROM user AS u; |
表连接
INNER JOIN: 如果表中有至少一个匹配,则返回行;
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行;
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行;
FULL JOIN: 只要其中一个表中存在匹配,就返回行。
例:
1 | SELECT u.uesr_name, c.corp_name FROM user AS u LEFT JOIN corp AS c ON c.id = u.corp_id; |
SQL进阶
UNION / UNION ALL
UNION
用于合并两个或多个SELECT语句的结果,不返回任何重复的行。UNION ALL
运算符语句,则包括重复行的结果。使用UNION,每个SELECT选择的列数必须具有相同的,相同数目的列表达式相同的数据类型,并让它们在相同的顺序,但它们不必是相同的长度。语法如下:
1 | SELECT column1 [, column2 ] |
INTERSECT / INTERSECT ALL
和UNION
指令类似,INTERSECT
也是对两个SQL语句所产生的结果做处理的。不同的地方是,UNION
基本上是一个OR
(如果这个值存在于第一句或是第二句,它就会被选出),而INTERSECT
则比较像AND
(这个值要存在于第一句和第二句才会被选出)。UNION
是并集,而INTERSECT
是交集。INTERSECT ALL
则包含交集后的重复数据。语法如下:
1 | SELECT column1 [, column2 ] |
EXCEPT / EXCEPT ALL
EXCEPT
用于求差集,其将查询在前一个结果集中但是不再后面一个结果集中的记录。EXCEPT ALL
则包含交集后的重复数据。语法如下:
1 | SELECT column1 [, column2 ] |
注:在其他数据库求差集的关键字是:
MINUS
。
SUBQUERY
SUBQUERY
即子查询,子查询也是一个普通查询,目的是将用子查询返回的数据将被用来在主查询中作为条件,以进一步限制要检索的数据。可以使用子查询的有SELECT,INSERT,UPDATE和DELETE语句,与运算符如=,<,>,>=,<=,IN等一起使用。有几个子查询必须遵循的规则:
- 必须用括号括起来的子查询。
- 子查询只能有一个在SELECT子句中的列,除非多列在主查询的查询来比较其选定的列。
- ORDER BY不能使用在子查询中,虽然主查询就可以使用ORDER BY。GROUP BY可以用来执行相同的功能在子查询中的ORDER BY。
- 子查询返回多于一行只能用于使用多值的运算符,如为IN,EXISTS,IN,ANY / SOME,ALL运算符。
使用示例如下:
1 | -- SELECT语句中的子查询 |
EXISTS / NOT EXISTS
EXISTS
用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。EXISTS指定一个子查询,检测行的存在。NOT EXISTS
的作用与EXISTS
正好相反。如果子查询没有返回行,则满足了NOT EXISTS
中的WHERE
子句。语法如下:
1 | EXISTS subquery |
EXISTS 和 IN 的比较:
- EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOLEAN值。EXISTS内部有一个子查询语句(SELECT … FROM…),我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。而IN引导的子查询只能返回一个字段
- EXISTS : 强调的是是否返回结果集,不要求知道返回什么,IN则需要知道返回的字段值。
- EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
CONCATENATE
连接字符串。有的时候,我们有需要将由不同列获得的资料串连在一起。每一种数据库都有提供方法来达到这个目的。
- Oracle: CONCAT(), ||
- SQL Server: +
- MySQL: CONCAT()
- PostgreSQL: CONCAT(), ||
PostgreSQL的CONCAT()
的语法如下:
concat(str “any” [, str “any” [, …] ])
PostgreSQL的||
的语法如下:
string || string
string || non-string 或 non-string || string
例:
1 | SELECT u.user_name || ' ' || u.age FROM user AS u; |
SUBSTRING
截取字符串。
- Oracle: SUBSTR()
- SQL Server: SUBSTRING()
- MySQL: SUBSTR(), SUBSTRING()
- PostgreSQL: SUBSTRING()
PostgreSQL的SUBSTRING()语法如下:
- substring(string [from int] [for int]) 截取子字符串。
- substring(string from pattern) 截取匹配POSIX正则表达式的子字符串。
- substring(string from pattern for escape) 截取匹配SQL正则表达式的子字符串。
例:
1 | -- 得到hom |
TRIM
SQL中的TRIM
函数是用来移除掉一个字符串中的字头或字尾。最常见的用途是移除字首或字尾的空白。这个函数在不同的数据库中有不同的名称:
- Oracle: LTRIM(), RTRIM()
- SQL Server: LTRIM(), RTRIM()
- MySQL: TRIM(), LTRIM(), RTRIM()
- PostgreSQL: TRIM(), BTRIM(), LTRIM(), RTRIM()
PostgreSQL的TRIM()语法如下:
- trim([leading | trailing | both] [characters] from string) 从字符串string的开头/结尾/两边删除只包含characters中字符(缺省是空白)的最长的字符串。
- btrim(string text [, characters text]) 从string开头和结尾删除只包含 characters中字符(缺省是空白)的最长字符串。
- ltrim(string text [, characters text]) 从字符串string的开头删除只包含characters 中字符(缺省是一个空白)的最长的字符串。
- rtrim(string text [, characters text]) 从字符串string的结尾删除只包含characters中字符(缺省是个空白)的最长的字符串。
1 | -- 得到Tom |
CASE
CASE
表达式是一种通用的条件表达式,类似于其它编程语言中的if/else
语句。
1 | CASE WHEN [condition] THEN result |
示例如下:
1 | SELECT sex, |
COALESCE
COALESCE
返回它的第一个非NULL
的参数值。如果所有参数都是NULL那么返回NULL。它常用于在显示数据时用缺省值替换NULL。语法如下:
1 | COALESCE(value [, ...]) |
使用示例:
1 | SELECT COALESCE(NULL, NULL, GETDATE()); |
NULLIF
当且仅当value1等于value2时,NULLIF
才返回null。否则它返回value1。这些可以用于执行上面给出的COALESCE
例子的反例。语法如下:
1 | NULLIF(value1, value2) |
GREATEST / LEAST
GREATEST和LEAST函数从一个任意数字表达式的列表里选取最大或者最小的数值。 这些表达式必须都可以转换成一个普通的数据类型,它将会是结果类型。列表中的NULL值将被忽略。只有所有表达式的结果都是 NULL 的时候,结果才会是 NULL。语法如下:
1 | GREATEST(value [, ...]) |
注意:GREATEST和LEAST都不是 SQL 标准,但却是很常见的扩展。