1.创建表

语法

  1. CREATE TABLE <表名>(<列名> <数据类型>[列级完整性约束条件]
  2. [,<列名> <数据类型>[列级完整性约束条件]]…);

列级完整性约束条件有NULL[可为空]、NOT NULL[不为空]、UNIQUE[唯一],可以组合使用,但是不能重复和对立关系同时存在。

示例

  1. -- 创建学生表
  2. CREATE TABLE Student
  3. (
  4. Id INT NOT NULL UNIQUE PRIMARY KEY,
  5. Name VARCHAR(20) NOT NULL,
  6. Age INT NULL,
  7. Gender VARCHAR(4) NULL
  8. );

2.删除表

语法

  1. DROP TABLE <表名>;

示例

  1. -- 删除学生表
  2. DROP TABLE Student;

3.清空表

语法

  1. TRUNCATE TABLE <表名>;

示例

  1. -- 删除学生表
  2. TRUNCATE TABLE Student;

4.修改表

语法

  1. -- 添加列
  2. ALTER TABLE <表名> [ADD <新列名> <数据类型>[列级完整性约束条件]]
  3. -- 删除列
  4. ALTER TABLE <表名> [DROP COLUMN <列名>]
  5. -- 修改列
  6. ALTER TABLE <表名> [MODIFY COLUMN <列名> <数据类型> [列级完整性约束条件]]

示例

  1. -- 添加学生表`Phone`
  2. ALTER TABLE Student ADD Phone VARCHAR(15) NULL;
  3. -- 删除学生表`Phone`
  4. ALTER TABLE Student DROP COLUMN Phone;
  5. -- 修改学生表`Phone`
  6. ALTER TABLE Student MODIFY Phone VARCHAR(13) NULL;

5.查询

语法

  1. SELECT [ALL | DISTINCT] <目标列表达式>[,<目标列表达式>]…
  2. FROM <表名或视图名>[,<表名或视图名>]…
  3. [WHERE <条件表达式>]
  4. [GROUP BY <列名> [HAVING <条件表达式>]]
  5. [ORDER BY <列名> [ASC|DESC]…]

SQL查询语句的顺序:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。SELECT、FROM是必须的,HAVING子句只能与GROUP BY搭配使用。

示例

  1. SELECT * FROM Student
  2. WHERE Id>10
  3. GROUP BY Age HAVING AVG(Age) > 20
  4. ORDER BY Id DESC

6.插入

语法

  1. -- 插入不存在的数据
  2. INSERT INTO <表名> [(字段名[,字段名]…)] VALUES (常量[,常量]…);
  3. -- 将查询的数据插入到数据表中
  4. INSERT INTO <表名> [(字段名[,字段名]…)] SELECT 查询语句;

示例

  1. -- 插入不存在的数据
  2. INSERT INTO Student (Name,Age,Gender) VALUES ('Andy',30,'女');
  3. -- 将查询的数据插入到数据表中
  4. INSERT INTO Student (Name,Age,Gender)
  5. SELECT Name,Age,Gender FROM Student_T WHERE Id >10;

7.更新

语法

  1. UPDATE <表名> SET 列名=值表达式[,列名=值表达式…]
  2. [WHERE 条件表达式]

示例

  1. -- Id在(10,100)的Age1
  2. UPDATE Student SET Age= Age+1 WHERE Id>10 AND Id<100

8.删除

语法

  1. DELETE FROM <表名> [WHERE 条件表达式]

示例

  1. -- 删除Id小于10的数据记录
  2. DELETE FROM Student WHERE Id<10;

9.索引

索引是一种特殊的查询表,可以被数据库搜索引擎用来加速数据的检索。简单说来,索引就是指向表中数据的指针。数据库的索引同书籍后面的索引非常相像。

例如,如果想要查阅一本书中与某个特定主题相关的所有页面,你会先去查询索引(索引按照字母表顺序列出了所有主题),然后从索引中找到一页或者多页与该主题相关的页面。

索引能够提高 SELECT 查询和 WHERE 子句的速度,但是却降低了包含 UPDATE 语句或 INSERT 语句的数据输入过程的速度。索引的创建与删除不会对表中的数据产生影响。

