SQL语法

SQL语法

基础语法

1. SELECT

说明

SELECT语句用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。

语法
1
2
SELECT columnname1, columnname2,... FROM table_name
SELECT * FROM table_name

2. DISTINCT

说明

在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词DISTINCT用于返回唯一不同的值。

语法
1
SELECT DISTINCT column_name FROM table_name

3. WHERE 子句

说明

有条件地从表中选取数据,可将WHERE子句添加到SELECT语句。

语法
1
SELECT column_name FROM table_name WHERE condition(s)

condition(s): column_name operator value

操作符(operator) 描述
= 等于
<> 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式

例如:

1
2
SELECT * FROM Persons WHERE City='Beijing'
SELECT * FROM Persons WHERE Year>1965

4. AND和OR

说明

ANDOR可在WHERE子语句中把两个或多个条件结合起来。如果第一个条件和第二个条件都成立,则AND运算符显示一条记录。如果第一个条件和第二个条件中只要有一个成立,则OR运算符显示一条记录。

语法
1
2
SELECT * FROM table_name WHERE (column_name1='value1' OR column_name1='value2')
AND column_name3='value3'

5. ORDER BY语句

说明

ORDER BY语句用于根据指定的列对结果集进行排序。默认按照升序对记录进行排序。如果希望按照降序对记录进行排序,可以使用DESC关键字。

语法
1
2
3
SELECT column_name FROM table_name ORDER BY columnname1
SELECT column_name FROM table_name ORDER BY columnname1, columnname2
SELECT column_name FROM table_name ORDER BY columnname1 DESC, columnname2 DESC

6. INSERT INTO语句

说明

INSERT INTO语句用于向表格中插入新的行。

语法
1
2
INSERT INTO table_name VALUES (value1, value2, value3)
INSERT INTO table_name (column_name1, column_name2, column_name3) VALUES (value1, value2, value3)

7. UDPATE语句

说明

UDPATE语句用于修改表中的数据。

语法
1
2
UPDATE table_name SET column_name = new_value WHERE condition(s)
UPDATE table_name SET column_name1 = new_value1, columnname2 = new_value2 WHERE condition(s)

8. DELETE语句

说明

DELETE语句用于删除表中的行。

语法
1
2
3
DELETE FROM table_name WHERE condition(s)
DELETE FROM table_name
DELETE * FROM table_name

高级语法

1. TOP子句

说明

TOP子句用于规定要返回的记录的数目。

对于拥有数千条记录的大型表来说,TOP子句是非常有用的。

注释: 并非所有的数据库系统都支持TOP子句。

语法
1
2
3
4
5
6
SELECT TOP number|percent column_name(s)
FROM table_name
--Oracle
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number

2. LIKE操作符

说明

LIKE操作符用于在WHERE子句中搜索列中的指定模式。

语法
1
2
3
4
5
6
7
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern
-- 不包含
SELECT column_name(s)
FROM table_name
WHERE column_name NOT LIKE pattern

patter:

格式 说明
N% 以N开头
%N 以N结尾
%N% 中间包含N

3. 通配符

说明

在搜索数据库中的数据时,SQL通配符可以替代一个或多个字符。

SQL通配符必须与LIKE运算符一起使用。

在SQL中,可使用以下通配符:

通配符 说明
% 代替一个或多个字符
_ 仅代替一个字符
[charlist] 字符列表中的任何字符
[^charlist] 不在字符列中的任何单一字符
[!charlist] 不在字符列中的任何单一字符
语法

同LIKE

说明

1
2
3
4
SELECT * FROM table_name
WHERE column_name LIKE '[ALN]%' -- 从表中选取出列名以 "A" 或 "L" 或 "N" 开头的行
SELECT * FROM table_name
WHERE column_name LIKE '[!ALN]%' -- 从表中选取出列名不以 "A" 或 "L" 或 "N" 开头的行

4. IN操作符

说明

IN操作符允许我们在WHERE子句中规定多个值。

语法
1
2
3
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)

5. BETWEEN操作符

说明

操作符BETWEEN ... AND会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。

语法
1
2
3
4
5
6
7
8
9
10
--介于
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
--范围之外的人
SELECT column_name(s)
FROM table_name
WHERE column_name
NOT BETWEEN value1 AND value2

6. Alias(别名)

说明

通过使用SQL,可以为列名称和表名称指定别名(Alias)。

语法
1
2
3
4
5
6
7
--指定表别名
SELECT column_name(s)
FROM table_name
AS alias_name
--指定列别名
SELECT column_name AS alias_name
FROM table_name

7. JOIN

说明

用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

语法
1
2
3
4
5
SELECT column_name(s)
FROM table_name1 as t1
INNER JOIN table_name2 as t2
ON t1.id = t2.id
ORDER BY column_name

