SQL ---- 语法学习笔记

2021-01-30 13:15:26 浏览数 (1)

SQL语法学习

基础篇

基础篇实例用表

1. Store_Information 表格

store_name

Sales

Date

Los Angeles

$1500

Jan-05-1999

San Diego

$250

Jan-07-1999

Los Angeles

$300

Jan-08-1999

Boston

$700

Jan-09-1999

2. Geography 表格

region_name

store_name

East

Boston

East

New York

West

Los Angeles

West

San Diego

基础篇语法

1. 查询表格栏位数据
  • 1.1 语法
代码语言:javascript复制
SELECT "栏位名" FROM "表格名"

查询表格中的所有【栏位名】

  • 1.2 实例
代码语言:javascript复制
SELECT store_name FROM Store_Information
  • 1.3 结果 store_nameLos AngelesSan DiegoLos AngelesBoston
2. 栏位值不重复
  • 2.1 语法
代码语言:javascript复制
SELECT DISTINCT "栏位名" FROM "表格名"

表格中【栏位名的值】不重复数据

  • 2.2 实例
代码语言:javascript复制
SELECT DISTINCT store_name FROM Store_Information
  • 2.3 结果 store_nameLos AngelesSan DiegoBoston
3. 满足WHERE条件的栏位值
  • 3.1 语法
代码语言:javascript复制
SELECT "栏位名" FROM "表格名" WHERE "条件"

表格中满足 WHERE 条件的栏位值

  • 3.2 实例
代码语言:javascript复制
SELECT store_name 
FROM Store_Information 
WHERE Sales > 1000
  • 3.3 结果 store_nameLos Angeles
4. 满足复杂条件AND|OR
  • 4.1 语法
代码语言:javascript复制
SELECT "栏位名" FROM "表格名" WHERE "简单条件" {[AND|OR] "简单条件"} 

满足复杂 WHERE 条件的栏位值

  • 4.2 实例
代码语言:javascript复制
SELECT store_name 
FROM Store_Information 
WHERE Sales > 1000 
OR (Sales < 500 AND Sales > 275)

查询表格中满足 AND|OR 条件的【栏位名】,用 () 来代表条件的先后次序

  • 4.3 结果 store_nameLos AngelesLos Angeles
5. 查询已知栏位值数据
  • 5.1 语法
代码语言:javascript复制
SELECT "栏位名" FROM "表格名" WHERE "栏位名" IN ('值一', '值二', ...)
  • 5.2 实例
代码语言:javascript复制
SELECT * 
FROM Store_Information 
WHERE store_name IN ('Los Angeles', 'San Diego')

查询表格中满足 WHERE 条件并且【事先已知道至少一个我们需要的值】IN 的【栏位名】

  • 5.3 结果 store_nameSalesDateLos Angeles$1500Jan-05-1999San Diego$250Jan-07-1999Los Angeles$300Jan-08-1999
6. 查询栏位值在值一和值二间的数据
  • 6.1 语法
代码语言:javascript复制
SELECT "栏位名" FROM "表格名" WHERE "栏位名" BETWEEN '值一' AND '值二'

查询表格中满足 WHERE【栏位名】 条件 值在 BETWEEN ‘值一’ AND '值二’的【栏位名】

  • 6.2 实例
代码语言:javascript复制
SELECT * 
FROM Store_Information 
WHERE Date BETWEEN 'Jan-06-1999' AND 'Jan-10-1999'
  • 6.3 结果 store_nameSalesDateSan Diego$250Jan-07-1999Los Angeles$300Jan-08-1999Boston$700Jan-09-1999
7. 模糊查询
  • 7.1 语法
代码语言:javascript复制
SELECT "栏位名" FROM "表格名" WHERE "栏位名" LIKE {%模式%}

查询表格中满足 WHERE 条件的【模式】的【栏位名】

  • 7.2 实例
代码语言:javascript复制
SELECT * 
FROM Store_Information 
WHERE store_name LIKE '%g%'
  • 7.3 结果 store_nameSalesDateLos Angeles$1500Jan-05-1999Boston$700Jan-09-1999Los Angeles$300Jan-08-1999San Diego$250Jan-07-1999
8. 对返回值排序
  • 8.1 语法