创建索引需要使用 CREATE INDEX 语句,该语句允许对索引命名,指定要创建索引的表以及对哪些列进行索引,还可以指定索引按照升序或者降序排列。

同 UNIQUE 约束一样,索引可以是唯一的。这种情况下,索引会阻止列中(或者列的组合,其中某些列有索引)出现重复的条目。

创建索引

语法

  1. CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>]]…);

UNIQUE:表明此索引的每一个索引值只对应唯一的数据记录
CLUSTER:表明建立的索引是聚集索引
次序:可选ASC(升序)或DESC(降序),默认ASC

示例

  1. -- 建立学生表索引:单一字段Id索引倒序
  2. CREATE UNIQUE INDEX INDEX_SId ON Student (Id DESC);
  3. -- 建立学生表索引:多个字段IdName索引倒序
  4. CREATE UNIQUE INDEX INDEX_SId_SName ON Student (Id DESC,Name DESC);

删除索引

语法

  1. DROP INDEX <索引名>;

示例

  1. -- 删除学生表索引 INDEX_SId
  2. DROP INDEX INDEX_SId;

10.视图

视图无非就是存储在数据库中并具有名字的 SQL 语句,或者说是以预定义的 SQL 查询的形式存在的数据表的成分。

视图可以包含表中的所有列,或者仅包含选定的列。视图可以创建自一个或者多个表,这取决于创建该视图的 SQL 语句的写法。

视图,一种虚拟的表,允许用户执行以下操作:

  • 以用户或者某些类型的用户感觉自然或者直观的方式来组织数据;
  • 限制对数据的访问,从而使得用户仅能够看到或者修改(某些情况下)他们需要的数据;
  • 从多个表中汇总数据,以产生报表。

创建视图

语法

  1. CREATE VIEW <视图名>
  2. AS SELECT 查询子句
  3. [WITH CHECK OPTION]

查询子句:子查询可以是任何SELECT语句,但是常不允许含有ORDER BY子句和DISTINCT短语;
WITH CHECK OPTION:表示对UPDATE、INSERT、DELETE操作时要保证更新。

更新视图

视图可以在特定的情况下更新:

  • SELECT 子句不能包含 DISTINCT 关键字
  • SELECT 子句不能包含任何汇总函数(summary functions)
  • SELECT 子句不能包含任何集合函数(set functions)
  • SELECT 子句不能包含任何集合运算符(set operators)
  • SELECT 子句不能包含 ORDER BY 子句
  • FROM 子句中不能有多个数据表
  • WHERE 子句不能包含子查询(subquery)
  • 查询语句中不能有 GROUP BY 或者 HAVING
  • 计算得出的列不能更新
  • 视图必须包含原始数据表中所有的 NOT NULL 列,从而使 INSERT 查询生效。

示例

  1. CREATE VIEW VIEW_Stu_Man
  2. AS SELECT * FROM Student WHERE Gender = '男'
  3. WITH CHECK OPTION

删除视图

语法

  1. DROP VIEW <视图名>;

示例

  1. DROP VIEW VIEW_Stu_Man;

11.ORDER BY

ORDER BY 子句根据一列或者多列的值,按照升序或者降序排列数据。某些数据库默认以升序排列查询结果。

语法

  1. SELECT [ALL | DISTINCT] <目标列表达式>[,<目标列表达式>]…
  2. FROM <表名或视图名>[,<表名或视图名>]…
  3. [WHERE <条件表达式>]
  4. [ORDER BY <列名>] [ASC | DESC];

ORDER BY 子句可以同时使用多个列作为排序条件。无论用哪一列作为排序条件,都要确保该列在存在。

示例

  1. SELECT * FROM CUSTOMERS
  2. ORDER BY NAME DESC

12.WHERE

WHERE 子句用于有条件地从单个表中取回数据或者将多个表进行合并。

如果条件满足,则查询只返回表中满足条件的值。你可以用 WHERE 子句来过滤查询结果,只获取必要的记录。

