• 1.创建表
  • 2.删除表
  • 3.清空表
  • 4.修改表
  • 5.查询
  • 6.插入
  • 7.更新
  • 8.删除
  • 9.索引
  • 10.视图
  • 11.ORDER BY
  • 12.WHERE
  • 13.LIKE
  • 14.HAVING
  • 15.DISTINCT
  • 16.AND和OR
  • 17.UNION
  • 18.JOIN
  • 19.常用函数

    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;