SQL ---- 语法学习笔记

SQL语法学习

基础篇

基础篇实例用表

1. Store_Information 表格
store_nameSalesDate
Los Angeles$1500Jan-05-1999
San Diego$250Jan-07-1999
Los Angeles$300Jan-08-1999
Boston$700Jan-09-1999
2. Geography 表格
region_namestore_name
EastBoston
EastNew York
WestLos Angeles
WestSan Diego

基础篇语法

1. 查询表格栏位数据
  • 1.1 语法
SELECT "栏位名" FROM "表格名"

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

  • 1.2 实例
SELECT store_name FROM Store_Information
  • 1.3 结果

    store_name
    Los Angeles
    San Diego
    Los Angeles
    Boston
2. 栏位值不重复
  • 2.1 语法
SELECT DISTINCT "栏位名" FROM "表格名"

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

  • 2.2 实例
SELECT DISTINCT store_name FROM Store_Information
  • 2.3 结果

    store_name
    Los Angeles
    San Diego
    Boston
3. 满足WHERE条件的栏位值
  • 3.1 语法
SELECT "栏位名" FROM "表格名" WHERE "条件"

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

  • 3.2 实例
SELECT store_name 
FROM Store_Information 
WHERE Sales > 1000
  • 3.3 结果

    store_name
    Los Angeles
4. 满足复杂条件AND|OR
  • 4.1 语法
SELECT "栏位名" FROM "表格名" WHERE "简单条件" {[AND|OR] "简单条件"}+

满足复杂 WHERE 条件的栏位值

  • 4.2 实例
SELECT store_name 
FROM Store_Information 
WHERE Sales > 1000 
OR (Sales < 500 AND Sales > 275)

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

  • 4.3 结果

    store_name
    Los Angeles
    Los Angeles
5. 查询已知栏位值数据
  • 5.1 语法
SELECT "栏位名" FROM "表格名" WHERE "栏位名" IN ('值一', '值二', ...)
  • 5.2 实例
SELECT * 
FROM Store_Information 
WHERE store_name IN ('Los Angeles', 'San Diego')

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

  • 5.3 结果

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
6. 查询栏位值在值一和值二间的数据
  • 6.1 语法
SELECT "栏位名" FROM "表格名" WHERE "栏位名" BETWEEN '值一' AND '值二'

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

  • 6.2 实例
SELECT * 
FROM Store_Information 
WHERE Date BETWEEN 'Jan-06-1999' AND 'Jan-10-1999'
  • 6.3 结果

    store_nameSalesDate
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-09-1999
7. 模糊查询
  • 7.1 语法
SELECT "栏位名" FROM "表格名" WHERE "栏位名" LIKE {%模式%}

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

  • 7.2 实例
SELECT * 
FROM Store_Information 
WHERE store_name LIKE '%g%'
  • 7.3 结果

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    Boston$700Jan-09-1999
    Los Angeles$300Jan-08-1999
    San Diego$250Jan-07-1999
8. 对返回值排序
  • 8.1 语法
SELECT "栏位名" FROM "表格名"[WHERE "条件"] ORDER BY "栏位名" [ASC, DESC],"栏位名" [ASC, DESC]

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

  • 8.2 实例
SELECT store_name, Sales, Date 
FROM Store_Information 
ORDER BY Sales DESC
  • 8.3 结果

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
9. 返回值使用函数
  • 9.0 函数名
  1. AVG (平均) 
  2. COUNT (计数) 
  3. MAX (最大值) 
  4. MIN (最小值) 
  5. SUM (总合)
  • 9.1 语法
SELECT "函数名"("栏位名") FROM "表格名"

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

  • 9.2 实例1
SELECT SUM(Sales) FROM Store_Information
  • 9.3 结果

    SUM(Sales)
    $2750
  • 9.4 实例2

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

SELECT COUNT(DISTINCT store_name) 
FROM Store_Information
  • 9.7 结果

    Count(DISTINCT store_name)
    3
10. 以栏位1计算栏位2
  • 10.1 语法
SELECT "栏位 1", SUM("栏位 2") FROM "表格名" GROUP BY "栏位 1"

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

  • 10.2 实例
SELECT store_name, SUM(Sales) 
FROM Store_Information 
GROUP BY store_name
  • 10.3 结果

    store_nameSales
    Los Angeles$1800
    San Diego$250
    Boston$700
11. HAVING条件输出数据
  • 11.1 语法
SELECT "栏位 1", SUM("栏位 2") FROM "表格名" GROUP BY "栏位 1" HAVING (函数条件)

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

  • 11.2 实例
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 语法
SELECT "表格别名"."栏位 1" "栏位别名" FROM "表格名" "表格别名"

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

  • 12.2 实例