WHERE 子句不仅可以用于 SELECT 语句,还可以用于 UPDATE、DELETE 等语句。

语法

  1. SELECT [ALL | DISTINCT] <目标列表达式>[,<目标列表达式>]…
  2. FROM <表名或视图名>[,<表名或视图名>]…
  3. WHERE <条件表达式>

在指定条件时,可以使用关系运算符和逻辑运算符,例如 ><=LIKENOT 等。

示例

  1. SELECT ID, NAME, SALARY
  2. FROM CUSTOMERS
  3. WHERE SALARY > 2000;

13.LIKE

LIKE 子句通过通配符来将一个值同其他相似的值作比较。可以同 LIKE 运算符一起使用的通配符有两个:

  • 百分号(%)
  • 下划线(_)

百分号代表零个、一个或者多个字符。下划线则代表单个数字或者字符。两个符号可以一起使用。

语法

% 和 _ 的基本语法如下:

  1. SELECT FROM table_name
  2. WHERE column LIKE 'XXXX%'
  3. SELECT FROM table_name
  4. WHERE column LIKE '%XXXX%'
  5. SELECT FROM table_name
  6. WHERE column LIKE 'XXXX_'
  7. SELECT FROM table_name
  8. WHERE column LIKE '_XXXX'
  9. SELECT FROM table_name
  10. WHERE column LIKE '_XXXX_'

你可以将多个条件用 AND 或者 OR 连接在一起。这里,XXXX 为任何数字值或者字符串。

示例

下面这些示例中,每个 WHERE 子句都有不同的 LIKE 子句,展示了 % 和 _ 的用法:

语句 描述
WHERE SALARY LIKE ‘200%’ 找出所有 200 打头的值
WHERE SALARY LIKE ‘%200%’ 找出所有含有 200 的值
WHERE SALARY LIKE ‘_00%’ 找出所有第二位和第三位为 0 的值
WHERE SALARY LIKE ‘2%%’ 找出所有以 2 开始,并且长度至少为 3 的值
WHERE SALARY LIKE ‘%2’ 找出所有以 2 结尾的值
WHERE SALARY LIKE ‘_2%3’ 找出所有第二位为 2,并且以3结束的值
WHERE SALARY LIKE ‘2___3’ 找出所有以 2 开头以 3 结束的五位数

14.HAVING

HAVING 子句使你能够指定过滤条件,从而控制查询结果中哪些组可以出现在最终结果里面。

WHERE 子句对被选择的列施加条件,而 HAVING 子句则对 GROUP BY 子句所产生的组施加条件。

语法

下面可以看到 HAVING 子句在 SELECT 查询中的位置:

  1. SELECT
  2. FROM
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. ORDER BY

在 SELECT 查询中,HAVING 子句必须紧随 GROUP BY 子句,并出现在 ORDER BY 子句(如果有的话)之前。带有 HAVING 子句的 SELECT 语句的语法如下所示:

  1. SELECT column1, column2
  2. FROM table1, table2
  3. WHERE [ conditions ]
  4. GROUP BY column1, column2
  5. HAVING [ conditions ]
  6. ORDER BY column1, column2

示例

考虑 CUSTOMERS 表,表中的记录如下所示:

  1. +----+----------+-----+-----------+----------+
  2. | ID | NAME | AGE | ADDRESS | SALARY |
  3. +----+----------+-----+-----------+----------+
  4. | 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
  5. | 2 | Khilan | 25 | Delhi | 1500.00 |
  6. | 3 | kaushik | 23 | Kota | 2000.00 |
  7. | 4 | Chaitali | 25 | Mumbai | 6500.00 |
  8. | 5 | Hardik | 27 | Bhopal | 8500.00 |
  9. | 6 | Komal | 22 | MP | 4500.00 |
  10. | 7 | Muffy | 24 | Indore | 10000.00 |
  11. +----+----------+-----+-----------+----------+

下面是一个有关 HAVING 子句使用的实例,该实例将会筛选出出现次数大于或等于 2 的所有记录。

  1. SELECT ID, NAME, AGE, ADDRESS, SALARY
  2. FROM CUSTOMERS
  3. GROUP BY age
  4. HAVING COUNT(age) >= 2;

