SQL  基礎知識彙總

基礎知識

1、select  distinct  語句(用於返回唯一 不同的值)

     使用場景說明:有時候表中的某些列的值不是唯一的(重複數據過多,但恰恰我們不需要那些重複的數據)時,便可使用DISTINCT  語句過濾掉重複的值。

     使用語法:SELECT DISTINCT 列名稱 FROM 表名稱;

2、AND & OR  運算

     使用場景說明:一般與where 子句  配合使用  表示多個條件聯合查詢,可以把多個條件結合起來,如果第一個和第二個條件都成立,那麼使用 and 結合,如果第一個條件和第二個條件只需要一個成立則使用 or 將條件連接。

     使用實例:

                     1、使用 AND 來顯示所有姓爲 "Carter" 並且名爲 "Thomas" 的人;

                  SELECT * FROM Persons WHERE FirstName='Thomas'                  AND                  LastName='Carter' 

                           查出結果集就是滿足兩個條件的數據。

                    2、使用 OR 來顯示所有姓爲 "Carter" 或者名爲 "Thomas" 的人:                          

                               SELECT * FROM Persons WHERE firstname='Thomas'

            OR

                               lastname='Carter'

                          查出的結果集就是兩個條件 只要滿足任何一個的結果集。

3、Order  by   語句

      根據指定的列隊結果集進行排序,默認按照升序排列。

      排列方式分爲  Order  by  asc (升序) 和 Order  by  desc (降序)。這裏需要進一步說明的是如果排序的條件相同的數據不止一條的話,結果集還是會根據升序優先的原則展示數據(null  爲優先顯示數據);

      基礎語法: select  *  from  tableName   where tableOrder> '10000'  and tableOrder<'20000'  Order  by  tableOrder desc

     所查結果集爲 tableName  表中  tableOrder 的值介於 10000---20000之間的數據,並按照降序排列。

4、TOP 語句

     使用場景:數據量過大的話,使用top 語句查詢表頭多少筆數據。

     不同的數據庫系統  TOP 語句略有差異,這裏不做展示。

5、LIKE 操作符(模糊查詢)

     like 操作符用於where  子句中搜索列中的制定模式。

     基本語法:(實例描述 查找居住在以N開頭的名字的城市的人)

          SELECT * FROM Persons  WHERE City LIKE 'N%'

       注意  like ‘%N’(以N開頭)  與 like '%N%' (名稱中含N) 和 like 'N%'(以 N字符結尾的) 

6、SQL 的通配符

     sql 通配符必須配合like操作符同時使用,可以在數據庫查詢的時候可以替代一個或多個字符,通配符有四種;

通配符 描述
% 替代一個或多個字符
_ 僅替代一個字符
[charlist] 字符列中的任何單一字符

[^charlist]

或者

[!charlist]

不在字符列

       依據下張Person表 對以上幾種操作符詳細說明;

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

      1、%操作符

      現在,我們希望從上面的 "Persons" 表中選取居住在以 "Ne" 開始的城市裏的人:

            SELECT * FROM Persons WHERE City LIKE 'Ne%'

       結果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York

      2、_操作符

      現在,我們希望從上面的 "Persons" 表中選取名字的第一個字符之後是 "eorge" 的人:

            SELECT * FROM Persons WHERE FirstName LIKE '_eorge'

      結果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York

            接下來,我們希望從 "Persons" 表中選取的這條記錄的姓氏以 "C" 開頭,然後是一個任意字符,然後是 "r",然後是任意          字 符,然後是 "er":

                 SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'

      結果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing

      3、[  ]操作符

           現在,我們希望從上面的 "Persons" 表中選取居住的城市以 "A" 或 "L" 或 "N" 開頭的人:

                 SELECT * FROM Persons WHERE City LIKE '[ALN]%'

       結果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

      4、[! ] 操作符

       現在,我們希望從上面的 "Persons" 表中選取居住的城市不以 "A" 或 "L" 或 "N" 開頭的人:

         LECT * FROM Persons WHERE City LIKE '[!ALN]%'

      結果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing

7、between   操作符

     between ... and   操作符在where子句中使用,介於選取兩個值之間範圍的數據。 

     基本語法:select  *  from  tableName  where columName  between  value1  and  value2  

     重要事項:不同的數據庫對 BETWEEN...AND 操作符的處理方式是有差異的。某些數據庫會列出介於 "value1" 和 "value2"      之間的人,但不包括 "value1" 和 "value2" ;某些數據庫會列出介於 "value1" 和 "value2" 之間幷包括 "value1" 和                          "value2" 的數據;而另一些數據庫會列出介於 "value1" 和 "value2" 之間的數據,包括 "value1" ,但不包括                                    "value2" 。所以,請檢查你的數據庫是如何處理 BETWEEN....AND 操作符的!