SELECT A1.store_name Store, SUM(A1.Sales) "Total Sales" 
FROM Store_Information A1 
GROUP BY A1.store_name
  • 12.3 结果

    StoreTotal Sales
    Los Angeles$1800
    San Diego$250
    Boston$700
13 链表查询数据
  • 13.1 语法
SELECT "表格别名1"."栏位 1" "栏位别名1", SUM("表格别名2"."栏位 2") "栏位别名2" 
FROM 表格名1 表格别名1, 表格名2 表格别名2
WHERE 表格别名1.栏位别名1 = 表格别名2.栏位别名1 
GROUP BY 表格别名1.栏位别名1

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

  • 13.2 实例
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 结果

    REGIONSALES
    East$700
    West$2050
14 拼接表格中栏位值CONCAT
  • 14.0 不同数据库的函数
MySQL: CONCAT() 
Oracle: CONCAT(), || 
SQL Server: +
  • 14.1 语法
SELECT CONCAT("栏位 1","栏位 2") FROM "表格名"

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

  • 14.2 实例
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 不同数据库的函数
MySQL: SUBSTR(), SUBSTRING() 
Oracle: SUBSTR()
SQL Server: SUBSTRING()
  • 15.1 语法
SELECT SUBSTR(栏位名, 第<pos>位置开始, 接下去的<len>个字符) 
FROM 表格名 
WHERE 栏位名 = '已知栏位名';
  • 15.2 实例1
SELECT SUBSTR(store_name, 3) 
FROM Geography 
WHERE store_name = 'Los Angeles';
  • 15.3 结果

    SUBSTR(store_name, 3)
    ‘s Angeles’
  • 15.4 实例2

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 不同数据库的函数
MySQL: TRIM(), RTRIM(), LTRIM() 
Oracle: RTRIM(), LTRIM() 
SQL Server: RTRIM(), LTRIM()
  • 16.1 语法
TRIM([[位置] [要移除的字符串] FROM ] 字符串)

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

  • 16.2 实例1