其执行结果如下所示:

  1. +----+--------+-----+---------+---------+
  2. | ID | NAME | AGE | ADDRESS | SALARY |
  3. +----+--------+-----+---------+---------+
  4. | 2 | Khilan | 25 | Delhi | 1500.00 |
  5. +----+--------+-----+---------+---------+

15.DISTINCT

DISTINCT 关键字同 SELECT 语句一起使用,可以去除所有重复记录,只返回唯一项。

有时候,数据表中可能会有重复的记录。在检索这些记录的时候,应该只取回唯一的记录,而不是重复的。

语法

使用 DISTINCT 关键字去除查询结果中的重复记录的基本语法如下所示:

  1. SELECT DISTINCT column1, column2,.....columnN
  2. FROM table_name
  3. WHERE [condition]

示例

  1. SELECT DISTINCT SALARY FROM CUSTOMERS
  2. ORDER BY SALARY

去除(SALARY 字段)重复记录。

16.AND和OR

ANDOR 运算符可以将多个条件结合在一起,从而过滤 SQL 语句的返回结果。这两个运算符被称作连接运算符。

AND

语法

  1. SELECT column1, column2, columnN
  2. FROM table_name
  3. WHERE [condition1] AND [condition2]...AND [conditionN];

将 N 个条件用 AND 运算符结合在一起。对于 SQL 语句要执行的动作来说——无论是事务还是查询,AND 运算符连接的所有条件都必须为 TRUE。

示例

  1. SELECT ID, NAME, SALARY
  2. FROM CUSTOMERS
  3. WHERE SALARY > 2000 AND age < 25;

OR

语法

  1. SELECT column1, column2, columnN
  2. FROM table_name
  3. WHERE [condition1] OR [condition2]...OR [conditionN]

你可以将 N 个条件用 OR 运算符结合在一起。对于 SQL 语句要执行的动作来说——无论是事务还是查询,OR 运算符连接的所有条件中只需要有一个为 TRUE 即可。

示例

  1. SELECT ID, NAME, SALARY
  2. FROM CUSTOMERS
  3. WHERE SALARY > 2000 OR age < 25;

17.UNION

UNION 子句/运算符用于将两个或者更多的 SELECT 语句的运算结果组合起来。

在使用 UNION 的时候,每个 SELECT 语句必须有相同数量的选中列、相同数量的列表达式、相同的数据类型,并且它们出现的次序要一致,不过长度不一定要相同。

语法

  1. SELECT column1 [, column2 ]
  2. FROM table1 [, table2 ]
  3. [WHERE condition]
  4. UNION
  5. SELECT column1 [, column2 ]
  6. FROM table1 [, table2 ]
  7. [WHERE condition]

这里的条件可以是任何根据你的需要而设的条件。

示例

  1. SELECT Txn_Date FROM Store_Information
  2. UNION
  3. SELECT Txn_Date FROM Internet_Sales;

UNION ALL 子句:

UNION ALL 运算符用于将两个 SELECT 语句的结果组合在一起,重复行也包含在内。

其他类似语句

INTERSECT子句

用于组合两个 SELECT 语句,但是只返回两个 SELECT 语句的结果中都有的行。

EXCEPT 子句

组合两个 SELECT 语句,并将第一个 SELECT 语句的结果中存在,但是第二个 SELECT 语句的结果中不存在的行返回。

18.JOIN

连接(JOIN) 子句用于将数据库中两个或者两个以上表中的记录组合起来。连接通过共有值将不同表中的字段组合在一起。

考虑下面两个表,(a)CUSTOMERS 表:

  1. +----+----------+-----+-----------+----------+
  2. | ID | NAME | AGE | ADDRESS | SALARY |
  3. +----+----------+-----+-----------+----------+
  4. | 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
  5. | 2 | Khilan | 25 | Delhi | 1500.00 |
  6. | 3 | kaushik | 23 | Kota | 2000.00 |
  7. | 4 | Chaitali | 25 | Mumbai | 6500.00 |
  8. | 5 | Hardik | 27 | Bhopal | 8500.00 |
  9. | 6 | Komal | 22 | MP | 4500.00 |
  10. | 7 | Muffy | 24 | Indore | 10000.00 |
  11. +----+----------+-----+-----------+----------+

