SQL

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_name WHERE ROWNUM <= number

例如:

SELECT *
FROM Persons
WHERE ROWNUM <= 5

LIKE

用于在WHERE中搜索指定模式

语法:
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE 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 value1 AND 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_name AS 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 int PRIMARY 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 NULLIS 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容