例如:

1
2
3
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
1
2
3
4
5
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName

注:

JOIN: 如果表中有至少一个匹配,则返回行

LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

FULL JOIN: 只要其中一个表中存在匹配,就返回行

8. INNER JOIN

说明

在表中存在至少一个匹配时,INNER JOIN关键字返回行。

语法

1
2
3
4
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name

注:INNER JOINJOIN是相同的。

9. LEFT JOIN

说明

LEFT JOIN关键字会从左表(table_name1)那里返回所有的行,即使在右表 (table_name2)中没有匹配的行。

语法
1
2
3
4
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name

10. RIGHT JOIN

说明

RIGHT JOIN关键字会右表(table_name2)那里返回所有的行,即使在左表 (table_name1)中没有匹配的行。

语法

1
2
3
4
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name

11. FULL JOIN

说明

只要其中某个表存在匹配,FULL JOIN关键字就会返回行。

语法
1
2
3
4
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name

12.UNION和UNION ALL

说明

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION内部的SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT语句中的列的顺序必须相同。

语法
1
2
3
4
5
6
7
8
-- UNION
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
-- UNION ALL
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

注: 默认地,UNION操作符选取不同的值。如果允许重复的值,请使用UNION ALL

13. SELECT INTO

说明

SELECT INTO语句从一个表中选取数据,然后把数据插入另一个表中。

SELECT INTO语句常用于创建表的备份复件或者用于对记录进行存档。

语法
1
2
3
4
5
6
7
8
-- INSERT ALL
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
-- INSERT PATR
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename

SQL语法

1. CREATE DATABASE

说明

用于创建数据库。

语法
1
CREATE DATABASE database_name

2. CREATE TABLE

说明

用于创建数据库中的表。

语法
1
2
3
4
5
6
7
CREATE TABLE table_name
(
column_name1 data_type,
column_name2 data_type,
column_name3 data_type,
....
)

数据类型(data_type)说明:

数据类型(data_type) 描述
integer(size) int(size) smallint(size) tinyint(size) 仅容纳整数。在括号内规定数字的最大位数。
decimal(size,d) numeric(size,d) 容纳带有小数的数字。”size” 规定数字的最大位数。”d” 规定小数点右侧的最大位数。
char(size) 容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。在括号中规定字符串的长度
varchar(size) 容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。在括号中规定字符串的最大长度。
date(yyyymmdd) 容纳日期。

3. Constraints

说明

约束用于限制加入表的数据的类型。

可以在创建表时规定约束(通过CREATE TABLE语句),或者在表创建之后也可以(通过ALTER TABLE语句)。

主要探讨以下几种约束:

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK
  • DEFAULT

4. NOT NULL

说明

NOT NULL约束强制列不接受NULL值。

NOT NULL约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

语法
1
2
3
4
5
6
7
-- NOT NULL
CREATE TABLE table_name
(
column_name1 data_type NOT NULL,
column_name2 data_type,
column_name3 data_type,
);
1
2
3
4
5
6
7
8
9
10
11
12
13
-- NOT NULL
CREATE TABLE table_name
(
column_name1 data_type NOT NULL,
column_name2 data_type,
column_name3 data_type,
);
-- UNIQUE
CREATE TABLE table_name (
column_name1 data_type NOT NULL UNIQUE,
column_name2 data_type,
column_name3 data_type,
);

5. UNIQUE

说明

UNIQUE约束唯一标识数据库表中的每条记录。

UNIQUEPRIMARY KEY约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY拥有自动定义的UNIQUE约束。

注:,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARY KEY约束。

语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
-- Create UNIQUE To new Table
CREATE TABLE table_name (
column_name1 data_type NOT NULL UNIQUE,
column_name2 data_type,
column_name3 data_type,
);

-- Create UNIQUES To new Table
CREATE TABLE table_name (
column_name1 data_type NOT NULL,
column_name2 data_type,
column_name3 data_type,
CONSTRAINT uc_name UNIQUE (column_name1,column_name2)
);

-- Create UNIQUE To old Table
ALTER TABLE table_name
ADD UNIQUE (columnname)

-- Create UNIQUES To old Table
ALTER TABLE table_name
ADD CONSTRAINT uc_name UNIQUE (columnname1,columnname2)

-- Drop UNIQUES To Table
ALTER TABLE table_name
DROP INDEX uc_name

ALTER TABLE table_name
DROP CONSTRAINT uc_name

6. PRIMARY KEY

说明

PRIMARY KEY约束唯一标识数据库表中的每条记录。

主键必须包含唯一的值。

主键列不能包含 NULL 值。

