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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容