1 SQL基础教程

作者: 7125messi | 来源:发表于2018-02-07 08:53 被阅读71次

    1 SQL基础

    1.1 SQL 简介

    SQL(结构化查询语言)是用于访问和操作数据库中的数据的标准数据库编程语言。
    为了处理数据库和数据库相关的编程,程序员需要有一些介质,或者可以说接口来详细说明一组命令或代码来处理数据库或访问数据库的数据。在本章中,将简要介绍在学习SQL的过程中您将学习的术语。

    SQL为结构化查询语言提供了独特的学习和数据库处理技术,并将帮助您更好地控制SQL查询并有效处理这些代码。由于SQL帮助您包括数据库创建,数据库或表删除,获取行数据和修改这些数据等,并行SQL使得事情自动和平滑,最终用户可以轻松访问和处理该应用程序的数据。

    1.2 SQL 能做什么?

    SQL可以创建新的数据库及其对象(表,索引,视图,存储过程,函数和触发器)。

    SQL可以修改现有数据库的结构。
    SQL可以从数据库中删除(删除)对象。
    SQL可以TRUNCATE(删除)表中的所有记录。
    SQL可以对数据字典进行COMMENT。
    SQL可以RENAME一个对象。
    SQL可以从数据库中选择(检索)数据。
    SQL可以将数据插入到表中。
    SQL可以更新表中的现有数据。
    SQL可以从数据库表中删除记录。
    SQL可以在数据库中设置用户的GRANT和REVOKE权限。
    

    1.3 RDBMS

    RDBMS 指关系型数据库管理系统,全称 Relational Database Management System。RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础,比如 MS SQL Server、IBM DB2、Oracle、MySQL 以及 Microsoft Access。RDBMS 中的数据存储在被称为表的数据库对象中。表是相关的数据项的集合,它由列和行组成。

    1.4 SQL 语法规则

    SQL语句总是以关键字开始;
    SQL语句以分号结尾(一些数据库系统需要在每个SQL语句的末尾使用分号。
    分号是分离数据库系统中每个SQL语句的标准方法,这样您就可以在对服务器的同一请求中执行多个SQL语句);
    SQL不区分大小写,意味着更新与UPDATE相同
    

    1.5 最重要的 SQL 命令

    SELECT - 从数据库中提取数据
    UPDATE - 更新数据库中的数据
    DELETE - 从数据库中删除数据
    INSERT INTO - 向数据库中插入新数据
    CREATE DATABASE - 创建新数据库
    ALTER DATABASE - 修改数据库
    CREATE TABLE - 创建新表
    ALTER TABLE - 变更(改变)数据库表
    DROP TABLE - 删除表
    CREATE INDEX - 创建索引(搜索键)
    DROP INDEX - 删除索引
    
    SELECT语句
    句法:
    SELECT column_name(s) FROM table_name
    
    SELECT语句和WHERE子句
    句法:
    SELECT [*] FROM [TableName] WHERE [condition1]
    
    SELECT语句与WHERE和/或子句
    句法:
    SELECT [*] FROM [TableName] WHERE [condition1] [AND [OR]] [condition2]...
    
    SELECT语句与ORDER BY
    句法:
    SELECT column_name()
    FROM table_name
    ORDER BY column_name() ASC or DESC
    
    INSERT INTO语句
    句法:
    INSERT INTO table_name (column, column1, column2, column3, ...)
    VALUES (value, value1, value2, value3 ...)
    
    更新声明
    句法:
    UPDATE table_name
    SET column=value, column1=value1,...
    WHERE someColumn=someValue
    
    DELETE语句
    句法:
    DELETE FROM tableName
    WHERE someColumn = someValue
    

    SQL SELECT DISTINCT 语句

    SELECT DISTINCT语句用于仅返回不同的(different)值。
    在一张表内,一列通常包含许多重复的值; 有时你只想列出不同的(different)值。
    SELECT DISTINCT语句用于仅返回不同的(different)值。

    SQL SELECT DISTINCT 语法
    SELECT DISTINCT column1, column2, ...
    FROM table_name;
    

    1.6 SQL 通用数据类型

    不同的数据库对数据类型定义提供不同的选择。
    下面的表格显示了各种不同的数据库平台上一些数据类型的通用名称:


    image.png

    注释:在不同的数据库中,同一种数据类型可能有不同的名称。即使名称相同,尺寸和其他细节也可能不同! 请总是检查文档!
    例如:在Oracle数据库里

    CREATE TABLE "TBL_METRO_STATISTICS" (
        "TIME" DATE NOT NULL ,
        "STATIONID" NUMBER NOT NULL ,
        "ACTION" VARCHAR2(24 BYTE) NOT NULL ,
        "DIRECTION" VARCHAR2(24 BYTE) ,
        "VOL" NUMBER NOT NULL ,
        "INSERT_TIME" NUMBER,
        "PART" as (TO_CHAR("TIME",'MM'))
    )
    partition by list (PART)
    (
      partition P01 values ('01')
        pctfree 10
        initrans 1
        maxtrans 255,
      partition P02 values ('02')
        pctfree 10
        initrans 1
        maxtrans 255,
      partition P03 values ('03')
        pctfree 10
        initrans 1
        maxtrans 255,
      partition P04 values ('04')
        pctfree 10
        initrans 1
        maxtrans 255,
      partition P05 values ('05')
        pctfree 10
        initrans 1
        maxtrans 255,
      partition P06 values ('06')
        pctfree 10
        initrans 1
        maxtrans 255,
      partition P07 values ('07')
        pctfree 10
        initrans 1
        maxtrans 255,
      partition P08 values ('08')
        pctfree 10
        initrans 1
        maxtrans 255,
      partition P09 values ('09')
        pctfree 10
        initrans 1
        maxtrans 255,
      partition P10 values ('10')
        pctfree 10
        initrans 1
        maxtrans 255,
      partition P11 values ('11')
        pctfree 10
        initrans 1
        maxtrans 255,
      partition P12 values ('12')
        pctfree 10
        initrans 1
        maxtrans 255
    );
    comment on table TBL_METRO_STATISTICS
      is '轨交进出换乘结果表';
    comment on column TBL_METRO_STATISTICS.TIME
      is '分析时间(yyyy-MM-dd HH:mm:ss),例如2015-09-01 09:00:00代表时间区间[2015-09-01 09:00:00,2015-09-01 09:15:00)分析结果';
    comment on column TBL_METRO_STATISTICS.STATIONID
      is '轨道交通站点编号(与LINE无关)';
    comment on column TBL_METRO_STATISTICS.ACTION
      is '行为标识, 进:XXIN(进入XX线); 出:XXOUT(从XX线出); 换乘:XXTYY(XX线换YY线)';
    comment on column TBL_METRO_STATISTICS.DIRECTION
      is '乘坐方向,XXIN/XXOUT 正向:0 反向:1; XXTYY 可选值00,01,10,11,-1 其中-1只和进站、出站匹配,表示进站直接换线中转或者在最后一个中转站换线出站';
    comment on column TBL_METRO_STATISTICS.VOL
      is '客流量';
    comment on column TBL_METRO_STATISTICS.INSERT_TIME
      is '该条记录的插入时间';
    
    create table TBL_CHECKLINE_DIR_DES
    (
      checklineid NUMBER(3),
      dir         NUMBER(1),
      side_from    VARCHAR2(30),
      side_to      VARCHAR2(30),
      version     NUMBER
    )
    ;
    comment on table TBL_CHECKLINE_DIR_DES
      is '校核线方向描述基础表';
    comment on column TBL_CHECKLINE_DIR_DES.checklineid
      is '校核线ID';
    comment on column TBL_CHECKLINE_DIR_DES.dir
      is '方向';
    comment on column TBL_CHECKLINE_DIR_DES.side_from
      is '方向起点';
    comment on column TBL_CHECKLINE_DIR_DES.side_to
      is '方向终点';
    comment on column TBL_CHECKLINE_DIR_DES.version
      is '版本';
    
    CREATE TABLE "TBL_ENTER_EXIT" (
        "TIME" DATE NOT NULL ,
        "TAZID" NUMBER NOT NULL ,
        "STAY" NUMBER NOT NULL ,
        "ENTER" NUMBER NOT NULL ,
        "EXIT" NUMBER NOT NULL ,
        "INOUTFREQ" NUMBER NOT NULL ,
        "INOUT" NUMBER NOT NULL
    )
    partition by range("TIME")
    interval (numtodsinterval(1,'day'))
    (
        partition par_20160101 values less than (to_date('2016-01-01','yyyy-mm-dd'))
    );
    comment on table TBL_ENTER_EXIT
      is '区域进出停留统计表';
    comment on column TBL_ENTER_EXIT.TIME
      is '分析时间(yyyy-MM-dd HH:mm:ss),例如2015-09-01 09:00:00代表时间区间[2015-09-01 09:00:00,2015-09-01 09:15:00)分析结果';
    comment on column TBL_ENTER_EXIT.TAZID
      is '交通分析区域Traffic Analysis Zone编号';
    comment on column TBL_ENTER_EXIT.STAY
      is '时间段内TAZ停留客流量(手机用户人数)';
    comment on column TBL_ENTER_EXIT.ENTER
      is '时间段内进入(未离开)TAZ客流量(手机用户人 数)';
      comment on column TBL_ENTER_EXIT.EXIT
      is '时间段内离开TAZ客流量(手机用户人数) ';
      comment on column TBL_ENTER_EXIT.INOUTFREQ
      is '时间段内既进又出TAZ人次(手机用户人次) ';
    comment on column TBL_ENTER_EXIT.INOUT
      is '时间段内既进又出TAZ人数(手机用户人数) ';
    
    CREATE TABLE TBL_STATION_LINE_SEQ_TAZ AS SELECT
        A .STATIONID as STATIONID,
        20161222 as VERSION,
        B .LINEID as LINEID,
        B .SEQ as SEQ,
        LPAD (A .stationid, 3, 0) || LPAD (b.lineid, 2, 0) || 0 AS TAZ
    FROM
        TBL_METRO_STATION A
    LEFT JOIN TBL_STATION_SEQ B ON A .STATIONDESC = B.STATION;
    
    -- UNIX转换成正常时间
    CREATE TABLE TBL_METRO_OD_IN_OUT_DISATNCE_ AS
    SELECT 
    MSID,
    O_LACCELL,
    TO_DATE('1970010108','yyyymmddhh24') + ((O_TIMESTAMP/1000)/24/60/60) O_TIMESTAMP ,
    D_LACCELL,
    TO_DATE('1970010108','yyyymmddhh24') + ((D_TIMESTAMP/1000)/24/60/60) D_TIMESTAMP ,
    WEIGHT,
    IN_LINE,
    IN_STATION,
    TO_DATE('1970010108','yyyymmddhh24') + ((IN_TIMESTAMP/1000)/24/60/60) IN_TIMESTAMP ,
    OUT_LINE,
    OUT_STATION,
    TO_DATE('1970010108','yyyymmddhh24') + ((OUT_TIMESTAMP/1000)/24/60/60) OUT_TIMESTAMP
    FROM
    TBL_METRO_OD_IN_OUT_DISATNCE
    
    SELECT
        TO_CHAR(M.IN_DATE, 'YYYYMMDD') AS DAY,
        N.STATIONID_DZ AS STATIONID_DZ,
        N.STATIONID AS STATIONID,
        M.COUNT_ENTER AS PROVIDED_ENTER,
        N.ENTER_VOL AS COMPUTER_ENTER
    FROM TBL_METRO_PROVIDED M
    LEFT JOIN
    (
    SELECT
      A .STATIONID,
        A .STATIONID_DZ,
        A .STATIONDESC,
        A .DAY,
        A .MINUTES,
        SUM (
            CASE
            WHEN A .ACTIONS = 'IN' THEN
                A .VOL
            END
        ) AS ENTER_VOL
    FROM
        (
            SELECT
          T.STATIONID,
                B.STATIONID_DZ,
                B.STATIONDESC,
                TO_CHAR (T . TIME, 'YYYYMMDD') AS DAY,
                TO_CHAR (T . TIME,'YYYY-MM-DD HH24:MI') AS MINUTES,
                CASE
            WHEN T .ACTION LIKE '%IN' THEN
                'IN'
            WHEN T .ACTION LIKE '%OUT' THEN
                'OUT'
            ELSE
                'TRANSFER'
            END AS ACTIONS,
            SUM (T .VOL) AS VOL
        FROM
            TBL_METRO_STATISTICS_NEWBASE T
        LEFT JOIN SUZHOU3_BASE.TBL_METRO_STATION B ON T.STATIONID = B.STATIONID
        GROUP BY
        T.STATIONID,
            B.STATIONID_DZ,
            B.STATIONDESC,
            TO_CHAR (T . TIME, 'YYYYMMDD'),
            CASE
        WHEN T .ACTION LIKE '%IN' THEN
            'IN'
        WHEN T .ACTION LIKE '%OUT' THEN
            'OUT'
        ELSE
            'TRANSFER'
        END,
        TO_CHAR (T.TIME,'YYYY-MM-DD HH24:MI')
        ) A
    GROUP BY
      A .STATIONID,
        A .STATIONID_DZ,
        A .STATIONDESC,
        A .DAY,
        A .MINUTES
    ORDER BY A .STATIONID
    ) N
    ON M.IN_STATION_ID=N.STATIONID_DZ
    --where day=(${请输入时间})
    

    1.7 SQL语句快速参考

    image.png
    image.png
    image.png
    image.png

    1.8 SQL Where 子句

    SQL WHERE 子句
    WHERE 子句用于提取那些满足指定标准的记录。

    SQL WHERE 语法
    SELECT column_name,column_name
    FROM table_name
    WHERE column_name operator value;
    
    SELECT * FROM Customers
    WHERE CustomerID=1;
    
    SELECT * FROM Customers
    WHERE Country='Mexico';
    

    文本字段 vs. 数值字段
    SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。
    如果是数值字段,请不要使用引号。


    image.png

    1.9 SQL AND & OR 运算符

    SQL AND & OR 运算符
    如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
    如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

    结合 AND & OR
    您也可以把 AND 和 OR 结合起来(使用圆括号来组成复杂的表达式)。
    下面的 SQL 语句从 "Customers" 表中选取国家为 "Germany" 且城市为 "Berlin" 或者 "München" 的所有客户:

    SELECT * FROM Customers
    WHERE Country='Germany'
    AND (City='Berlin' OR City='München');
    

    1.10 SQL ORDER BY 关键字

    SQL ORDER BY 关键字
    ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。
    ORDER BY 关键字默认按照升序ASC对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。

    SQL ORDER BY 语法
    SELECT column_name,column_name
    FROM table_name
    ORDER BY column_name,column_name ASC|DESC;
    

    1.11 SQL INSERT INTO 语句

    SQL INSERT INTO 语法
    INSERT INTO 语句可以有两种编写形式。
    第一种形式无需指定要插入数据的列名,只需提供被插入的值即可(需要按照字段顺序插入):
    INSERT INTO table_name
    VALUES (value1,value2,value3,...);

    第二种形式需要指定列名及被插入的值:
    INSERT INTO table_name (column1,column2,column3,...)
    VALUES (value1,value2,value3,...);

    1.12 SQL Update 语句

    SQL UPDATE 语法
    UPDATE table_name
    SET column1=value1,column2=value2,...
    WHERE some_column=some_value;
    
    UPDATE Customers
    SET ContactName='Alfred Schmidt', City='Hamburg'
    WHERE CustomerName='Alfreds Futterkiste';
    

    1.13 SQL Delete 语句

    SQL DELETE 语法
    DELETE FROM table_name
    WHERE some_column=some_value;
    
    DELETE FROM Customers
    WHERE CustomerName='Alfreds Futterkiste' AND ContactName='Maria Anders';
    

    删除所有数据
    您可以在不删除表的情况下,删除表中所有的行。这意味着表结构、属性、索引将保持不变:

    DELETE FROM table_name;
    or
    DELETE * FROM table_name;
    

    注意:在没有备份的情况下,删除记录时要格外小心!因为您删了就不能重来!

    1.14 SQL SELECT TOP, LIMIT, ROWNUM

    SQL SELECT TOP 子句
    SELECT TOP 子句用于规定要返回的记录的数目。
    SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的。
    注释:并非所有的数据库系统都支持 SELECT TOP 子句。
    
    # MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的
    MySQL 语法:
    SELECT *
    FROM Persons
    LIMIT 5;
    
    Oracle 语法:
    SELECT *
    FROM Persons
    WHERE ROWNUM <=5;
    

    1.15 SQL LIKE 操作符

    SQL LIKE 操作符
    LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
    SQL LIKE 语法
    SELECT column_name(s)
    FROM table_name
    WHERE column_name LIKE pattern;
    
    # SQL LIKE 操作符实例
    下面的 SQL 语句选取 City 以字母 "s" 开始的所有客户:
    SELECT * FROM Customers
    WHERE City LIKE 's%';
    
    下面的 SQL 语句选取 City 以字母 "s" 结尾的所有客户:
    SELECT * FROM Customers
    WHERE City LIKE '%s';
    
    下面的 SQL 语句选取 Country 包含模式 "land" 的所有客户:
    SELECT * FROM Customers
    WHERE Country LIKE '%land%';
    
    通过使用 NOT 关键字,您可以选取不匹配模式的记录。
    下面的 SQL 语句选取 Country 不包含模式 "land" 的所有客户:
    SELECT * FROM Customers
    WHERE Country NOT LIKE '%land%';
    

    1.16 SQL 通配符

    image.png
    使用 SQL % 通配符
    下面的 SQL 语句选取 City 以字母 "ber" 开始的所有客户:
    实例
    SELECT * FROM Customers
    WHERE City LIKE 'ber%';
    
    下面的 SQL 语句选取 City 包含模式 "es" 的所有客户:
    实例
    SELECT * FROM Customers
    WHERE City LIKE '%es%';
    
    使用 SQL _ 通配符
    下面的 SQL 语句选取 City 以一个任意字符开始,然后是 "erlin" 的所有客户:
    实例
    SELECT * FROM Customers
    WHERE City LIKE '_erlin';
    
    下面的 SQL 语句选取 City 以 "L" 开始,然后是一个任意字符,然后是 "n",然后是一个任意字符,然后是 "on" 的所有客户:
    实例
    SELECT * FROM Customers
    WHERE City LIKE 'L_n_on';
    
    使用 SQL [charlist] 通配符
    下面的 SQL 语句选取 City 以 "b"、"s" 或 "p" 开始的所有客户:
    实例
    SELECT * FROM Customers
    WHERE City LIKE '[bsp]%';
    
    下面的 SQL 语句选取 City 以 "a"、"b" 或 "c" 开始的所有客户:
    实例
    SELECT * FROM Customers
    WHERE City LIKE '[a-c]%';
    
    下面的 SQL 语句选取 City 不以 "b"、"s" 或 "p" 开始的所有客户:
    实例
    SELECT * FROM Customers
    WHERE City LIKE '[!bsp]%';
    

    1.17 SQL IN 操作符

    IN 操作符
    IN 操作符允许您在 WHERE 子句中规定多个值。
    
    SQL IN 语法
    SELECT column_name(s)
    FROM table_name
    WHERE column_name IN (value1,value2,...);
    
    SQL IN SELECT语法
    SELECT column_name(s)
    FROM table_name
    WHERE column_name IN (select column from table where ...);
    
    IN 操作符实例
    下面的 SQL 语句选取 City 为 "Paris" 或 "London" 的所有客户:
    SELECT * FROM Customers
    WHERE City IN ('Paris','London');
    

    1.18 SQL BETWEEN 操作符

    SQL BETWEEN 操作符
    BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。

    SQL BETWEEN 语法
    SELECT column_name(s)
    FROM table_name
    WHERE column_name BETWEEN value1 AND value2;
    
    BETWEEN 操作符实例
    下面的 SQL 语句选取价格介于 10 和 20 之间的所有产品:
    SELECT * FROM Products
    WHERE Price BETWEEN 10 AND 20;
    
    NOT BETWEEN 操作符实例
    如需显示不在上面实例范围内的产品,请使用 NOT BETWEEN:
    SELECT * FROM Products
    WHERE Price NOT BETWEEN 10 AND 20;
    
    带有 IN 的 BETWEEN 操作符实例
    下面的 SQL 语句选取价格介于 10 和 20 之间但 CategoryID 不为 1、2 或 3 的所有产品:
    SELECT * FROM Products
    WHERE (Price BETWEEN 10 AND 20)
    AND CategoryID NOT IN (1,2,3);
    
    带有文本值的 BETWEEN 操作符实例
    下面的 SQL 语句选取 ProductName 以介于 'C' 和 'M' 之间字母开始的所有产品:
    SELECT * FROM Products
    WHERE ProductName BETWEEN 'C' AND 'M';
    
    带有文本值的 NOT BETWEEN 操作符实例
    下面的 SQL 语句选取 ProductName 不以介于 'C' 和 'M' 之间字母开始的所有产品:
    SELECT * FROM Products
    WHERE ProductName NOT BETWEEN 'C' AND 'M';
    
    带有日期值的 BETWEEN 操作符实例
    下面的 SQL 语句选取 OrderDate 介于 '04-July-1996' 和 '09-July-1996' 之间的所有订单:
    SELECT * FROM Orders
    WHERE OrderDate BETWEEN #07/04/1996# AND #07/09/1996#;
    

    注意:!!!

    请注意,在不同的数据库中,BETWEEN 操作符会产生不同的结果!
    在某些数据库中,BETWEEN 选取介于两个值之间但不包括两个测试值的字段。
    在某些数据库中,BETWEEN 选取介于两个值之间且包括两个测试值的字段。
    在某些数据库中,BETWEEN 选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段。
    因此,请检查您的数据库是如何处理 BETWEEN 操作符!

    1.19 SQL Join连接

    SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
    INNER JOIN:如果表中有至少一个匹配,则返回行
    LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
    RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
    FULL JOIN:只要其中一个表中存在匹配,则返回行

    SQL INNER JOIN 关键字

    INNER JOIN 关键字在表中存在至少一个匹配时返回行。
    
    SQL INNER JOIN 语法:
    
    SELECT column_name(s)
    FROM table1
    INNER JOIN table2
     ON table1.column_name=table2.column_name;
    或:
    
    SELECT column_name(s)
    FROM table1
    JOIN table2
     ON table1.column_name=table2.column_name;
    注释:INNER JOIN 与 JOIN 是相同的。
    
    image.png

    SQL LEFT JOIN 关键字

    LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
    
    SQL LEFT JOIN 语法:
    
    SELECT column_name(s)
    FROM table1
    LEFT JOIN table2
    ON table1.column_name=table2.column_name;
    或:
    
    SELECT column_name(s)
    FROM table1
    LEFT OUTER JOIN table2
    ON table1.column_name=table2.column_name;
    注释:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。
    
    image.png

    SQL RIGHT JOIN 关键字

    RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
    
    SQL RIGHT JOIN 语法:
    
    SELECT column_name(s)
    FROM table1
    RIGHT JOIN table2
    ON table1.column_name=table2.column_name;
    或:
    
    SELECT column_name(s)
    FROM table1
    RIGHT OUTER JOIN table2
    ON table1.column_name=table2.column_name;
    注释:在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
    
    image.png

    SQL FULL OUTER JOIN 关键字

    FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.
    FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。
    
    SQL FULL OUTER JOIN 语法:
    
    SELECT column_name(s)
    FROM table1
    FULL OUTER JOIN table2
    ON table1.column_name=table2.column_name;
    
    image.png

    1.20 SQL UNION 操作符

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
    请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
    
    SQL UNION 语法:
    
    SELECT column_name(s) FROM table1
    UNION
    SELECT column_name(s) FROM table2;
    
    注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
    
    SQL UNION ALL 语法:
    
    SELECT column_name(s) FROM table1
    UNION ALL
    SELECT column_name(s) FROM table2;
    注释:UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
    
    ### SQL UNION 实例
    下面的 SQL 语句从 "Customers" 和 "Suppliers" 表中选取所有不同的城市(只有不同的值):
    SELECT City FROM Customers
    UNION
    SELECT City FROM Suppliers
    ORDER BY City;
    注释:UNION 不能用于列出两个表中所有的城市。如果一些客户和供应商来自同一个城市,每个城市只会列出一次。UNION 只会选取不同的值。请使用 UNION ALL 来选取重复的值!
    
    ### SQL UNION ALL 实例
    下面的 SQL 语句使用 UNION ALL 从 "Customers" 和 "Suppliers" 表中选取所有的城市(也有重复的值):
    SELECT City FROM Customers
    UNION ALL
    SELECT City FROM Suppliers
    ORDER BY City;
    
    ### 带有 WHERE 的 SQL UNION ALL
    下面的 SQL 语句使用 UNION ALL 从 "Customers" 和 "Suppliers" 表中选取所有的德国城市(也有重复的值):
    SELECT City, Country FROM Customers
    WHERE Country='Germany'
    UNION ALL
    SELECT City, Country FROM Suppliers
    WHERE Country='Germany'
    ORDER BY City;
    

    1.21 SQL SELECT INTO 语句

    通过 SQL,您可以从一个表复制信息到另一个表。
    SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。

    SQL SELECT INTO 语句
    SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
    SQL SELECT INTO 语法
    我们可以复制所有的列插入到新表中:
    SELECT *
    INTO newtable [IN externaldb]
    FROM table1;
    或者只复制希望的列插入到新表中:
    SELECT column_name(s)
    INTO newtable [IN externaldb]
    FROM table1;
    提示:新表将会使用 SELECT 语句中定义的列名称和类型进行创建。您可以使用 AS 子句来应用新名称。
    
    创建 Customers 的备份复件:
    SELECT *
    INTO CustomersBackup2013
    FROM Customers;
    
    请使用 IN 子句来复制表到另一个数据库中:
    SELECT *
    INTO CustomersBackup2013 IN 'Backup.mdb'
    FROM Customers;
    
    只复制一些列插入到新表中:
    SELECT CustomerName,
    ContactName
    INTO CustomersBackup2013
    FROM Customers;
    
    只复制德国的客户插入到新表中:
    SELECT *
    INTO CustomersBackup2013
    FROM Customers
    WHERE Country='Germany';
    
    复制多个表中的数据插入到新表中:
    SELECT Customers.CustomerName, Orders.OrderID
    INTO CustomersOrderBackup2013
    FROM Customers
    LEFT JOIN Orders
    ON Customers.CustomerID=Orders.CustomerID;
    提示:SELECT INTO 语句可用于通过另一种模式创建一个新的空表。只需要添加促使查询没有数据返回的 WHERE 子句即可:
    
    SELECT *
    INTO newtable
    FROM table1
    WHERE 1=0;
    

    1.22 SQL INSERT INTO SELECT 语句

    INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。
    
    INSERT INTO table2
    SELECT * FROM table1;
    或者我们可以只复制希望的列插入到另一个已存在的表中:
    
    
    INSERT INTO table2
    (column_name(s))
    SELECT column_name(s)
    FROM table1;
    
    只复制 "Suppliers" 中的一些列插入到 "Customers" 中:
    INSERT INTO Customers (CustomerName, Country)
    SELECT SupplierName, Country FROM Suppliers;
    
    只复制德国的供应商插入到 "Customers" 中:
    INSERT INTO Customers (CustomerName, Country)
    SELECT SupplierName, Country FROM Suppliers
    WHERE Country='Germany';
    

    相关文章

      网友评论

        本文标题:1 SQL基础教程

        本文链接:https://www.haomeiwen.com/subject/nscozxtx.html