SQL教程:https://www.w3school.com.cn/sql/index.asp
DISTINCT
表中可能有重复值,如果只想列出不同的值,使用关键词DISTINCT
语法:
SELECTDISTINCT列名称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,....)
INSERTINTOtable_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
用于删除表中的行
语法:
DELETEFROM表名称WHERE列名称 = 值
例如:
DELETE FROM Person WHERE LastName = 'Wilson'
// 在不删除表的情况下删除所有行
DELETE FROM table_name
DELETE * FROM table_name
TOP
用于规定返回记录的数目
注意:并非所有数据库系统都支持TOP
SQL Server
语法:
SELECTTOPnumber|percent column_name(s)FROMtable_name
例如:
SELECT TOP 2 * FROM Persons
SELECT TOP 50 PERCENT * FROM Persons
MySQL
语法:
SELECTcolumn_name(s)FROMtable_name` LIMIT number
例如:
SELECT *
FROM Persons
LIMIT 5
Qracle
语法:
SELECTcolumn_name(s)FROMtable_nameWHEREROWNUM<= number
例如:
SELECT *
FROM Persons
WHERE ROWNUM <= 5
LIKE
用于在WHERE中搜索指定模式
语法:
SELECTcolumn_name(s)
FROMtable_name
WHEREcolumn_nameLIKEpattern
例如:
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字句中规定多个值
语法:
SELECTcolumn_name(s)
FROMtable_name
WHEREcolumn_name IN (value1,value2,...)
例子:
//LastName为 Adams 和 Carter
SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter')
BETWEEN
用于选取两个值之间的数据,可以使数值,文本或日期
语法:
SELECTcolumn_name(s)
FROMtable_name
WHEREcolumn_name
BETWEENvalue1ANDvalue2
例子:
`SELECT` * `FROM` Persons
`WHERE` LastName
`BETWEEN` 'Adams' `AND` 'Carter'
注意:不同数据库对于BETWEEN...AND处理方式有差异,对于是否包含开始部分和结束部分有差异
AS
为列名称和表名称指定别名
语法:
//表名称
SELECTcolumn_name(s)
FROMtable_name
ASalias_name
//列名称
SELECTcolumn_nameASalias_name
FROMtable_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
表示表中存在至少一个匹配是,返回行
语法:
SELECTcolumn_name(s)
FROMtable_name1
INNER JOINtable_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)中没有匹配的行
语法:
SELECTcolumn_name(s)
FROMtable_name1
LEFT JOINtable_name2
ONtable_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)中没有匹配的行
语法:
SELECTcolumn_name(s)
FROMtable_name1
RIGHT JOINtable_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
表示只有某个表存在匹配就返回行
语法:
SELECTcolumn_name(s)
FROMtable_name1
FULL JOINtable_name2
ONtable_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
语法:
SELECTcolumn_name(s)FROMtable_name1
UNION
SELECTcolumn_name(s)FROMtable_name2
或
SELECTcolumn_name(s)FROMtable_name1
UNION ALL
SELECTcolumn_name(s)FROMtable_name2
SELECT INTO
用于从一个表中选取数据,然后插入到另一个表中
语法:
SELECT*
INTOnew_table_name [IN externaldatabase]
FROMold_tablename
直插入某些列
SELECTcolumn_name(s)
INTOnew_table_name [IN externaldatabase]
FROMold_tablename
CREATE DATABASE
用于创建数据库
语法:
CREATE DATABASEdatabase_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 INDEXindex_name
ONtable_name (column_name)
"column_name" 规定需要索引的列
创建一个唯一索引,即两个行不能拥有相同的索引值
CREATE UNIQUE INDEXindex_name
ONtable_name (column_name)
例子:
CREATE INDEX Index_Pers
ON Person (LastName, FirstName)
//以降序索引某个列中的值
CREATE INDEX Index_Pers
ON Person (LastName DESC)
DROP
撤销索引、表以及数据库
撤销索引语法:
用于MS SQL Server
DROP INDEXtable_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 TABLEtable_name
ADDcolumn_name datatype
删除列语法:
ALTER TABLEtable_name
DROP COLUMNcolumn_name
改变列的数据类型语法:
ALTER TABLEtable_name
ALTER COLUMNcolumn_name datatype
例子:
ALTER TABLE Persons
ALTER COLUMN Birthday year
AUTO INCREMENT
作用:每次插入新纪录时自动的创建主键字段的值
MySQL语法:
CREATE TABLEPersons
(
P_Id intNOT NULLAUTO_INCREMENT,
LastName varchar(255)NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY(P_Id)
)
SQL Server语法:
CREATE TABLEPersons
(
P_Id intPRIMARY KEYIDENTITY, // 用IDENTITY来实现
LastName varchar(255)NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
Oracle语法:
CREATE SEQUENCEseq_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