(b)另一个表是 ORDERS 表:

  1. +-----+---------------------+-------------+--------+
  2. |OID | DATE | CUSTOMER_ID | AMOUNT |
  3. +-----+---------------------+-------------+--------+
  4. | 102 | 2009-10-08 00:00:00 | 3 | 3000 |
  5. | 100 | 2009-10-08 00:00:00 | 3 | 1500 |
  6. | 101 | 2009-11-20 00:00:00 | 2 | 1560 |
  7. | 103 | 2008-05-20 00:00:00 | 4 | 2060 |
  8. +-----+---------------------+-------------+--------+

现在,让我们用 SELECT 语句将这个两张表连接(JOIN)在一起:

  1. SQL> SELECT ID, NAME, AGE, AMOUNT
  2. FROM CUSTOMERS, ORDERS
  3. WHERE CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句的运行结果如下所示:

  1. +----+----------+-----+--------+
  2. | ID | NAME | AGE | AMOUNT |
  3. +----+----------+-----+--------+
  4. | 3 | kaushik | 23 | 3000 |
  5. | 3 | kaushik | 23 | 1500 |
  6. | 2 | Khilan | 25 | 1560 |
  7. | 4 | Chaitali | 25 | 2060 |
  8. +----+----------+-----+--------+

SQL 连接类型

SQL 中有多种不同的连接:

  • 内连接(INNER JOIN):当两个表中都存在匹配时,才返回行。
  • 左连接(LEFT JOIN):返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。
  • 右连接(RIGHT JOIN):恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。
  • 全连接(FULL JOIN):返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值

内连接

语法

  1. SELECT table1.column1, table2.column2...
  2. FROM table1
  3. INNER JOIN table2
  4. ON table1.common_field = table2.common_field;

示例

考虑如下两个表格,(a)CUSTOMERS 表:

  1. +----+----------+-----+-----------+----------+
  2. | ID | NAME | AGE | ADDRESS | SALARY |
  3. +----+----------+-----+-----------+----------+
  4. | 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
  5. | 2 | Khilan | 25 | Delhi | 1500.00 |
  6. | 3 | kaushik | 23 | Kota | 2000.00 |
  7. | 4 | Chaitali | 25 | Mumbai | 6500.00 |
  8. | 5 | Hardik | 27 | Bhopal | 8500.00 |
  9. | 6 | Komal | 22 | MP | 4500.00 |
  10. | 7 | Muffy | 24 | Indore | 10000.00 |
  11. +----+----------+-----+-----------+----------+

(b)ORDERS 表:

  1. +-----+---------------------+-------------+--------+
  2. | OID | DATE | ID | AMOUNT |
  3. +-----+---------------------+-------------+--------+
  4. | 102 | 2009-10-08 00:00:00 | 3 | 3000 |
  5. | 100 | 2009-10-08 00:00:00 | 3 | 1500 |
  6. | 101 | 2009-11-20 00:00:00 | 2 | 1560 |
  7. | 103 | 2008-05-20 00:00:00 | 4 | 2060 |
  8. +-----+---------------------+-------------+--------+

现在,让我们用内连接将这两个表连接在一起:

  1. SELECT ID, NAME, AMOUNT, DATE
  2. FROM CUSTOMERS
  3. INNER JOIN ORDERS
  4. ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

  1. +----+----------+--------+---------------------+
  2. | ID | NAME | AMOUNT | DATE |
  3. +----+----------+--------+---------------------+
  4. | 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
  5. | 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
  6. | 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
  7. | 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
  8. +----+----------+--------+---------------------+

左连接

语法

  1. SELECT table1.column1, table2.column2...
  2. FROM table1
  3. LEFT JOIN table2
  4. ON table1.common_field = table2.common_field;