每个表都应该有一个主键,并且每个表只能有一个主键。

语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
-- Create UNIQUE To new Table
CREATE TABLE table_name (
column_name1 data_type NOT NULL PRIMARY KEY,
column_name2 data_type,
column_name3 data_type,
);

-- Create UNIQUES To new Table
CREATE TABLE table_name (
column_name1 data_type NOT NULL,
column_name2 data_type,
column_name3 data_type,
CONSTRAINT pk_name PRIMARY KEY (column_name1,column_name2)
);

-- Create UNIQUE To old Table
ALTER TABLE table_name
ADD PRIMARY KEY (columnname)

-- Create UNIQUES To old Table
ALTER TABLE table_name
ADD CONSTRAINT pk_name PRIMARY KEY (columnname1,columnname2)

-- Drop UNIQUES To Table
ALTER TABLE table_name
DROP PRIMARY KEY

ALTER TABLE table_name
DROP CONSTRAINT pk_name

7. FOREIGN KEY

说明

一个表中的FOREIGN KEY指向另一个表中的PRIMARY KEY

FOREIGN KEY约束用于预防破坏表之间连接的动作。

FOREIGN KEY约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-- Create UNIQUE To new Table
CREATE TABLE table_name (
column_name1 data_type NOT NULL,
column_name2 data_type,
column_name3 data_type,
FOREIGN KEY (column_name3) REFERENCES table_name1(columnname)
);

-- Create UNIQUES To new Table
CREATE TABLE table_name (
column_name1 data_type NOT NULL,
column_name2 data_type,
column_name3 data_type,
CONSTRAINT fk_name FOREIGN KEY (column_name1)
REFERENCES table_name1(columnname)
);

-- Create UNIQUE To old Table
ALTER TABLE table_name
ADD FOREIGN KEY (columnname)
REFERENCES table_name1(columnname1)

-- Create UNIQUES To old Table
ALTER TABLE table_name
ADD CONSTRAINT pk_name PRIMARY KEY (columnname1,columnname2)

-- Drop UNIQUES To Table
ALTER TABLE table_name
DROP FOREIGN KEY fk_name

ALTER TABLE table_name
DROP CONSTRAINT fk_name

8. CHECK

说明

CHECK约束用于限制列中的值的范围。

如果对单个列定义CHECK约束,那么该列只允许特定的值。

如果对一个表定义CHECK约束,那么此约束会在特定的列中对值进行限制。

语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-- Create
CREATE TABLE table_name (
column_name1 data_type NOT NULL CHECK (column_name1>0),
column_name2 data_type,
column_name3 data_type,
);

-- Create
CREATE TABLE table_name (
column_name1 data_type NOT NULL,
column_name2 data_type,
column_name3 data_type,
CONSTRAINT chk_name CHECK (column_name1>0 AND column_name2=value1)
);

-- Create To old Table
ALTER TABLE table_name
ADD CHECK (column_name1>0)

-- Create To old Table
ALTER TABLE table_name
ADD CONSTRAINT chk_name CHECK (column_name1>0 AND column_name2=value1)

-- Drop To Table
ALTER TABLE table_name
DROP CONSTRAINT chk_name

9. DEFAULT

说明

DEFAULT约束用于向列中插入默认值。

如果没有规定其他的值,那么会将默认值添加到所有的新记录。

语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- Create DEFAULT To new Table
CREATE TABLE table_name (
column_name1 data_type NOT NULL,
column_name2 data_type,
column_name3 data_type DEFAULT value
)

-- Create DEFAULT To old Table
ALTER TABLE table_name
ALTER column_name SET DEFAULT value

-- Drop DEFAULT To Table
ALTER TABLE table_name
ALTER column_name DROP DEFAULT

9. CREATE INDEX

说明

在表中创建索引,以便更加快速高效地查询数据。

用户无法看到索引,它们只能被用来加速搜索/查询。

注: 更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE INDEX index_name
ON table_name (column_name)
-- UNIQUE INDEX
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
-- 对列创建索引
CREATE INDEX column_index
ON table_name (column_name)
-- 对列创建降序索引
CREATE INDEX column_index
ON table_name (column_name DESC)
-- 对多列创建索引
CREATE INDEX column_index
ON table_name (column_name1, column_name2)

10. 撤销索引、表以及数据库

说明

通过使用DROP语句,可以轻松地删除索引、表和数据库。

语法
1
2
3
4
5
6
7
8
9
-- Drop INDEX
ALTER TABLE table_name
DROP INDEX index_name
-- Drop TABLE
DROP TABLE table_name
-- Drop DATABASE
DROP DATABASE database_name
-- clear data
TRUNCATE TABLE table_name