代码语言:javascript复制
SELECT "栏位名" FROM "表格名"[WHERE "条件"] ORDER BY "栏位名" [ASC, DESC],"栏位名" [ASC, DESC]

查询表格中满足 WHERE 条件的【栏位名】按照(ASC升序)或者(DESC降序)返回

  • 8.2 实例
代码语言:javascript复制
SELECT store_name, Sales, Date 
FROM Store_Information 
ORDER BY Sales DESC
  • 8.3 结果 store_nameSalesDateLos Angeles$1500Jan-05-1999San Diego$250Jan-07-1999Los Angeles$300Jan-08-1999
9. 返回值使用函数
  • 9.0 函数名
代码语言:javascript复制
  1. AVG (平均) 
  2. COUNT (计数) 
  3. MAX (最大值) 
  4. MIN (最小值) 
  5. SUM (总合)
  • 9.1 语法
代码语言:javascript复制
SELECT "函数名"("栏位名") FROM "表格名"

查询表格中【栏位名】按照函数名

  • 9.2 实例1
代码语言:javascript复制
SELECT SUM(Sales) FROM Store_Information
  • 9.3 结果 SUM(Sales)$2750
  • 9.4 实例2
代码语言:javascript复制
SELECT COUNT(store_name) FROM Store_Information WHERE store_name is not NULL

“is not NULL” 是 “这个栏位不是空白” 的意思。

  • 9.5 结果 Count(store_name)4
  • 9.6 实例3
代码语言:javascript复制
SELECT COUNT(DISTINCT store_name) 
FROM Store_Information
  • 9.7 结果 Count(DISTINCT store_name)3
10. 以栏位1计算栏位2
  • 10.1 语法
代码语言:javascript复制
SELECT "栏位 1", SUM("栏位 2") FROM "表格名" GROUP BY "栏位 1"

查询表格中以【栏位 1】为基准计算【栏位 2】

  • 10.2 实例
代码语言:javascript复制
SELECT store_name, SUM(Sales) 
FROM Store_Information 
GROUP BY store_name
  • 10.3 结果 store_nameSalesLos Angeles$1800San Diego$250Boston$700
11. HAVING条件输出数据
  • 11.1 语法
代码语言:javascript复制
SELECT "栏位 1", SUM("栏位 2") FROM "表格名" GROUP BY "栏位 1" HAVING (函数条件)

查询表格中以【栏位 1】为基准计算【栏位 2】 要满足 HAVING 条件

  • 11.2 实例
代码语言:javascript复制
SELECT store_name, SUM(sales) 
FROM Store_Information 
GROUP BY store_name 
HAVING SUM(sales) > 1500
  • 11.3 结果 store_nameSUM(Sales)Los Angeles$1800
12. 表格、栏位重命名(ALIAS(别名))
  • 12.1 语法
代码语言:javascript复制
SELECT "表格别名"."栏位 1" "栏位别名" FROM "表格名" "表格别名"

查询表格中的栏位,同时给表格和栏位重新命名别名

  • 12.2 实例
代码语言:javascript复制
SELECT A1.store_name Store, SUM(A1.Sales) "Total Sales" 
FROM Store_Information A1 
GROUP BY A1.store_name
  • 12.3 结果 StoreTotal SalesLos Angeles$1800San Diego$250Boston$700
13 链表查询数据
  • 13.1 语法
代码语言:javascript复制
SELECT "表格别名1"."栏位 1" "栏位别名1", SUM("表格别名2"."栏位 2") "栏位别名2" 
FROM 表格名1 表格别名1, 表格名2 表格别名2
WHERE 表格别名1.栏位别名1 = 表格别名2.栏位别名1 
GROUP BY 表格别名1.栏位别名1

将表格中某个栏位相等的数据找出,对表格中栏位重新命名和值再计算

  • 13.2 实例
代码语言:javascript复制
SELECT A1.region_name REGION, SUM(A2.Sales) SALES 
FROM Geography A1, Store_Information A2 
WHERE A1.store_name = A2.store_name 
GROUP BY A1.region_name

