zoukankan      html  css  js  c++  java
  • SQL语法快速学习

    SQL Database

    CREATE/DROP DB
    • 创建/删除数据库

    • 语法:

      -- 创建和删除
      CREATE DATABASE database_name;
      DROP DATABASE database_name;
      
    BACKUP
    •   -- 备份数据库
        BACKUP DATABASE database_name  TO DISK = "filepath";
        -- 差异备份(只备份不同的部分)
        BACKUP DATABASE database_name TO DISK ="fielpath"
        WITH DIFFERENTIAL;
      
    CREATE/DROP TABLE
    •   -- 创建表
        CREATE TABLE table_name(
            column1 datatype,
            column2 datatype,
            column3 datatype,
            ...
        );
        -- 例子
        CREATE TABLE Persons(
            PersonID int,
            Name varchar(255),
            Address varchar(255),
        );
        --使用其他表创建表
        CREATE TABLE new_table_name AS
        SELECT column1,column2,...
        FROM exist_table_name
        WHERE ...;
        -- 例子
        CREATE TABLE TestTable AS
        SELECT customername,contactname
        FROM customres;
        -- 删除表(表也不存在了)
        DROP TABLE table_name;
        -- 删除表(只删除其中的数据)
        TRUNCATE TABLE table_name;
      
    ALTAER
    •   --添加字段
        ALTER TABLE table_name ADD column_name datatype;
        -- 删除字段
        ALTER TABLE table_name DROP column_name;
        -- 修改字段
        /*SQL Server OR MS Access*/
        ALTER TABLE table_name
        ALTER COLUMN column_name datatype;
        /*MySQL*/
        ALTER TABLE table_name
        MODIFY column_name datatye;
        
      
    CONSTRAINT(约束)
    • 给数据指定规则,提高表中数据的准确性和可靠性

    •   CAREATE TABLE table_name(
            column1 datatype constraint,
            column2 datatype constraint,
            column3 datatype constraint,
            ...
        );
        
        OR
        ALTAER TABLE table_name ADD UNIQUE (columu_name);
        
        -- 多字段约束
        ALTER TABLE Persons ADD CONSTRAINT UC_Person UNIQUE (ID,LastName);
        
        --删除nuique约束
        /*mysql*/
        ALTER TABLE Persons
        DROP INDEX constraint_name;
        /*other*/
        ALTER TABLE Persons
        DROP CONSTRAINT constraint_name; 
        
        
        --常用的一些约束
        /*
        NOT NULL -确保表中没有null值
        UNIQUE   -确保没有重复的值
        PRIMARY KEY -NOT NULL 和 UNIQUE的组合,唯一标识每一行在一个表中
        FOREIGN KEY -唯一标识一行在另一个表中
        CHECK     -确保表中的值满足特定的条件
        DEFAULT   -当没有指定值时设置一个默认值
        INDEX     -快速创建和检索表中的数据
        */
        
      

      说明:具有两个层级 字段级和表级

    CREATER INDEX
    • 给数据创建索引,便于更快查询,但在更新一个带有索引的数据库时需要更多时间

    •   -- 创建索引
        CREATE INDEX index_name
        ON table_name (column1,column2,...);
        
        -- 创建唯一索引
        CREATE UNIQUE INDEX index_name
        ON tabel_name (column1,column2,...);
        
        --删除索引
        /*MySQL*/
        ALTER TABLE table_name
        DROP INDEX index_name;
      
    AUTO INCREMENT
    • 当插入一个记录时自动生成一个unique的数

    •   /*MySQL*/
        CREATE TABLE Persons(
            PersonID int NOT NULL AUTO INCREMENT,
            LastName varchar(255) NOT NULL,
            Age int,
            PRIMARY KEY (PersonID)
        );
      
    DATE
    •   /**MySQL/
        DATE -format:YYYY-MM-DD
        DATETIME -format:YYYY-MM-DD HH:MI:SS
        TIMESTAMP -format:YYYY-MM-DD HH:MI:SS
        YEAR -format:YYYY/YY
      
    VIEW
    • 基于结果集创建的一个虚拟表

    •   CREATE VIEW view_name AS
        SELECT columnb,column2,...
        FORM table_name
        WHERE condition;
        
        -- example
        CREATE VIEW [Brazil Customers] AS
        SELECT CustomerName,ContactName
        FROM Customers
        WHERE Country="Brazil";
        
        -- 使用
        SELECT * FROM [Brazil Customers];
        
        --更新
        CREATE OR REPLACE VIEW view_name AS
        SELECT column1,column2,...
        FORM table_name
        WHERE condition;
        
        --删除
        DORP VIEW view_name;
      
    INJECATION(注入)
    • 一种代码注入技术,可以侵入/破坏数据库,可以通过参数来防控

    SQL Statement

    LIKE

    两个通配符

    • % -可以代表任意个字符
    • _ -代表一个字符

    注意:不同数据库会有差别

    语法:

    SELECT column1, column2, ...
    FROM table_name
    WHERE columnN LIKE pattern;
    

    例子

    LIKE OperatorDescription
    WHERE CustomerName LIKE ‘a%’Finds any values that start with “a”
    WHERE CustomerName LIKE ‘%a’Finds any values that end with “a”
    WHERE CustomerName LIKE ‘%or%’Finds any values that have “or” in any position
    WHERE CustomerName LIKE ‘_r%’Finds any values that have “r” in the second position
    WHERE CustomerName LIKE ‘a__%’Finds any values that start with “a” and are at least 3 characters in length
    Wildcards(通配符)

    MS Access适用

    SymbolDescriptionExample
    *Represents zero or more charactersbl* finds bl, black, blue, and blob
    ?Represents a single characterh?t finds hot, hat, and hit
    []Represents any single character within the bracketsh[oa]t finds hot and hat, but not hit
    !Represents any character not in the bracketsh[!oa]t finds hit, but not hot and hat
    -Represents a range of charactersc[a-b]t finds cat and cbt
    #Represents any single numeric character2#5 finds 205, 215, 225, 235, 245, 255, 265, 275, 285, and 295

    SQL Server适用

    SymbolDescriptionExample
    %Represents zero or more charactersbl% finds bl, black, blue, and blob
    _Represents a single characterh_t finds hot, hat, and hit
    []Represents any single character within the bracketsh[oa]t finds hot and hat, but not hit
    ^Represents any character not in the bracketsh[^oa]t finds hit, but not hot and hat
    -Represents a range of charactersc[a-b]t finds cat and cbt
    IN
    • in操作符允许你在where子句中指定多个值

    • 语法:

      SELECT column_name(s)
      FROM table_name
      WHERE column_name IN (value1, value2, ...);
      for example:
      //从customers表中选择国家为uk或FRANCE的行
      SELECT * FROM Customers WHERE Country IN('UK','FRANCE');
      

      or

      SELECT column_name(s)
      FROM table_name
      WHERE column_name IN (SELECT STATEMENT);
      eg:
      //从customers表和suppliers表中选择相同的国家
      SELECT * FROM Customers WHERE Country
      IN (SELECT Country FROM Suppliers);
      
    BETWEEN
    • 选择一个范围的数据

    • 语法:

      SELECT column_name(s)
      FROM table_name
      WHERE column_name BETWEEN value1 AND value2;
      
    • 实例

      SELECT * FROM Products
      WHERE Price BETWEEN 10 AND 20;
      
      SELECT * FROM Products
      WHERE Price NOT BETWEEN 10 AND 20;
      
      SELECT * FROM Products
      WHERE Price BETWEEN 10 AND 20
      AND NOT CategoryID IN (1,2,3);
      
      SELECT * FROM Products
      WHERE ProductName BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
      ORDER BY ProductName;
      
      SELECT * FROM Orders
      WHERE OrderDate BETWEEN #01/07/1996# AND #31/07/1996#;
      or
      SELECT * FROM Orders
      WHERE OrderDate BETWEEN '1996-07-01' AND '1996-07-31';
      
    Alias
    • 给表、表中的一列或者几列取一个临时别名(仅在查询时期间有效)便于操作

    • 语法

      //aliase column
      SELECT column_name AS alias_name
      FROM table_name;
      //aliase table
      SELECT column_name(s)
      FROM table_name AS alias_name;
      
    • eg.

      SELECT CustomerID AS ID, CustomerName AS Customer
      FROM Customers;
      
      //取带有空格的别名的时候需要用‘’或这[]
      SELECT CustomerName AS Customer, ContactName AS [Contact Person] FROM Customers;
      
      //几列取一个别名myasql语法。不同收据库有所不同
      SELECT CustomerName, CONCAT(Address,',',PostalCode,',',City,', ',Country) AS Address FROM Customers;
      
    join
    • inner join(返回能够匹配的记录)

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZP8Lzoqt-1577436895531)(D:Desktopimg_innerjoin.jpg)]

      语法:

      SELECT column_name(s)
      FROM table1
      INNER JOIN table2
      ON table1.column_name = table2.column_name;
      

      eg.

      SELECT Orders.OrderID, Customers.CustomerName
      FROM Orders
      INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
      
      //三个表的组合
      SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
      FROM ((Orders
      INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
      INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);
      
    • left join(显示左边的表以及和右边匹配的表)

      在某些数据库中又叫left outer join,以下各个join同样适用

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6xo4RcGI-1577436895533)(D:Desktopimg_leftjoin.gif)]

      语法:

      SELECT column_name(s)
      FROM table1
      LEFT JOIN table2
      ON table1.column_name = table2.column_name;
      

      eg.

      SELECT Customers.CustomerName, Orders.OrderID
      FROM Customers
      LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
      ORDER BY Customers.CustomerName;
      
    • right join(与left join 作用相反)

    • full join(返回两个表的整体以及返回各自不同的部分)

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNIHxLFl-1577436895534)(D:Desktopimg_fulljoin.gif)]

      语法:

      SELECT column_name(s)
      FROM table1
      FULL OUTER JOIN table2
      ON table1.column_name = table2.column_name
      WHERE condition;
      

      eg.

      SELECT Customers.CustomerName, Orders.OrderID
      FROM Customers
      FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID
      ORDER BY Customers.CustomerName;
      
    • self join(表与自身的链接)(表示不太懂)

      语法:

      SELECT column_name(s)
      FROM table1 T1, table1 T2//t1 t2是相同表的化名
      WHERE condition;
      
    uinon
    • 语法:

      SELECT column_name(s) FROM table1
      UNION
      SELECT column_name(s) FROM table2;
      
      SELECT column_name(s) FROM table1
      UNION ALL//加all不会合并相同的项
      SELECT column_name(s) FROM table2;
      
    Group By
    • 将查询结果分组

    • 语法

      SELECT column_name(s)
      FROM table_name
      WHERE condition
      GROUP BY column_name(s)
      ORDER BY column_name(s);
      
    • eg.

      SELECT COUNT(CustomerID), Country
      FROM Customers
      GROUP BY Country;
      --统计每个国家的游客人数
      
    Having
    • 由于where不能与聚合函数一起使用,having解决了这个问题

    • 语法:

      SELECT column_name(s)
      FROM table_name
      WHERE condition
      GROUP BY column_name(s)
      HAVING condition
      ORDER BY column_name(s);
      
    • eg.

      --统计游客人数大于等于5国家
      SELECT COUNT(CustomerID),Country
      FROM Customers
      GROUP BY Country
      Having Count(CustomerID)>=5;
      
    Exist
    • 测试子查询中是否存在某一个记录

    • 语法:

      SELECT column_name(s)
      FROM table_name
      WHERE EXISTS
      (SELECT column_name FROM table_name WHERE condition);
      
    • eg.

      --列出价格低于20的所有供货商
      SLECT SupplierName
      FROM Suppliers
      WHERE EXISTS
      (SELECT ProductName FROM Products WHERE Products.SupplierID=Suppliers.supplierID AND price<20);
      
    Any/All
    • 一般和where/having语句一起使用,Any用于返回true如果子查询有一条符合条件;All同理

      注意:必须要有比较运算符

    • 语法:

      SELECT column_name(s)
      FROM table_name
      WHERE column_name operator ANY
      (SELECT column_name FROM table_name WHERE condition);
      
    • eg.

      SELECT ProductName
      FROM Products
      WHERE ProductID = ANY(SELECT ProductID FROM OrderDetails WHERE Quantily=10);
      
    SLECT INTO
    • 把一个表中的数据拷贝到另一个表中

    • 语法:

      SELECT *
      INTO newtable [IN externaldb]
      FROM oldtable
      WHERE condition;
      
    • eg.

      --把Customers表备份到另外一个数据库的CustomerBackup2017表中
      SELECT * INTO CustomersBackup2017 IN 'Backup.mdb'
      FROM Customers;
      
    INSERT INTO SELECT
    • 从一个表中复制部分/全部数据并插入到另外一个数据表中去

    • 语法:

      INSERT INTO table2(cloumn1,column2,...)
      SELECT * FROM table1
      WHERE Condition;
      
    • eg.

      --复制国家为‘Germany'的suppliers的某些数据到Customers中去
      INSERT INTO Customers (CustomerName, City, Country)
      SELECT SupplierName, City, Country FROM Suppliers
      WHERE Country='Germany';
      
    CASE
    • 与C语言中的case相似

    • 语法:

      CASE
      WHEN condition1 THEN result1
      WHEN condition2 THEN result2
      WHEN conditionN THEN resultn
      ELSE result
      END;
      
    • eg.

      -- 根据quantity的不同新增一个字段
      SELECT OrderID, Quantity,
      CASE
          WHEN Quantity > 30 THEN "The quantity is greater than 30"
          WHEN Quantity = 30 THEN "The quantity is 30"
          ELSE "The quantity is under 30"
      END AS QuantityText
      FROM OrderDetails;
      
    FULL Functions
    • 判断是否为空的函数(自我理解)

    • MySQL实例(跟数据库有关)

      -- IFNull()函数
      select ProductName,UnitPrice *(UnitInStock + IFNull(UnitsOnOrder,0)) FROM Products;
      or
      -- COALESCE()函数
      select ProductNam,UnitPrice *(UnitInStock+COALESCE(UnitsOnOrder,0)) FROM Products;
      
      
    Stored Produces(存储步骤)
    • 对于某些经常使用的sql语句,用另外一个名字来保存。

    • 语法:

      -- 创建
      CREATE PROCEDURE procedure_name
      AS 
      sql_statement
      GO;
      -- 执行
      EXEC procedure_name;
      
    • eg.

      CREATE PROCEDURE SelectAllCustomers
      AS
      SELECT * FROM Customers
      GO;
      
      EXEC SelectAllCustomers
      
      --------------
      -- 一个参数
      CREATE PROCEDURE SelectAllCustomers @City nvarchar(30)
      AS
      SELECT * FROM Customers WHERE City = @City
      GO;
      
      EXEC SelectAllCustomers @City = "London";
      
  • 相关阅读:
    heat模板
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode819.Most Common Word最常见的单词
    Leetcode819.Most Common Word最常见的单词
    Leetcode783.Minimum Distance Between BST Nodes二叉搜索树结点最小距离
  • 原文地址:https://www.cnblogs.com/ma-liner/p/14196603.html
Copyright © 2011-2022 走看看