SELECT TRIM(' Sample ');
  • 16.3 结果

    TRIM(’ Sample ')
    ‘Sample’
  • 16.4 实例2

SELECT LTRIM(' Sample ');
  • 16.5 结果

    LTRIM(’ Sample ')
    'Sample ’
  • 16.6 实例3

SELECT RTRIM(' Sample ');
  • 16.7 结果

    RTRIM(’ Sample ')
    ’ Sample’
17 创建表CREATE TABLE
  • 17.1 语法
CREATE TABLE "表格名" 
("栏位 1" "栏位 1 资料种类", 
"栏位 2" "栏位 2 资料种类", 
... )
  • 17.2 实例
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 结果
[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 语句来指定。

NOT NULL 
UNIQUE 
CHECK 
主键 (Primary Key) 
外来键 (Foreign Key)
  • 18.1 NOT NULL

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

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 限制是保证一个栏位中的所有资料都是有不一样的值。

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 限制是保证一个栏位中的所有资料都是符合某些条件。

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)。换言之,只有被准许的资料值才会被存入数据库内。

> 举例来说,假设我们有两个表格:一个 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) 可以被当作是虚拟表格。它跟表格的不同是,表格中有实际储存资料,而视观表是建立在表格之上的一个架构,它本身并不实际储存资料。

CREATE VIEW "VIEW_NAME" AS "SQL 语句"

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

  • 19.2 实例

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

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 的视观表。这个视观表包含不同地区的销售哦。

SELECT * FROM V_REGION_SALES
  • 19.3 结果

    REGIONSALES
    East$700
    West$2050
20 索引CREATE INDEX
  • 20.1 语法
CREATE INDEX "INDEX_NAME" ON "TABLE_NAME" (COLUMN_NAME)
  • 20.2 实例
    实例表格
  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_” ,来避免与数据库中的其他物件混淆。另外,在索引名之内包括表格名及栏位名也
是一个好的方式。

> 请读者注意,每个数据库会有它本身的 CREATE INDEX 语法,而不同数据库的语法会有
> 不同。因此,在下指令前,请先由数据库使用手册中确认正确的语法。
21 修改栏位 ALTER TABLE
  • 21.1 语法
  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 语法
DROP TABLE "表格名"
  • 22.2 实例
DROP TABLE customer

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

23 清除表格资料 TRUNCATE TABLE
  • 23.1 语法
TRUNCATE TABLE "表格名"
  • 23.2 实例
TRUNCATE TABLE customer

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

24 资料输入表格 INSERT INTO
  • 24.1 语法
INSERT INTO "表格名" ("栏位 1", "栏位 2", ...) 
VALUES ("值 1", "值 2", ...)
  • 24.2 实例1(单条数据录入)
  INSERT INTO customer (First_Name,Last_Name,Address,City,Country,Birth_Date) 
  VALUES ("Liang","Yajun","四川成都龙泉","成都","四川","1991-04-06")
  • 24.3 实例2(多条数据录入—其他表格读取录入)
  INSERT INTO user_info(store_name,Sales,Date) 
  SELECT CONCAT(First_Name," ",Last_Name),Birth_Date,Birth_Date FROM customer; 
25 表格资料更新 UPDATE
  • 25.1 语法
UPDATE "表格名" 
SET "栏位 1" = [新值] 
WHERE {条件}
  • 25.2 实例
UPDATE store_information 
SET Sales = 1000
WHERE store_name = "San Diego" 
AND Date = "Jan-07-1999"
  • 25.3 结果

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$1000Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-09-1999
26 去除资料 DELETE FROM
  • 26.1 语法
DELETE FROM "表格名" 
WHERE {条件}
  • 26.2 实例
DELETE FROM Store_Information 
WHERE store_name = "Los Angeles"
  • 26.3 结果

    store_nameSalesDate
    San Diego$1000Jan-07-1999
    Boston$700Jan-09-1999

进阶篇

进阶篇实例用表

1. Store_Information 表格
store_nameSalesDate
Los Angeles$1500Jan-05-1999
San Diego$250Jan-07-1999
Los Angeles$300Jan-08-1999
Boston$700Jan-08-1999
2. Internet_Sales 表格
DateSales
Jan-07-1999$250
Jan-10-1999$535
Jan-11-1999$320
Jan-12-1999$750

进阶篇语法

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

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

  • 1.3 结果

    Date
    Jan-05-1999
    Jan-07-1999
    Jan-08-1999
    Jan-10-1999
    Jan-11-1999
    Jan-12-1999
2 存在重复合并两sql语句的结果【选择全部】 UNION ALL
  • 2.1 语法
[SQL 语句 1] 
UNION ALL
[SQL 语句 2]
  • 2.2 实例
SELECT Date FROM Store_Information 
UNION ALL 
SELECT Date FROM Internet_Sales
  • 2.3 结果

    Date
    Jan-05-1999
    Jan-07-1999
    Jan-08-1999
    Jan-08-1999
    Jan-07-1999
    Jan-10-1999
    Jan-11-1999
    Jan-12-1999
3 合并两sql语句的结果【选择都存在】 INTERSECT(交集)
  • 3.1 语法非MySQL
[SQL 语句 1] 
INTERSECT 
[SQL 语句 2]
  • 3.2 实例
SELECT Date FROM Store_Information 
INTERSECT 
SELECT Date FROM Internet_Sales
  • 3.3 结果

    Date
    Jan-07-1999
4 SQL1的结果如果在SQL2中存在就删除,返回剩余SQL1 MINUS
  • 4.1 语法非MySQL
[SQL 语句 1] 
MINUS 
[SQL 语句 2]
  • 4.2 实例
SELECT Date FROM Store_Information 
MINUS 
SELECT Date FROM Internet_Sales

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

  • 4.3 结果

    Date
    Jan-05-1999
    Jan-08-1999
5 子查询
  • 5.1 语法
SELECT "栏位 1" 
FROM "表格" 
WHERE "栏位 2" [比较运算素] 
(SELECT "栏位 1" 
FROM "表格" 
WHERE [条件])
  • 5.2 实例
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 语法
SELECT "栏位 1" 
FROM "表格 1" 
WHERE EXISTS 
(SELECT * 
FROM "表格 2" 
WHERE [条件])
  • 6.2 实例
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 语法
SELECT CASE ("栏位名") 
 WHEN "条件 1" THEN "结果 1" 
 WHEN "条件 2" THEN "结果 2" 
 ... 
 [ELSE "结果 N"] 
 END 
FROM "表格名"
  • 7.2 实例
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_nameSalesDate
    Los Angeles$3000Jan-05-1999
    San Diego$375Jan-07-1999
    Los Angeles$600Jan-08-1999
    Boston$700Jan-08-1999
8 算排名
  • 8.1 实例
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_Rank
    Greg501
    Sophia402
    Stella203
    Jeff203
    Jennifer155
    John106
9 算中位数
  • 9.1 实例
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 结果

    Median
    20
10 算总合百分比
  • 10.1 语法
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_Total
    Greg500.3226
    Sophia400.2581
    Stella200.1290
    Jeff200.1290
    Jennifer150.0968
    John100.0645
11 算累积总合百分比
  • 11.1 语法
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_Total
    Greg500.3226
    Sophia400.5806
    Stella200.7097
    Jeff200.8387
    Jennifer150.9355
    John101.0000

语法汇总

  //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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rattenking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值