8、JOIN  語法

      join 語法用於根據兩張或者多張表之間的關聯關係,查詢這些表中的相關數據。

      數據庫中的表可通過主鍵將表與表關聯起來, 主鍵時表中的一個列,主鍵的值在一個表中是唯一的,這樣就可以把表與表通        過主鍵關聯起來做捆綁查詢。

      請看 "Persons" 表:

Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

      請注意,"Id_P" 列是 Persons 表中的的主鍵。這意味着沒有兩行能夠擁有相同的 Id_P。即使兩個人的姓名完全相同,Id_P          也可以區分他們。

      接下來請看 "Orders" 表:

Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 65

      請注意,"Id_O" 列是 Orders 表中的的主鍵,同時,"Orders" 表中的 "Id_P" 列用於引用 "Persons" 表中的人,而無需使用他  們的確切姓名。請留意,"Id_P" 列把上面的兩個表聯繫了起來

      下邊引用兩個表,查詢查詢誰訂購了產品,並且訂購了多少。

      方式1:普通SQL

         SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE
                     Persons.Id_P = Orders.Id_P 
LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678

      方式2: inner  join

        SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons 
               INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName
astName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678

      注:inner  join 在表中存在至少有一個匹配(即用來關聯的這個一個字段是有值)的時候返回該行,否則不出現該條記錄。   

   同樣的查詢還有:

  • JOIN: 如果表中有至少一個匹配,則返回行
  • LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
  • RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
  • FULL JOIN: 只要其中一個表中存在匹配,就返回行

9、LEFT  Join  On(左連接,某些數據庫也將其稱爲左外連接)

        Left Join 會從左表哪裏返回所有的行,即使在右表中沒有匹配的行。

        語法:SELECT   column_name(s)    FROM    table_name1 LEFT JOIN      table_name2     ON                                              table_name1.column_name=table_name2.column_name

        實例:下表

      "Persons" 表:

Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

      "Orders" 表:

Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 65

      業務需求:列出Persons 表中所有歐訂單的人,並根據LastName進行降序排列。

       sql  語句:Select  Persons.lastName Persons.firstName,Order.OrderNo  from Persons left  Join Orders  On                                                   Persons.ID_p=Orders.ID_p  Order  By  Persons.lastName 。

      查詢結果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George  

 

10、Right  Join  (右連接   也稱右外連接)

       Right  Join 會根據右表返回所有的行,即使在左表中沒有匹配的行。     

       語法:SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON                                                               table_name1.column_name=table_name2.column_name

       實例:下表

       Persons  表 

Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

      Orders 表  

Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 65

   業務需求:列出所有的訂單  和他的所有人 並根據Persons表中的LastName 字段進行降序排列 。   

     sql  語句:Select  Persons.LastName,Persons.FristName,Orders.OrderNo from  Persons  Right  Join Orders  On                     Persons.Id_p = Orders.Id_p  ORDER BY  Persons.LastName;    

     查詢結果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
    34764

11、Full  Join  On關鍵字 

      只要其中某個表存在匹配,FULL JOIN 關鍵字就會返回行。

      基礎語法:SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON                                                            table_name1.column_name=table_name2.column_name

      實體:下表

      "Persons" 表:

Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

      "Orders" 表:

Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 65

     業務需求:列出所有的人,以及他們的定單,以及所有的定單,以及定購它們的人。

     SQL  語句:SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON           Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName

     查詢結果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George  
    34764

      full  join on  關鍵字會從左表(Persons)和右表(Orders)那裏返回所有的行。如果 "Persons" 中的行在表 "Orders" 中沒有    匹配,或者如果 "Orders" 中的行在表 "Persons" 中沒有匹配,這些行同樣會列出。

12、平均數函數 AVG()

      AVG()函數返回數值列。null 值不包括計算中。
      基礎語法: Select SVG(column_name)  from table_name;

      SVG()實例 :下表Orders表

O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter

      需求:計算 "OrderPrice" 字段的平均值。

      SQL 語句 :Select  AVG(OrderPrice)  AS  orderAvgrage  from  orders;

      查詢結果集:

OrderAverage
950

      拓展實例:找到 OrderPrice 值高於 OrderPrice 平均值的客戶。

      SQL 語句 :SELECT Customer FROM Orders WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)

      查詢結果集:

Customer
Bush
Carter
Adams