这里,给出的条件可以是任何根据你的需要写出的条件。

示例

考虑如下两个表格,(a)CUSTOMERS 表:

  1. +----+----------+-----+-----------+----------+
  2. | ID | NAME | AGE | ADDRESS | SALARY |
  3. +----+----------+-----+-----------+----------+
  4. | 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
  5. | 2 | Khilan | 25 | Delhi | 1500.00 |
  6. | 3 | kaushik | 23 | Kota | 2000.00 |
  7. | 4 | Chaitali | 25 | Mumbai | 6500.00 |
  8. | 5 | Hardik | 27 | Bhopal | 8500.00 |
  9. | 6 | Komal | 22 | MP | 4500.00 |
  10. | 7 | Muffy | 24 | Indore | 10000.00 |
  11. +----+----------+-----+-----------+----------+

(b)ORDERS 表:

  1. +-----+---------------------+-------------+--------+
  2. | OID | DATE | ID | AMOUNT |
  3. +-----+---------------------+-------------+--------+
  4. | 102 | 2009-10-08 00:00:00 | 3 | 3000 |
  5. | 100 | 2009-10-08 00:00:00 | 3 | 1500 |
  6. | 101 | 2009-11-20 00:00:00 | 2 | 1560 |
  7. | 103 | 2008-05-20 00:00:00 | 4 | 2060 |
  8. +-----+---------------------+-------------+--------+

现在,让我们用左连接将这两个表连接在一起:

  1. SELECT ID, NAME, AMOUNT, DATE
  2. FROM CUSTOMERS
  3. LEFT JOIN ORDERS
  4. ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

  1. +----+----------+--------+---------------------+
  2. | ID | NAME | AMOUNT | DATE |
  3. +----+----------+--------+---------------------+
  4. | 1 | Ramesh | NULL | NULL |
  5. | 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
  6. | 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
  7. | 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
  8. | 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
  9. | 5 | Hardik | NULL | NULL |
  10. | 6 | Komal | NULL | NULL |
  11. | 7 | Muffy | NULL | NULL |
  12. +----+----------+--------+---------------------+

右连接

语法

  1. SELECT table1.column1, table2.column2...
  2. FROM table1
  3. RIGHT JOIN table2
  4. ON table1.common_field = table2.common_field;

这里,给出的条件可以是任何根据你的需要写出的条件。

示例

考虑如下两个表格,(a)CUSTOMERS 表:

  1. +----+----------+-----+-----------+----------+
  2. | ID | NAME | AGE | ADDRESS | SALARY |
  3. +----+----------+-----+-----------+----------+
  4. | 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
  5. | 2 | Khilan | 25 | Delhi | 1500.00 |
  6. | 3 | kaushik | 23 | Kota | 2000.00 |
  7. | 4 | Chaitali | 25 | Mumbai | 6500.00 |
  8. | 5 | Hardik | 27 | Bhopal | 8500.00 |
  9. | 6 | Komal | 22 | MP | 4500.00 |
  10. | 7 | Muffy | 24 | Indore | 10000.00 |
  11. +----+----------+-----+-----------+----------+

(b)ORDERS 表:

  1. +-----+---------------------+-------------+--------+
  2. | OID | DATE | ID | AMOUNT |
  3. +-----+---------------------+-------------+--------+
  4. | 102 | 2009-10-08 00:00:00 | 3 | 3000 |
  5. | 100 | 2009-10-08 00:00:00 | 3 | 1500 |
  6. | 101 | 2009-11-20 00:00:00 | 2 | 1560 |
  7. | 103 | 2008-05-20 00:00:00 | 4 | 2060 |
  8. +-----+---------------------+-------------+--------+

现在,让我们用右连接将这两个表连接在一起:

  1. SELECT ID, NAME, AMOUNT, DATE
  2. FROM CUSTOMERS
  3. RIGHT JOIN ORDERS
  4. ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

  1. +------+----------+--------+---------------------+
  2. | ID | NAME | AMOUNT | DATE |
  3. +------+----------+--------+---------------------+
  4. | 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
  5. | 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
  6. | 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
  7. | 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
  8. +------+----------+--------+---------------------+