在第一行中,我们告诉 SQL 去选出两个栏位:第一个栏位是 Geography 表格中的 region_name 栏位 (我们取了一个别名叫做 REGION);第二个栏位是 Store_Information 表 格中的 sales 栏位 (别名为 SALES)。请注意在这里我们有用到表格别名:Geography 表格 的别名是 A1,Store_Information 表格的别名是 A2。若我们没有用表格别名的话,第一行 SELECT Geography.region_name REGION, SUM(Store_Information.Sales) SALES 很明显地,这就复杂多了。在这里我们可以看到表格别名的功用:它能让 SQL 句容易被了 解,尤其是这个 SQL 句含盖好几个不同的表格时。 接下来我们看第三行,就是 WHERE 子句。这是我们阐述连接条件的地方。在这里,我们 要确认 Geography 表格中 store_name 栏位的值与 Store_Information 表格中 store_name 栏位的值是相等的。这个 WHERE 子句是一个连接的灵魂人物,因为它的角色是确定两个 表格之间的连接是正确的。如果 WHERE 子句是错误的,我们就极可能得到一个笛卡儿连 接 (Cartesian join)。笛卡儿连接会造成我们得到所有两个表格每两行之间所有可能的组合。 在这个例子中,笛卡儿连接会让我们得到 4 x 4 = 16 行的结果。

  • 13.3 结果 REGIONSALESEast$700West$2050
14 拼接表格中栏位值CONCAT
  • 14.0 不同数据库的函数
代码语言:javascript复制
MySQL: CONCAT() 
Oracle: CONCAT(), || 
SQL Server:  
  • 14.1 语法
代码语言:javascript复制
SELECT CONCAT("栏位 1","栏位 2") FROM "表格名"

查询表格中 “栏位 1” 和 “栏位 2” 数据按照一定规则进行拼接。

  • 14.2 实例
代码语言:javascript复制
SELECT CONCAT(region_name,store_name) FROM Geography 
WHERE store_name = 'Boston';
  • 14.3 结果 CONCAT(region_name,"-",store_name)‘East-Boston’
15 返回栏位值截取SUBSTR
  • 15.0 不同数据库的函数
代码语言:javascript复制
MySQL: SUBSTR(), SUBSTRING() 
Oracle: SUBSTR()
SQL Server: SUBSTRING()
  • 15.1 语法
代码语言:javascript复制
SELECT SUBSTR(栏位名, 第<pos>位置开始, 接下去的<len>个字符) 
FROM 表格名 
WHERE 栏位名 = '已知栏位名';
  • 15.2 实例1
代码语言:javascript复制
SELECT SUBSTR(store_name, 3) 
FROM Geography 
WHERE store_name = 'Los Angeles';
  • 15.3 结果 SUBSTR(store_name, 3)‘s Angeles’
  • 15.4 实例2
代码语言:javascript复制
SELECT SUBSTR(store_name,2,4) 
FROM Geography 
WHERE store_name = 'San Diego';
  • 15.5 结果 SUBSTR(store_name, 3)‘an D’
16 移除字符串的字头或字尾TRIM
  • 16.0 不同数据库的函数
代码语言:javascript复制
MySQL: TRIM(), RTRIM(), LTRIM() 
Oracle: RTRIM(), LTRIM() 
SQL Server: RTRIM(), LTRIM()
  • 16.1 语法
代码语言:javascript复制
TRIM([[位置] [要移除的字符串] FROM ] 字符串)

[位置] 的可能值为 LEADING (起头), TRAILING (结尾), or BOTH (起头及结尾)。这个函数将把 [要移除的字符串] 从字符串的起 头、结尾,或是起头及结尾移除。如果我们没有列出 [要移除的字符串] 是什么的话,那空白就会被移除。

  • 16.2 实例1