13、查詢總數  Count();

       函數返回指定列的值的數目(null 值不計入在內)

      說明:COUNT(column_name)  與COUNT(*) 

      COUNT(column_name)  返回列 column_name (值爲null 的不計算在內)。

      COUNT(*)  返回數據庫表中的總資料數目。

      基礎語法:SELECT COUNT(column_name) FROM table_name;

      COUNT()語法實例一:

             COUNT(*) 函數返回表中的記錄數

             SQL 語句:SELECT COUNT(*) FROM table_name

      COUNT()語法實例二:

             COUNT(DISTINCT column_name) 函數返回指定列的不同值的數目:

             SQL 語句:SELECT COUNT(DISTINCT column_name) FROM table_name

14、First()  函數  與Last() 函數

       FIRST() 函數返回指定的字段中第一個記錄的值。

       Last() 函數返回指定的字段中最後一個記錄的值。

      基礎語法:Select  first(column_name)   from  tableName;

      基礎語法:Select  last(column_name)   from  tableName;

      實例:如下表Orders

O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter

      需求一:查找 "OrderPrice" 列的第一個值。

      SQL 語句:SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders

      查詢結果集:

FirstOrderPrice
1000

      需求二:查找“OrderPrice” 列的最後一個值。

      SQL 語句:SELECT Last(OrderPrice) AS FirstOrderPrice FROM Orders

      查詢結果集:

LastOrderPrice
100

15、Max()函數與Min()函數、sum ()函數

        MAX 函數返回一列中的最大值。NULL 值不包括在計算中。

        MIN 函數返回一列中的最小值。NULL 值不包括在計算中。

        SUM 函數返回數值列的總數(總額) 通常與Gourp By 配合使用。

        基礎語法:SELECT MAX(column_name) /MIN(column_name)  FROM table_name;

        實例:下表Orders

O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter

       需求一:查找OrderPrice 列下最大值;

      SQL 語句:SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders;

LargestOrderPrice
2000

      需求二:查找OrderPrice 列下最小值;

      SQL 語句:SELECT MIN(OrderPrice) AS LargestOrderPrice FROM Orders;

SmallestOrderPrice
100

      需求三:查找 "OrderPrice" 字段的總數。

   SQL 語句:SELECT SUM(OrderPrice) AS OrderTotal FROM Orders;
OrderTotal
5700

16、SQL  快速參考

語句 語法
AND / OR SELECT column_name(s)
FROM table_name
WHERE condition
AND|OR condition
ALTER TABLE (add column) ALTER TABLE table_name 
ADD column_name datatype
ALTER TABLE (drop column) ALTER TABLE table_name 
DROP COLUMN column_name
AS (alias for column) SELECT column_name AS column_alias
FROM table_name
AS (alias for table) SELECT column_name
FROM table_name  AS table_alias
BETWEEN SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
CREATE DATABASE CREATE DATABASE database_name
CREATE INDEX CREATE INDEX index_name
ON table_name (column_name)
CREATE TABLE CREATE TABLE table_name
(
column_name1 data_type,
column_name2 data_type,
.......
)
CREATE UNIQUE INDEX CREATE UNIQUE INDEX index_name
ON table_name (column_name)
CREATE VIEW CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
DELETE FROM DELETE FROM table_name 
(Note: Deletes the entire table!!)

or

DELETE FROM table_name
WHERE condition

DROP DATABASE DROP DATABASE database_name
DROP INDEX DROP INDEX table_name.index_name
DROP TABLE DROP TABLE table_name
GROUP BY SELECT column_name1,SUM(column_name2)
FROM table_name
GROUP BY column_name1
HAVING SELECT column_name1,SUM(column_name2)
FROM table_name
GROUP BY column_name1
HAVING SUM(column_name2) condition value
IN SELECT column_name(s)
FROM table_name
WHERE column_name
IN (value1,value2,..)
INSERT INTO INSERT INTO table_name
VALUES (value1, value2,....)

or

INSERT INTO table_name
(column_name1, column_name2,...)
VALUES (value1, value2,....)

LIKE SELECT column_name(s)
FROM table_name
WHERE column_name
LIKE pattern
ORDER BY SELECT column_name(s)
FROM table_name
ORDER BY column_name [ASC|DESC]
SELECT SELECT column_name(s)
FROM table_name
SELECT * SELECT *
FROM table_name
SELECT DISTINCT SELECT DISTINCT column_name(s)
FROM table_name
SELECT INTO
(used to create backup copies of tables)
SELECT *
INTO new_table_name
FROM original_table_name

or

SELECT column_name(s)
INTO new_table_name
FROM original_table_name

TRUNCATE TABLE
(deletes only the data inside the table)
TRUNCATE TABLE table_name
UPDATE UPDATE table_name
SET column_name=new_value
[, column_name=new_value]
WHERE column_name=some_value
WHERE SELECT column_name(s)
FROM table_name
WHERE condition

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章