全连接

语法

  1. SELECT table1.column1, table2.column2...
  2. FROM table1
  3. FULL JOIN table2
  4. ON table1.common_field = table2.common_field;

这里,给出的条件可以是任何根据你的需要写出的条件。

示例

考虑如下两个表格,(a)CUSTOMERS 表:

  1. +----+----------+-----+-----------+----------+
  2. | ID | NAME | AGE | ADDRESS | SALARY |
  3. +----+----------+-----+-----------+----------+
  4. | 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
  5. | 2 | Khilan | 25 | Delhi | 1500.00 |
  6. | 3 | kaushik | 23 | Kota | 2000.00 |
  7. | 4 | Chaitali | 25 | Mumbai | 6500.00 |
  8. | 5 | Hardik | 27 | Bhopal | 8500.00 |
  9. | 6 | Komal | 22 | MP | 4500.00 |
  10. | 7 | Muffy | 24 | Indore | 10000.00 |
  11. +----+----------+-----+-----------+----------+

(b)ORDERS 表:

  1. +-----+---------------------+-------------+--------+
  2. | OID | DATE | ID | AMOUNT |
  3. +-----+---------------------+-------------+--------+
  4. | 102 | 2009-10-08 00:00:00 | 3 | 3000 |
  5. | 100 | 2009-10-08 00:00:00 | 3 | 1500 |
  6. | 101 | 2009-11-20 00:00:00 | 2 | 1560 |
  7. | 103 | 2008-05-20 00:00:00 | 4 | 2060 |
  8. +-----+---------------------+-------------+--------+

现在让我们用全连接将两个表连接在一起:

  1. SELECT ID, NAME, AMOUNT, DATE
  2. FROM CUSTOMERS
  3. FULL JOIN ORDERS
  4. ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

  1. +------+----------+--------+---------------------+
  2. | ID | NAME | AMOUNT | DATE |
  3. +------+----------+--------+---------------------+
  4. | 1 | Ramesh | NULL | NULL |
  5. | 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
  6. | 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
  7. | 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
  8. | 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
  9. | 5 | Hardik | NULL | NULL |
  10. | 6 | Komal | NULL | NULL |
  11. | 7 | Muffy | NULL | NULL |
  12. | 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
  13. | 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
  14. | 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
  15. | 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
  16. +------+----------+--------+---------------------+

如果你所用的数据库不支持全连接,比如 MySQL,那么你可以使用 UNION ALL子句来将左连接和右连接结果组合在一起:

  1. SELECT ID, NAME, AMOUNT, DATE
  2. FROM CUSTOMERS
  3. LEFT JOIN ORDERS
  4. ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
  5. UNION ALL
  6. SELECT ID, NAME, AMOUNT, DATE
  7. FROM CUSTOMERS
  8. RIGHT JOIN ORDERS
  9. ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID

19.常用函数

COUNT函数是 SQL 中最简单的函数了,对于统计由 SELECT 语句返回的记录非常有用。

要理解 COUNT 函数,请考虑 employee_tbl 表,表中的记录如下所示:

  1. SELECT * FROM employee_tbl;
  2. +------+------+------------+--------------------+
  3. | id | name | work_date | daily_typing_pages |
  4. +------+------+------------+--------------------+
  5. | 1 | John | 2007-01-24 | 250 |
  6. | 2 | Ram | 2007-05-27 | 220 |
  7. | 3 | Jack | 2007-05-06 | 170 |
  8. | 3 | Jack | 2007-04-06 | 100 |
  9. | 4 | Jill | 2007-04-06 | 220 |
  10. | 5 | Zara | 2007-06-06 | 300 |
  11. | 5 | Zara | 2007-02-06 | 350 |
  12. +------+------+------------+--------------------+
  13. 7 rows in set (0.00 sec)

现在,假设你想要统计上表中记录的总数,那么可以依如下所示步骤达到目的:

  1. SELECT COUNT(*) FROM employee_tbl ;
  2. +----------+
  3. | COUNT(*) |
  4. +----------+
  5. | 7 |
  6. +----------+
  7. 1 row in set (0.01 sec)

