zoukankan      html  css  js  c++  java
  • 常用SQL语句总结

    一、检索数据

    1、检索单个列

    SELECT prod_name FROM Products;
    该语句利用 SELECT 语句从 Products 表中检索一个名为 prod_name的列。所需的列名写在 SELECT 关键字之后,FROM 关键字指出从哪个表中检索数据。

     2、检索多个列

    要想从一个表中检索多个列,仍然使用相同的 SELECT 语句。唯一的不同是必须在 SELECT 关键字后给出多个列名,列名之间必须以逗号分隔。在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。如果在最后一个列名后加了逗号,将出现错误。
    SELECT prod_id, prod_name, prod_price FROM Products;

    3、检索所有列

    SELECT * FROM Products;

    4、检索不同的值

    SELECT DISTINCT vend_id FROM Products;
    SELECT DISTINCT vend_id 告诉 DBMS 只返回不同(具有唯一性)的vend_id 行(如果此列多行数据一样,则只返回一行)。如果使用 DISTINCT 关键字,它必须直接放在列名的前面。
    注意:不能部分使用 DISTINCT
    DISTINCT 关键字作用于所有的列,不仅仅是跟在其后的那一列。例如,你指定 SELECT DISTINCT vend_id, prod_price,除非指定的两列完全相同,否则所有的行都会被检索出来。

    5、限制结果

     各种数据库中的这一 SQL 实现并不相同。
    (1)在 SQL Server 和 Access 中使用 SELECT 时,可以使用 TOP 关键字来限制最多返回多少行。
    SELECT TOP 5 prod_name FROM Products;
    上面代码使用 SELECT TOP 5 语句,只检索前 5 行数据。
    (2)如果你使用的是 DB2,很可能习惯使用下面这一 DBMS 特定的 SQL 语句。
    SELECT prod_name FROM Products FETCH FIRST 5 ROWS ONLY;

    (3)如果你使用 Oracle,需要基于 ROWNUM(行计数器)来计算行。

    SELECT prod_name FROM Products WHERE ROWNUM <=5;

    (4)如果你使用 MySQL、MariaDB、PostgreSQL 或者 SQLite,需要使用 LIMIT子句。

    SELECT prod_name FROM Products LIMIT 5;
    上述代码使用SELECT语句来检索单独的一列数据。LIMIT 5指示MySQL等 DBMS 返回不超过 5 行的数据。
    为了得到后面的 5 行数据,需要指定从哪儿开始以及检索的行数,像下面这样。
    SELECT prod_name FROM Products LIMIT 5 OFFSET 5;
    LIMIT 5 OFFSET 5 指示 MySQL 等 DBMS 返回从第 5 行起的 5 行数据。第一个数字是指从哪儿开始,第二个数字是检索的行数。
    注意:第一个被检索的行是第 0 行,而不是第 1 行。因此,LIMIT 1 OFFSET1 会检索第 2 行,而不是第 1 行。

    6、注释

    SELECT prod_name -- 这是一条注释 FROM Products;

    注释使用-- (两个连字符)嵌在行内。-- 之后的文本就是注释;

    下面是另一种形式的行内注释(虽然这种形式很少得到支持);
    # 这是一条注释
    SELECT prod_name FROM Products;

    在一行的开始处使用#,这一整行都将作为注释。

    /* SELECT prod_name, vend_id 
    FROM Products; */ 
    SELECT prod_name 
    FROM Products;
    注释从/*开始,到*/结束,/*和*/之间的任何内容都是注释。这种方式常用于给代码加注释。

    二、插入数据

    1、插入完整的行

    INSERT INTO Customers(cust_id, 
     cust_name, 
     cust_address, 
     cust_city, 
     cust_state, 
     cust_zip, 
     cust_country, 
     cust_contact, 
     cust_email) 
    VALUES('1000000006', 
     'Toy Land', 
     '123 Any Street', 
     'New York', 
     'NY', 
     '11111', 
     'USA', 
     NULL, 
     NULL);
    在插入行时,DBMS 将用 VALUES 列表中的相应值填入列表中的对应项。VALUES 中的第一个值对应于第一个指定列名,第二个值对应于第二个列名,如此等等。

    2、插入部分行

    INSERT INTO Customers(cust_id, 
     cust_name, 
     cust_address, 
     cust_city, 
     cust_state, 
     cust_zip, 
     cust_country) 
    VALUES('1000000006', 
     'Toy Land', 
     '123 Any Street', 
     'New York', 
     'NY', 
     '11111', 
     'USA');
    在上面的例子中,没有给 cust_contact 和 cust_email 这两列提供值。这表示没必要在 INSERT 语句中包含它们。因此,这里的 INSERT语句省略了这两列及其对应的值。
    注意:如果表的定义允许,则可以在 INSERT 操作中省略某些列。省略的列必须满足以下某个条件。
     (1)该列定义为允许 NULL 值(无值或空值)。
    (2)在表定义中给出默认值。这表示如果不给出值,将使用默认值。

    3、插入检索出的数据

    INSERT INTO Customers(cust_id, 
     cust_contact, 
     cust_email, 
     cust_name, 
     cust_address, 
     cust_city, 
     cust_state, 
     cust_zip, 
     cust_country) 
    SELECT cust_id, 
     cust_contact, 
     cust_email, 
     cust_name, 
     cust_address, 
     cust_city, 
     cust_state, 
     cust_zip, 
     cust_country 
    FROM CustNew;
    这个例子使用 INSERT SELECT 从 CustNew 中将所有数据导入Customers。SELECT 语句从 CustNew 检索出要插入的值,而不是列出它们。SELECT 中列出的每一列对应于 Customers 表名后所跟的每一列。这条语句将插入多少行呢?这依赖于 CustNew 表有多少行。如果这个表为空,则没有行被插入(也不产生错误,因为操作仍然是合法的)。如果这个表确实有数据,则所有数据将被插入到 Customers。

    4、从一个表复制到另一个表

    SELECT * 
    INTO CustCopy 
    FROM Customers;
    这条 SELECT 语句创建一个名为 CustCopy 的新表,并把 Customers 表的整个内容复制到新表中。因为这里使用的是 SELECT *,所以将在CustCopy 表中创建(并填充)与 Customers 表的每一列相同的列。要想只复制部分的列,可以明确给出列名,而不是使用*通配符。
    MariaDB、MySQL、Oracle、PostgreSQL 和 SQLite 使用的语法稍有不同:
    CREATE TABLE CustCopy AS 
    SELECT * FROM Customers;

    三、更新数据

    1、更新表中的特定行(只更新一列);

    UPDATE Customers 
    SET cust_email = 'kim@thetoystore.com' 
    WHERE cust_id = '1000000005';
    UPDATE 语句总是以要更新的表名开始。在这个例子中,要更新的表名为Customers。SET 命令用来将新值赋给被更新的列。在这里,SET 子句设置 cust_email 列为指定的值:SET cust_email = 'kim@thetoystore.com'。UPDATE 语句以 WHERE 子句结束,它告诉 DBMS 更新哪一行。没有 WHERE子句,DBMS 将会用这个电子邮件地址更新 Customers 表中的所有行。

    2、更新表中的特定行(更新多列);

    UPDATE Customers 
    SET cust_contact = 'Sam Roberts', 
     cust_email = 'sam@toyland.com' 
    WHERE cust_id = '1000000006';

    四:删除数据

    DELETE FROM Customers 
    WHERE cust_id = '1000000006';
    DELETE FROM 要求指定从中删除数据的表名,WHERE 子句过滤要删除的行。在这个例子中,只删除顾客 1000000006。如果省略 WHERE 子句,它将删除表中每个顾客。

    五:创建和操纵表

    1、创建表

    CREATE TABLE Products 
    ( 
     prod_id CHAR(10) NOT NULL, 
     vend_id CHAR(10) NOT NULL, 
     prod_name CHAR(254) NOT NULL, 
     prod_price DECIMAL(8,2) NOT NULL, 
     prod_desc VARCHAR(1000) NULL 
    );
    从上面的例子可以看到,表名紧跟 CREATE TABLE 关键字。实际的表定义(所有列)括在圆括号之中,各列之间用逗号分隔。这个表由 5 列组成。每列的定义以列名(它在表中必须是唯一的)开始,后跟列的数据类型。整条语句以圆括号后的分号结束。
    下面SQL语句是指定默认值:
    CREATE TABLE OrderItems 
    ( 
     order_num INTEGER NOT NULL, 
     order_item INTEGER NOT NULL, 
     prod_id CHAR(10) NOT NULL, 
     quantity INTEGER NOT NULL DEFAULT 1, 
     item_price DECIMAL(8,2) NOT NULL 
    );
    NULL 值就是没有值或缺值。允许 NULL 值的列也允许在插入行时不给出该列的值。不允许 NULL 值的列不接受没有列值的行,换句话说,在插入或更新行时,该列必须有值。
    每个表列要么是 NULL 列,要么是 NOT NULL 列,这种状态在创建时由表的定义规定。
    CREATE TABLE Vendors 
    ( 
     vend_id CHAR(10) NOT NULL, 
     vend_name CHAR(50) NOT NULL, 
     vend_address CHAR(50) , 
     vend_city CHAR(50) , 
     vend_state CHAR(5) , 
     vend_zip CHAR(10) , 
     vend_country CHAR(50) 
    );
    这条语句创建本书中使用的 Vendors 表。供应商 ID 和供应商名字列是必需的,因此指定为 NOT NULL。其余五列全都允许 NULL 值,所以不指定 NOTNULL。NULL 为默认设置,如果不指定 NOT NULL,就认为指定的是 NULL。

    2、更新表

    ALTER TABLE Vendors 
    ADD vend_phone CHAR(20);
    这条语句给 Vendors 表增加一个名为 vend_phone 的列,其数据类型为 CHAR。
    ALTER TABLE Vendors 
    DROP COLUMN vend_phone;

    3、删除表

    DROP TABLE CustCopy;

    总结:

    先总结这么多,我也不是专门搞数据库的,总结这些平常应该够用了,以后遇到更复杂的再总结。这些代码都是看的书上的《SQL必知必会(第4版)》。如有错误,欢迎留言指正。

  • 相关阅读:
    JMeter怎样测试WebSocket
    Android—基于OpenCV+Android实现人脸检测
    Android—实现科大讯飞语音合成
    Could not resolve com.android.support.constraint:constraint-layout:1.1.3.
    Mac上利用Aria2加速百度网盘下载
    将Excel表中的数据导入MySQL数据库
    Android Studio 添加模块依赖
    Mac上基于hexo+GitHub搭建个人博客(一)
    微信小程序—setTimeout定时器的坑
    微信小程序-腾讯地图显示偏差问题
  • 原文地址:https://www.cnblogs.com/duxie/p/13623066.html
Copyright © 2011-2022 走看看