11. ALTER TABLE

说明

用于在已有的表中添加、修改或删除列。

语法
1
2
3
4
5
6
7
8
9
-- add column
ALTER TABLE table_name
ADD column_name datatype
-- delete column
ALTER TABLE table_name
DROP COLUMN column_name
-- modify column
ALTER TABLE table_name
ALTER COLUMN column_name datatype

12. AUTO INCREMENT字段

说明

我们通常希望在每次插入新记录时,自动地创建主键字段的值。

我们可以在表中创建一个auto-increment字段。

语法
1
2
3
4
5
6
7
8
9
-- CREATE
CREATE TABLE table_name
(
columnname1 data_type NOT NULL AUTO_INCREMENT,
column_name2 data_type NOT NULL,
PRIMARY KEY (columnname1)
)
-- 以100开始
ALTER TABLE table_name AUTO_INCREMENT=100

13. VIEW

说明

在SQL中,视图是基于SQL语句的结果集的可视化的表。

视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加SQL函数、WHERE以及JOIN语句,我们也可以提交数据,就像这些来自于某个单一的表。

注: 数据库的设计和结构不会受到视图中的函数、where或join语句的影响。

语法
1
2
3
4
5
6
7
8
9
10
11
12
-- CREATE
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
-- UPDATE
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
-- Drop
DROP VIEW view_name

14. NULL

说明

如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以NULL值保存。

NULL值的处理方式与其他值不同。

NULL用作未知的或不适用的值的占位符。

注: 无法比较NULL0;它们是不等价的。

语法
1
2
3
4
5
6
-- IS NULL
SELECT * FROM table_name
WHERE column_name IS NULL
-- IS NOT NULL
SELECT * FROM table_name
WHERE column_name IS NOT NULL

SQL函数

1. AVG

说明

AVG函数返回数值列的平均值。NULL值不包括在计算中。

语法
1
SELECT AVG(column_name) FROM table_name

2. COUNT

说明

返回匹配指定条件的行数。

语法
1
SELECT AVG(column_name) FROM table_name

2. AVG

说明

AVG函数返回数值列的平均值。NULL值不包括在计算中。

语法
1
2
3
4
5
6
-- 指定某列
SELECT COUNT(column_name) FROM table_name
-- 所有
SELECT COUNT(*) FROM table_name
-- 唯一值
SELECT COUNT(DISTINCT column_name) FROM table_name

3. FIRST

说明

FIRST()函数返回指定的字段中第一个记录的值。

语法
1
SELECT FIRST(column_name) FROM table_name

3. FIRST

说明

FIRST()函数返回指定的字段中第一个记录的值。

语法
1
SELECT FIRST(column_name) FROM table_name

4. LAST

说明

LAST()函数返回指定的字段中最后一个记录的值。

语法
1
SELECT LAST(column_name) FROM table_name

5. MAX

说明

MAX()函数返回指定的字段中最大的值。NULL值不包括在计算中。

语法
1
SELECT MAX(column_name) FROM table_name

6. MIN

说明

MIN()函数返回指定的字段胡最小值。NULL值不包括在计算中。

语法
1
SELECT MIN(column_name) FROM table_name

7. SUM

说明

SUM()函数返回数值列的总和。

语法
1
SELECT SUM(column_name) FROM table_name

8. GROUP BY

说明

GROUP BY用于结合合计函数,根据一个或多个列对结果集进行分组。

语法
1
2
3
4
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name

9. HAVING

说明

在SQL中增加HAVING子句原因是,WHERE关键字无法与合计函数一起使用。

语法
1
2
3
4
5
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

10. UCASE

说明

UCASE函数把字段的值转换为大写。

语法
1
SELECT UCASE(column_name) FROM table_name

11. LCASE

说明

LCASE函数把字段的值转换为小写。

语法
1
SELECT LCASE(column_name) FROM table_name

10. MID

说明

MID函数用于从文本字段中提取字符。

语法
1
SELECT MID(column_name,start[,length]) FROM table_name

解释:

参数 描述
column_name 必需。要提取字符的字段。
start 必需。规定开始位置(起始值是 1)。
length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。

11. LEN

说明

LEN函数返回文本字段中值的长度。

语法
1
SELECT LEN(column_name) FROM table_name

12. ROUND

说明

ROUND函数用于把数值字段舍入为指定的小数位数。

语法
1
SELECT ROUND(column_name,decimals) FROM table_name

13. NOW

说明

NOW函数返回当前的日期和时间。

语法
1
SELECT NOW() FROM table_name

11. FORMAT

说明

FORMAT函数用于对字段的显示进行格式化。

语法
1
SELECT FORMAT(column_name,format) FROM table_name

SQL数据类型