类似地,如果你想要统计 Zara 的数目,就可以像下面这样:

  1. SELECT COUNT(*) FROM employee_tbl
  2. WHERE name="Zara";
  3. +----------+
  4. | COUNT(*) |
  5. +----------+
  6. | 2 |
  7. +----------+
  8. 1 row in set (0.04 sec)

注意:所有的 SQL 查询都是不区分大小写的,因此在 WHERE 子句的条件中,ZARA 和 Zara 是没有任何区别的。

CONCAT 函数用于将两个字符串连接为一个字符串,试一下下面这个例子:

  1. SELECT CONCAT('FIRST ', 'SECOND');
  2. +----------------------------+
  3. | CONCAT('FIRST ', 'SECOND') |
  4. +----------------------------+
  5. | FIRST SECOND |
  6. +----------------------------+
  7. 1 row in set (0.00 sec)

要对 CONCAT 函数有更为深入的了解,请考虑 employee_tbl 表,表中记录如下所示:

  1. SELECT * FROM employee_tbl;
  2. +------+------+------------+--------------------+
  3. | id | name | work_date | daily_typing_pages |
  4. +------+------+------------+--------------------+
  5. | 1 | John | 2007-01-24 | 250 |
  6. | 2 | Ram | 2007-05-27 | 220 |
  7. | 3 | Jack | 2007-05-06 | 170 |
  8. | 3 | Jack | 2007-04-06 | 100 |
  9. | 4 | Jill | 2007-04-06 | 220 |
  10. | 5 | Zara | 2007-06-06 | 300 |
  11. | 5 | Zara | 2007-02-06 | 350 |
  12. +------+------+------------+--------------------+
  13. 7 rows in set (0.00 sec)

现在,假设你想要将上表中所有的姓名(name)、id和工作日(work_date)连接在一起,那么可以通过如下的命令来达到目的:

  1. SELECT CONCAT(id, name, work_date)
  2. FROM employee_tbl;
  3. +-----------------------------+
  4. | CONCAT(id, name, work_date) |
  5. +-----------------------------+
  6. | 1John2007-01-24 |
  7. | 2Ram2007-05-27 |
  8. | 3Jack2007-05-06 |
  9. | 3Jack2007-04-06 |
  10. | 4Jill2007-04-06 |
  11. | 5Zara2007-06-06 |
  12. | 5Zara2007-02-06 |
  13. +-----------------------------+
  14. 7 rows in set (0.00 sec)

SUM函数用于找出表中记录在某字段处的总和。

要理解 SUM 函数,请考虑 employee_tbl 表,表中记录如下所示:

  1. SELECT * FROM employee_tbl;
  2. +------+------+------------+--------------------+
  3. | id | name | work_date | daily_typing_pages |
  4. +------+------+------------+--------------------+
  5. | 1 | John | 2007-01-24 | 250 |
  6. | 2 | Ram | 2007-05-27 | 220 |
  7. | 3 | Jack | 2007-05-06 | 170 |
  8. | 3 | Jack | 2007-04-06 | 100 |
  9. | 4 | Jill | 2007-04-06 | 220 |
  10. | 5 | Zara | 2007-06-06 | 300 |
  11. | 5 | Zara | 2007-02-06 | 350 |
  12. +------+------+------------+--------------------+
  13. 7 rows in set (0.00 sec)

现在,假设你想要获取 daily_typing_pages 的总和,那么你可以用如下命令来达到目的:

  1. SELECT SUM(daily_typing_pages)
  2. FROM employee_tbl;
  3. +-------------------------+
  4. | SUM(daily_typing_pages) |
  5. +-------------------------+
  6. | 1610 |
  7. +-------------------------+
  8. 1 row in set (0.00 sec)

你还可以使用 GROUP BY 子句来得出不同记录分组的总和。下面的例子将会计算得出每个人的总和,,你将能够得到每个人打的总页数。

  1. SELECT name, SUM(daily_typing_pages)
  2. FROM employee_tbl GROUP BY name;