代码语言:javascript复制
SELECT TRIM(' Sample ');
  • 16.3 结果 TRIM(’ Sample ')‘Sample’
  • 16.4 实例2
代码语言:javascript复制
SELECT LTRIM(' Sample ');
  • 16.5 结果 LTRIM(’ Sample ')'Sample ’
  • 16.6 实例3
代码语言:javascript复制
SELECT RTRIM(' Sample ');
  • 16.7 结果 RTRIM(’ Sample ')’ Sample’
17 创建表CREATE TABLE
  • 17.1 语法
代码语言:javascript复制
CREATE TABLE "表格名" 
("栏位 1" "栏位 1 资料种类", 
"栏位 2" "栏位 2 资料种类", 
... )
  • 17.2 实例
代码语言:javascript复制
CREATE TABLE customer2 
(First_Name char(50), 
Last_Name char(50), 
Address char(50), 
City char(50), 
Country char(25), 
Birth_Date date)
  • 17.3 结果
代码语言:javascript复制
[SQL]CREATE TABLE customer2 
(First_Name char(50), 
Last_Name char(50), 
Address char(50), 
City char(50), 
Country char(25), 
Birth_Date date)
18 限制存入表格资料CONSTRAINT
  • 18.0 常见限制

我们可以限制哪一些资料可以存入表格中。这些限制可以在表格初创时藉由 CREATE TABLE 语句来指定,或是之后藉由 ALTER TABLE 语句来指定。

代码语言:javascript复制
NOT NULL 
UNIQUE 
CHECK 
主键 (Primary Key) 
外来键 (Foreign Key)
  • 18.1 NOT NULL

在没有做出任何限制的情况下,一个栏位是允许有 NULL 值得。如果我们不允许一个栏位含有 NULL 值,我们就需要对那个栏位做出 NOT NULL 的指定。

代码语言:javascript复制
CREATE TABLE Customer 
(SID integer NOT NULL, 
Last_Name varchar (30) NOT NULL, 
First_Name varchar(30));

“SID” 和 “Last_Name” 这两个栏位是不允许有 NULL 值,而 “First_Name” 这个栏位是可以有 NULL 值得。

  • 18.2 UNIQUE

UNIQUE 限制是保证一个栏位中的所有资料都是有不一样的值。

代码语言:javascript复制
CREATE TABLE Customer 
(SID integer Unique, 
Last_Name varchar (30), 
First_Name varchar(30));

“SID” 栏位不能有重复值存在,而 “Last_Name” 及 “First_Name” 这两个栏位则是允许有重复值存在。

请注意,一个被指定为主键的栏位也一定会含有 UNIQUE 的特性。相对来说,一个UNIQUE 的栏位并不一定会是一个主键。

  • 18.3 CHECK

CHECK 限制是保证一个栏位中的所有资料都是符合某些条件。

代码语言:javascript复制
CREATE TABLE Customer 
(SID integer CHECK (SID > 0), 
Last_Name varchar (30), 
First_Name varchar(30));

请注意,CHECK 限制目前尚未被执行于 MySQL 数据库上。

  • 18.4 主键 主键 (Primary Key) 中的每一笔资料都是表格中的唯一值。换言之,它是用来独一无二地确认一个表格中的每一行资料。主键可以是原本资料内的一个栏位,或是一个人造栏位 (与原本资料没有关系的栏位)。主键可以包含一或多个栏位。当主键包含多个栏位时,称为组合键 (Composite Key)。 主键可以在建置新表格时设定 (运用 CREATE TABLE 语句),或是以改变现有的表格架构方式设定 (运用 ALTER TABLE)。 以下举几个在建置新表格时设定主键的方式: MySQL: CREATE TABLE Customer (SID integer, Last_Name varchar(30), First_Name varchar(30), PRIMARY KEY (SID)); Oracle: CREATE TABLE Customer (SID integer PRIMARY KEY, Last_Name varchar(30), First_Name varchar(30)); SQL Server: CREATE TABLE Customer (SID integer PRIMARY KEY, Last_Name varchar(30), First_Name varchar(30)); 以下则是以改变现有表格架构来设定主键的方式: MySQL: ALTER TABLE Customer ADD PRIMARY KEY (SID); Oracle: ALTER TABLE Customer ADD PRIMARY KEY (SID); SQL Server: ALTER TABLE Customer ADD PRIMARY KEY (SID); 请注意,在用 ALTER TABLE 语句来添加主键之前,我们需要确认被用来当做主键的栏位是设定为 『NOT NULL』 ;也就是说,那个栏位一定不能没有资料。
  • 18.5 外来键

外来键是一个(或数个)指向另外一个表格主键的栏位。外来键的目的是确定资料的参考完整性(referential integrity)。换言之,只有被准许的资料值才会被存入数据库内。

代码语言:javascript复制
> 举例来说,假设我们有两个表格:一个 CUSTOMER 表格,里面记录了所有顾客的资料;
> 另一个 ORDERS 表格,里面记录了所有顾客订购的资料。在这里的一个限制,就是所有的
> 订购资料中的顾客,都一定是要跟在 CUSTOMER 表格中存在。在这里,我们就会在
> ORDERS 表格中设定一个外来键,而这个外来键是指向 CUSTOMER 表格中的主键。这样
> 一来,我们就可以确定所有在 ORDERS 表格中的顾客都存在 CUSTOMER 表格中。换句
> 话说,ORDERS 表格之中,不能有任何顾客是不存在于 CUSTOMER 表格中的资料。

CUSTOMER 表格

栏位名|性质|
--|--|
SID|主键|
Last_Name||
First_Name||

ORDERS 表格

栏位名|性质|
--|--|
Order_ID|主键|
Order_Date||
Customer_SID|外来键|
Amount|

> 在以上的例子中,ORDERS 表格中的 customer_SID 栏位是一个指向 CUSTOMERS 表格中 SID 栏位的外来键。

以下列出几个在建置 ORDERS 表格时指定外来键的方式:
```
  MySQL: 
  CREATE TABLE ORDERS 
  (Order_ID integer, 
  Order_Date date, 
  Customer_SID integer, 
  Amount double, 
  Primary Key (Order_ID), 
  Foreign Key (Customer_SID) references CUSTOMER(SID)); 

  Oracle: 
  CREATE TABLE ORDERS 
  (Order_ID integer primary key, 
  Order_Date date, 
  Customer_SID integer references CUSTOMER(SID), 
  Amount double); 

  SQL Server: 
  CREATE TABLE ORDERS 
  (Order_ID integer primary key, 
  Order_Date datetime, 
  Customer_SID integer references CUSTOMER(SID), 
  Amount double);
```

以下的例子则是藉着改变表格架构来指定外来键。这里假设 ORDERS 表格已经被建置,而外来键尚未被指定:
```
  MySQL: 
  ALTER TABLE ORDERS 
  ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid); 

  Oracle: 
  ALTER TABLE ORDERS 
  ADD (CONSTRAINT fk_orders1) FOREIGN KEY (customer_sid) REFERENCES 
  CUSTOMER(sid); 

  SQL Server: 
  ALTER TABLE ORDERS 
  ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);
```
19 创建视观表CREATE VIEW
  • 19.1 语法

视观表 (Views) 可以被当作是虚拟表格。它跟表格的不同是,表格中有实际储存资料,而视观表是建立在表格之上的一个架构,它本身并不实际储存资料。

代码语言:javascript复制
CREATE VIEW "VIEW_NAME" AS "SQL 语句"

“SQL 语句” 可以是任何一个我们在这个教材中有提到的 SQL。

  • 19.2 实例

使用 【Store_Information 表格】 和 【Geography 表格】 做视观表创建实例

代码语言:javascript复制
CREATE VIEW V_REGION_SALES 
AS SELECT A1.region_name REGION, SUM(A2.Sales) SALES 
FROM Geography A1, Store_Information A2 
WHERE A1.store_name = A2.store_name 
GROUP BY A1.region_name

这就给我们有一个名为 V_REGION_SALES 的视观表。这个视观表包含不同地区的销售哦。

代码语言:javascript复制
SELECT * FROM V_REGION_SALES
  • 19.3 结果 REGIONSALESEast$700West$2050
20 索引CREATE INDEX
  • 20.1 语法
代码语言:javascript复制
CREATE INDEX "INDEX_NAME" ON "TABLE_NAME" (COLUMN_NAME)
  • 20.2 实例 实例表格
代码语言:javascript复制
  TABLE Customer 
  (First_Name char(50), 
  Last_Name char(50), 
  Address char(50), 
  City char(50), 
  Country char(25), 
  Birth_Date date)

  //若我们要在 Last_Name 这个栏位上建一个索引,我们就打入以下的指令,
  CREATE INDEX IDX_CUSTOMER_LAST_NAME on CUSTOMER (Last_Name)

  //我们要在 City 及 Country 这两个栏位上建一个索引,我们就打入以下的指令,
  CREATE INDEX IDX_CUSTOMER_LOCATION on CUSTOMER (City, Country)

索引的命名并没有一个固定的方式。通常会用的方式是在名称前加一个字首,例如 “IDX_” ,来避免与数据库中的其他物件混淆。另外,在索引名之内包括表格名及栏位名也 是一个好的方式。

代码语言:javascript复制
> 请读者注意,每个数据库会有它本身的 CREATE INDEX 语法,而不同数据库的语法会有
> 不同。因此,在下指令前,请先由数据库使用手册中确认正确的语法。
21 修改栏位 ALTER TABLE
  • 21.1 语法
代码语言:javascript复制
  ALTER TABLE "table_name"

  //对应修改语法:

  //加一个栏位: 
  ADD "栏位 1" "栏位 1 资料种类" 

  //删去一个栏位: 
  DROP "栏位 1" 

  //改变栏位名称: 
  CHANGE "原本栏位名" "新栏位名" "新栏位名资料种类" 

  //改变栏位的资料种类: 
  MODIFY "栏位 1" "新资料种类"
  • 21.2 实例 实例表格:customer 表格 栏位名称资料种类First_Namechar(50)Last_Namechar(50)Addresschar(50)Citychar(50)Countrychar(25)Birth_Datedate //加入一个叫做 "gender" 的栏位 ALTER table customer add Gender char(1) // "Address" 栏位改名为 "Addr" ALTER TABLE customer CHANGE Address Addr char(50) //将 "Addr" 栏位的资料种类改为 char(30) ALTER TABLE customer MODIFY Addr char(30) //删除 "Gender" 栏位 ALTER TABLE customer DROP Gender
22 清除表格 DROP TABLE
  • 22.1 语法
代码语言:javascript复制
DROP TABLE "表格名"
  • 22.2 实例
代码语言:javascript复制
DROP TABLE customer

整个表格就消失,而无法再被用了。

23 清除表格资料 TRUNCATE TABLE
  • 23.1 语法
代码语言:javascript复制
TRUNCATE TABLE "表格名"
  • 23.2 实例
代码语言:javascript复制
TRUNCATE TABLE customer

表格中的资料会完全消失,可是表格本身会继续存在。

24 资料输入表格 INSERT INTO
  • 24.1 语法
代码语言:javascript复制
INSERT INTO "表格名" ("栏位 1", "栏位 2", ...) 
VALUES ("值 1", "值 2", ...)
  • 24.2 实例1(单条数据录入)
代码语言:javascript复制
  INSERT INTO customer (First_Name,Last_Name,Address,City,Country,Birth_Date) 
  VALUES ("Liang","Yajun","四川成都龙泉","成都","四川","1991-04-06")
  • 24.3 实例2(多条数据录入—其他表格读取录入)
代码语言:javascript复制
  INSERT INTO user_info(store_name,Sales,Date) 
  SELECT CONCAT(First_Name," ",Last_Name),Birth_Date,Birth_Date FROM customer; 
25 表格资料更新 UPDATE
  • 25.1 语法
代码语言:javascript复制
UPDATE "表格名" 
SET "栏位 1" = [新值] 
WHERE {条件}
  • 25.2 实例
代码语言:javascript复制
UPDATE store_information 
SET Sales = 1000
WHERE store_name = "San Diego" 
AND Date = "Jan-07-1999"
  • 25.3 结果 store_nameSalesDateLos Angeles$1500Jan-05-1999San Diego$1000Jan-07-1999Los Angeles$300Jan-08-1999Boston$700Jan-09-1999
26 去除资料 DELETE FROM
  • 26.1 语法
代码语言:javascript复制
DELETE FROM "表格名" 
WHERE {条件}
  • 26.2 实例
代码语言:javascript复制
DELETE FROM Store_Information 
WHERE store_name = "Los Angeles"
  • 26.3 结果 store_nameSalesDateSan Diego$1000Jan-07-1999Boston$700Jan-09-1999

进阶篇

进阶篇实例用表

1. Store_Information 表格

store_name

Sales

Date

Los Angeles

$1500

Jan-05-1999

San Diego

$250

Jan-07-1999

Los Angeles

$300

Jan-08-1999

Boston

$700

Jan-08-1999

2. Internet_Sales 表格

Date

Sales

Jan-07-1999

$250

Jan-10-1999

$535

Jan-11-1999

$320

Jan-12-1999

$750

进阶篇语法

1 无重复合并两sql语句的结果【选择只要一方存在】 UNION(联集=并集)
  • 1.1 语法
代码语言:javascript复制
[SQL 语句 1] 
UNION 
[SQL 语句 2]
  • 1.2 实例
代码语言:javascript复制
SELECT Date FROM Store_Information 
UNION 
SELECT Date FROM Internet_Sales

UNION 的一个限制是 两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION 这个指令 时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。

  • 1.3 结果 DateJan-05-1999Jan-07-1999Jan-08-1999Jan-10-1999Jan-11-1999Jan-12-1999
2 存在重复合并两sql语句的结果【选择全部】 UNION ALL
  • 2.1 语法
代码语言:javascript复制
[SQL 语句 1] 
UNION ALL
[SQL 语句 2]
  • 2.2 实例
代码语言:javascript复制
SELECT Date FROM Store_Information 
UNION ALL 
SELECT Date FROM Internet_Sales
  • 2.3 结果 DateJan-05-1999Jan-07-1999Jan-08-1999Jan-08-1999Jan-07-1999Jan-10-1999Jan-11-1999Jan-12-1999
3 合并两sql语句的结果【选择都存在】 INTERSECT(交集)
  • 3.1 语法非MySQL
代码语言:javascript复制
[SQL 语句 1] 
INTERSECT 
[SQL 语句 2]
  • 3.2 实例
代码语言:javascript复制
SELECT Date FROM Store_Information 
INTERSECT 
SELECT Date FROM Internet_Sales
  • 3.3 结果 DateJan-07-1999
4 SQL1的结果如果在SQL2中存在就删除,返回剩余SQL1 MINUS
  • 4.1 语法非MySQL
代码语言:javascript复制
[SQL 语句 1] 
MINUS 
[SQL 语句 2]
  • 4.2 实例
代码语言:javascript复制
SELECT Date FROM Store_Information 
MINUS 
SELECT Date FROM Internet_Sales

请注意,在 MINUS 指令下,不同的值只会被列出一次。

  • 4.3 结果 DateJan-05-1999Jan-08-1999
5 子查询
  • 5.1 语法
代码语言:javascript复制
SELECT "栏位 1" 
FROM "表格" 
WHERE "栏位 2" [比较运算素] 
(SELECT "栏位 1" 
FROM "表格" 
WHERE [条件])
  • 5.2 实例
代码语言:javascript复制
SELECT SUM(Sales) FROM Store_Information 
WHERE Store_name IN 
(SELECT store_name FROM Geography 
WHERE region_name = 'West')
  • 5.3 结果 SUM(Sales)2050
6 测试内查询有没有产生任何结果 EXISTS
  • 6.1 语法
代码语言:javascript复制
SELECT "栏位 1" 
FROM "表格 1" 
WHERE EXISTS 
(SELECT * 
FROM "表格 2" 
WHERE [条件])
  • 6.2 实例
代码语言:javascript复制
SELECT SUM(Sales) FROM Store_Information 
WHERE EXISTS 
(SELECT * FROM Geography 
WHERE region_name = 'West')
  • 6.3 结果 SUM(Sales)2750
7 做为 if-then-else 之类逻辑的关键字 CASE
  • 7.1 语法
代码语言:javascript复制
SELECT CASE ("栏位名") 
 WHEN "条件 1" THEN "结果 1" 
 WHEN "条件 2" THEN "结果 2" 
 ... 
 [ELSE "结果 N"] 
 END 
FROM "表格名"
  • 7.2 实例
代码语言:javascript复制
SELECT store_name, CASE store_name 
 WHEN 'Los Angeles' THEN Sales * 2 
 WHEN 'San Diego' THEN Sales * 1.5 
 ELSE Sales 
 END 
 "New Sales", 
 Date 
FROM Store_Information
  • 7.3 结果 store_nameSalesDateLos Angeles$3000Jan-05-1999San Diego$375Jan-07-1999Los Angeles$600Jan-08-1999Boston$700Jan-08-1999
8 算排名
  • 8.1 实例
代码语言:javascript复制
SELECT a1.Name, a1.Sales, COUNT(a2.sales) Sales_Rank 
FROM Total_Sales a1, Total_Sales a2 
WHERE a1.Sales <= a2.Sales or (a1.Sales=a2.Sales and a1.Name = a2.Name) 
GROUP BY a1.Name, a1.Sales 
ORDER BY a1.Sales DESC, a1.Name DESC;
  • 8.2 结果 NameSalesSales_RankGreg501Sophia402Stella203Jeff203Jennifer155John106
9 算中位数
  • 9.1 实例
代码语言:javascript复制
SELECT Sales Median FROM 
(SELECT a1.Name, a1.Sales, COUNT(a1.Sales) Rank 
FROM Total_Sales a1, Total_Sales a2 
WHERE a1.Sales < a2.Sales OR (a1.Sales=a2.Sales AND a1.Name <= a2.Name) 
group by a1.Name, a1.Sales 
order by a1.Sales desc) a3 
WHERE Rank = (SELECT (COUNT(*) 1) DIV 2 FROM Total_Sales);
  • 9.2 结果 Median20
10 算总合百分比
  • 10.1 语法
代码语言:javascript复制
SELECT a1.Name, a1.Sales, a1.Sales/(SELECT SUM(Sales) FROM Total_Sales) Pct_To_Total 
FROM Total_Sales a1, Total_Sales a2 
WHERE a1.Sales <= a2.sales or (a1.Sales=a2.Sales and a1.Name = a2.Name) 
GROUP BY a1.Name, a1.Sales 
ORDER BY a1.Sales DESC, a1.Name DESC;
  • 10.2 结果 NameSalesPct_To_TotalGreg500.3226Sophia400.2581Stella200.1290Jeff200.1290Jennifer150.0968John100.0645
11 算累积总合百分比
  • 11.1 语法
代码语言:javascript复制
SELECT a1.Name, a1.Sales, SUM(a2.Sales)/(SELECT SUM(Sales) FROM Total_Sales) 
Pct_To_Total 
FROM Total_Sales a1, Total_Sales a2 
WHERE a1.Sales <= a2.sales or (a1.Sales=a2.Sales and a1.Name = a2.Name) 
GROUP BY a1.Name, a1.Sales 
ORDER BY a1.Sales DESC, a1.Name DESC;
  • 11.2 结果 NameSalesPct_To_TotalGreg500.3226Sophia400.5806Stella200.7097Jeff200.8387Jennifer150.9355John101.0000

语法汇总

代码语言:javascript复制
  //Select 
  SELECT "栏位" FROM "表格名" 

  //Distinct 
  SELECT DISTINCT "栏位" 
  FROM "表格名" 

  //Where 
  SELECT "栏位" 
  FROM "表格名" 
  WHERE "condition" 

  //And/Or 
  SELECT "栏位" 
  FROM "表格名" 
  WHERE "简单条件" 
  {[AND|OR] "简单条件"}  

  //In 
  SELECT "栏位" 
  FROM "表格名" 
  WHERE "栏位" IN ('值 1', '值 2', ...) 

  //Between 
  SELECT "栏位" 
  FROM "表格名" 
  WHERE "栏位" BETWEEN '值 1' AND '值 2' 

  //Like 
  SELECT "栏位" 
  FROM "表格名" 
  WHERE "栏位" LIKE {模式} 

  //Order By 
  SELECT "栏位" 
  FROM "表格名" 
  [WHERE "条件"] 
  ORDER BY "栏位" [ASC, DESC] 

  //Count 
  SELECT COUNT("栏位") 
  FROM "表格名" 

  //Group By 
  SELECT "栏位 1", SUM("栏位 2") 
  FROM "表格名" 
  GROUP BY "栏位 1" 

  //Having 
  SELECT "栏位 1", SUM("栏位 2") 
  FROM "表格名" 
  GROUP BY "栏位 1" 
  HAVING (函数条件) 

  //Create Table 
  CREATE TABLE "表格名" 
  ("栏位 1" "栏位 1 资料种类", 
  "栏位 2" "栏位 2 资料种类"", 
  ... ) 

  //Drop Table 
  DROP TABLE "表格名" 

  //Truncate Table 
  TRUNCATE TABLE "表格名" 

  //Insert Into 
  INSERT INTO "表格名" ("栏位 1", "栏位 2", ...) 
  VALUES ("值 1", "值 2", ...) 

  //Update 
  UPDATE "表格名" 
  SET "栏位 1" = [新值] 
  WHERE {条件} 

  //Delete From 
  DELETE FROM "表格名" 
  WHERE {条件}

0 人点赞