SQL教程:https://www.w3school.com.cn/sql/index.asp
DISTINCT
表中可能有重复值,如果只想列出不同的值,使用关键词DISTINCT
语法:
SELECT
DISTINCT
列名称FROM
表名称
例如:
SELECT DISTINCT Company FROM Orders
列出Company列中不重复的值
WHERE
有条件地从表中选取数据
语法:
SELECT
列名称FROM
表名称WHERE
列 运算符 值
例如:
SELECT * FROM Persons WHERE City='Beijing'
注意:字符串使用引号引起来(一般用单引号)
AND 和 OR
用于将多个条件结合起来
例如:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')
AND LastName='Carter'
ORDER BY
用于对结果排序
降序使用DESC
关键字
例如:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
INSERT INTO
用于向表格中插入新的行
语法:
INSERT`` INTO
表名称VALUES
(值1, 值2,....)
INSERT
INTO
table_name (列1, 列2,...)VALUES
(值1, 值2,....)
例如:
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
UPDATE
用于修改表中数据
语法:
UPDATE
表名称SET
列名称 = 新值WHERE
列名称 = 某值
例如:
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
DELETE
用于删除表中的行
语法:
DELETE
FROM
表名称WHERE
列名称 = 值
例如:
DELETE FROM Person WHERE LastName = 'Wilson'
// 在不删除表的情况下删除所有行
DELETE FROM table_name
DELETE * FROM table_name
TOP
用于规定返回记录的数目
注意:并非所有数据库系统都支持TOP
SQL Server
语法:
SELECT
TOP
number|percent column_name(s)FROM
table_name
例如:
SELECT TOP 2 * FROM Persons
SELECT TOP 50 PERCENT * FROM Persons
MySQL
语法:
SELECT
column_name(s)FROM
table_name` LIMIT number
例如:
SELECT *
FROM Persons
LIMIT 5
Qracle
语法:
SELECT
column_name(s)FROM
table_nameWHERE
ROWNUM
<= number
例如:
SELECT *
FROM Persons
WHERE ROWNUM <= 5
LIKE
用于在WHERE中搜索指定模式
语法:
SELECT
column_name(s)
FROM
table_name
WHERE
column_nameLIKE
pattern
例如:
SELECT * FROM Persons
WHERE City LIKE 'N%' //N开头
SELECT * FROM Persons
WHERE City LIKE '%g' //g结尾
SELECT * FROM Persons
WHERE City LIKE '%lon%' //包含lon
SELECT * FROM Persons
WHERE City NOT LIKE '%lon%' //不包含lon
注意:
%
用于定义通配符(模式中缺少的字母)
通配符
除以上用过的%
通配符外,还有其他用法
例子:
// 第一个字符之后是 "eorge"
SELECT * FROM Persons
WHERE FirstName LIKE '_eorge'
//"C" 开头,然后是一个任意字符,然后是 "r",然后是一个任意字符,然后是 "er"
SELECT * FROM Persons
WHERE LastName LIKE 'C_r_er'
//以 "A" 或 "L" 或 "N" 开头的
SELECT * FROM Persons
WHERE City LIKE '[ALN]%'
//不以 "A" 或 "L" 或 "N" 开头的
SELECT * FROM Persons
WHERE City LIKE '[!ALN]%'
IN
允许在WHERE字句中规定多个值
语法:
SELECT
column_name(s)
FROM
table_name
WHERE
column_name IN (value1,value2,...)
例子:
//LastName为 Adams 和 Carter
SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter')
BETWEEN
用于选取两个值之间的数据,可以使数值,文本或日期
语法:
SELECT
column_name(s)
FROM
table_name
WHERE
column_name
BETWEEN
value1AND
value2
例子:
`SELECT` * `FROM` Persons
`WHERE` LastName
`BETWEEN` 'Adams' `AND` 'Carter'
注意:不同数据库对于BETWEEN...AND处理方式有差异,对于是否包含开始部分和结束部分有差异
AS
为列名称和表名称指定别名
语法:
//表名称
SELECT
column_name(s)
FROM
table_name
AS
alias_name
//列名称
SELECT
column_nameAS
alias_name
FROM
table_name
例子:
//列出 "John Adams" 的所有定单
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
有时需要从两个或多个表中获取结果以得到完整信息,就要用到join
JOIN或INNER JOIN
表示表中存在至少一个匹配是,返回行
语法:
SELECT
column_name(s)
FROM
table_name1
INNER JOIN
table_name2
ON
table_name1.column_name=table_name2.column_name
例子:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
LEFT JOIN
表示从左表(table_name1)返回所有行,即使在右表(table_name2)中没有匹配的行
语法:
SELECT
column_name(s)
FROM
table_name1
LEFT JOIN
table_name2
ON
table_name1.column_name=table_name2.column_name
例子:
//即使Order表中没有与Persons表中的id匹配也会返回Persons表的那一行,只是orderNo是空
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
RIGHT JOIN
表示从右表(table_name2)返回所有行,即使左表(table_name1)中没有匹配的行
语法:
SELECT
column_name(s)
FROM
table_name1
RIGHT JOIN
table_name2
ON
table_name1.column_name=table_name2.column_name
例子:
//即使Person表中没有匹配行也会从Orders表返回所有行
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
FULL JOIN
表示只有某个表存在匹配就返回行
语法:
SELECT
column_name(s)
FROM
table_name1
FULL JOIN
table_name2
ON
table_name1.column_name=table_name2.column_name
例子:
//返回 Persons表和Orders表中的行,即使不符合ON后的条件
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
UNION 和 UNION ALL
用于合并两个或多个SELECT语句的结果集,多个SELECT语句必须有相同数量的列,列必须要有相似的数据类型,列的顺序必须相同
UNION
选取不同的值,若想要允许重复的值,可以使用UNION ALL
语法:
SELECT
column_name(s)FROM
table_name1
UNION
SELECT
column_name(s)FROM
table_name2
或
SELECT
column_name(s)FROM
table_name1
UNION ALL
SELECT
column_name(s)FROM
table_name2
SELECT INTO
用于从一个表中选取数据,然后插入到另一个表中
语法:
SELECT
*
INTO
new_table_name [IN externaldatabase]
FROM
old_tablename
直插入某些列
SELECT
column_name(s)
INTO
new_table_name [IN externaldatabase]
FROM
old_tablename
CREATE DATABASE
用于创建数据库
语法:
CREATE DATABASE
database_name
CREATE TABLE
创建表
语法:
CREATE TABLE
表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
例子:
CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
SQL 约束
1. NOT NULL
不接受NULL值
例子:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
2. UNIQUE
唯一表示每一条记录
例子:
//MySQL
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)
// SQL Server/Oracle/MS Access
CREATE TABLE Persons
(
Id_P int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
3. PRIMARY KEY
主键,PRIMARY KEY有自动定义的UNIQUE约束
例子:
//MySQL
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)
//SQL Server / Oracle / MS Access
CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
4. FOREIGN KEY
外键
例子:
// MySQL
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
// SQL Server / Oracle / MS Access
CREATE TABLE Orders
(
Id_O int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
)
5. CHECK
用于限制列中值的范围,如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
例子:
//MySQL
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)
// SQL Server / Oracle / MS Access
CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
6. DEFAULT
用于向列中插入默认值,如果没有规定其他值,那么会将默认值添加到所有的新纪录
例子:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
//当表已经存在时
// MySQL
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
// SQL Server / Oracle / MS Access
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'
CREATE INDEX
用于在表中创建索引,在不读取整个表的情况下,索引使得数据库应用程序可以更快的查找数据。
更新一个包含索引的表要比更新一个没有索引的表需要更多时间,因为索引本身也需要更新
语法:
CREATE INDEX
index_name
ON
table_name (column_name)
"column_name" 规定需要索引的列
创建一个唯一索引,即两个行不能拥有相同的索引值
CREATE UNIQUE INDEX
index_name
ON
table_name (column_name)
例子:
CREATE INDEX Index_Pers
ON Person (LastName, FirstName)
//以降序索引某个列中的值
CREATE INDEX Index_Pers
ON Person (LastName DESC)
DROP
撤销索引、表以及数据库
撤销索引语法:
用于MS SQL Server
DROP INDEX
table_name.index_name
用于 IBM DB2和Oracle
DROP INDEX
index_name
用于MySQL
ALTER TABLE
table_name DROP INDEX
index_name
撤销表语法:
DROP TABLE
表名称
只除去表中数据,并不删除表本身
TRUNCATE TABLE
表名称
撤销数据库语法:
DROP DATABASE
数据库名称
ALTER TABLE
用于在已有表中添加,修改或删除列
添加列语法:
ALTER TABLE
table_name
ADD
column_name datatype
删除列语法:
ALTER TABLE
table_name
DROP COLUMN
column_name
改变列的数据类型语法:
ALTER TABLE
table_name
ALTER COLUMN
column_name datatype
例子:
ALTER TABLE Persons
ALTER COLUMN Birthday year
AUTO INCREMENT
作用:每次插入新纪录时自动的创建主键字段的值
MySQL语法:
CREATE TABLE
Persons
(
P_Id intNOT NULL
AUTO_INCREMENT
,
LastName varchar(255)NOT NULL
,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY
(P_Id)
)
SQL Server语法:
CREATE TABLE
Persons
(
P_Id intPRIMARY KEY
IDENTITY
, // 用IDENTITY来实现
LastName varchar(255)NOT NULL
,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
Oracle语法:
CREATE SEQUENCE
seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
上面的代码创建名为 seq_person 的序列对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。CACHE 选项规定了为了提高访问速度要存储多少个序列值。
SQL 中的NULL值
如果表中的某个列是可选的,若不向该列添加值,意味着该字段将以NULL值保存
无法比较NULL和0;它们是不等价的
无法使用比较运算符测试NULL值, 比如= ,<,>或 <>
必须使用IS NULL
和IS NOT NULL
操作符
NVL()
,IFNULL()
,COALESCE()
函数也可以达到相同效果
例子:
//SQL Server /MS Access
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0)) //如果是null用0代替
FROM Products
// Oracle
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
// MySQL
SELECT ProductName,UnitPrice*(UNitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
SQL 服务器
DBMS-数据库管理系统(Database Management System)
现代SQL服务器构建在RDBMS之上
RDBMS-关系数据库管理系统(Relational Database Management System)
其数据库是根据数据间的关系来组织和访问数据的。20 世纪 70 年代初,IBM 公司发明了 RDBMS。
RDBMS 是 SQL 的基础,也是所有现代数据库系统诸如 Oracle、SQL Server、IBM DB2、Sybase、MySQL 以及 Microsoft Access 的基础。
2023-01-28