MySQL數據庫學習

MySQL數據庫學習

SQL分類

  1. DDL:Date Define Language 數據定義語言
    • 操做對象:數據庫和表
    • 關鍵詞:CREATE/ALTER/DROP/TRUNCATE
    • 特性:
      1. sql語句中都會有TABLE
        例如:CREATE TABLE TABLE_NAME XXX…… DROP TABLE TABLE_NAME...
      2. 操做的對象是數據庫和表
      3. TRUNCATE和DROP和DELETE的區別
        • 當你再也不須要該表時,用DROP
        • 當你仍要保留該表,但要刪除全部記錄時,用TRUNCATE(會重置一些自增的數據)
        • 當你要刪除部分記錄時(always with a WHERE clause),用DELETE.
  2. DML:Data Manager Language 數據操做語言
    • 操做對象:記錄(行)
    • 關鍵詞:INSERT/UPDATE/DELETE
    • 特性:
      1. sql語句中沒有TABLE
        例如: INSERT INTO USER(列1,列2……) VALUES(value1,value2……)
  3. DCL:Data Controll Language 數據控制語言
    • 操做對象:用戶/事務/權限
    • 通常由數據庫工程師來管理操做,開發人員使用的頻率不大
  4. DQL:Data Query Language 數據查詢語言(非官方)

總結:只有是涉及到對數據庫和表結構的操做,纔會加上TABLE,對記錄(行)的操做不須要添加TABLE

SQL分類的實例

DDL:數據定義語言

CREATE:建立數據庫、表……

CREATE TABLE USER(
       id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT "編號",
       password VARCHAR(256) NOT NULL COMMENT '密碼',
       nickName VARCHAR(32) NOT NULL COMMENT '暱稱',
       bio VARCHAR(256) COMMENT '簡介' 
       PRIAMRY KEY(id)
   )

ALTER:修改表、字段……

  • 修改表名(rename)
ALTER TABEL 原表名  RENAME 新表名
  • 添加新的列 (add)
ATTER TABLE table_name ADD cloumn_name datatype
    例如:
        ALTER TABLE USER ADD sid VARCHAR(128) NOT NULL COMMENT 'Cookie'
  • 刪除列、刪除索引(drop)
ALTER TABLE table_name DROP COLUNM column_name
    ALTER TABLE table_name DROP INDEX index_name
    例如:
        ALTER TABLE USER DROP COLUMN sid1
  • 修改已經存在的列的屬性(modify)
ALTER TABLE table_name ALTER COLUMN column_name datatype
    例如:
        ALTER TABLE USER MODIFY COLUMN bio int COMMENT '簡介'
  • 修改已經存在的列的列名(change)
ALTER TABLE table_name CHANGE COLUMN column_name new_column_name datatype
    例如:
        ALTER TABLE USER CHANGE COLUMN id id1 INT UNSIGNED NOT NULL COMMENT '編號'

DROP:刪除表、數據庫

*刪除數據庫/表mysql

DROP DATABASE 數據庫名
    DROP TABLE 表名
TRUNCATE/DROP/DELTE的區別
  • 當你再也不須要該表時,用DROP
  • 當你仍要保留該表,但要刪除全部記錄時,用TRUNCATE(會重置一些自增的數據)
  • 當你要刪除部分記錄時(always with a WHERE clause),用DELETE.
TRUNCATE TABLE 表名
    DROP TABLE 表名
    DELETE FROM 表名 WHERE……

DML:數據操做語言INSERT/UPDATE/DELETE

INSERT:插入數據

  • 方式1:屬性與插入的值徹底對齊
INSERT INTO 表名 VALUES(value1,value2,value3……)
    例如:
        INSERT INTO USER VALUES('KyLin','123456')
  • 方式2:指定插入的列
INSERT INTO 表名(列1,列2……) VALUES(值1,值2……)
    INSERT INTO User(id,nickName,password,email,votes) VALUES(1,'KyLin','123456','1803660046@qq.com',1)

UPDATE:修改表中的數據

  • 修改表中數據
UPDATE 表名 SET 列名1=新值1,列名2=新值2…… WHERE 條件
    例如:
        UPDATE USER SET nickName='overload',sid='you guess guess' WHERE id=1

DELETE:刪除表中的記錄(行)

  • 按條件刪除
DELETE FROM 表 WHERE 條件
    例如:
        DELETE FROM USER WHERE id=1
  • 刪除全部
DELETE FROM USER

DQL:數據查詢語言(非官方叫法)

SELECT

  • DISTINCT --去除重複值
SLECT DISTINCT 列名 FROM 表
  • WHERE ---條件
SELECT 列名 FROM 表 WHERE 列 運算符 值(條件)
    運算符
        = != > >= < <= BETWEEN(在某個範圍內) LIKE(某種搜索方式) 
    例如:
        SELECT id FROM USER WHERE nickName='overload'
  • AND和OR ---用於基於一個以上的條件對記錄進行過濾篩選
    • AND 鏈接多個條件---須要同時知足
    • OR 鏈接多個條件----知足其中之一便可
AND和OR同時使用:
        選出姓爲'Thomas'或者爲'William'而且名爲'Carter'的人的信息
    SELECT * FROM Persons WHERE (FirstName='Thomas' or FirstName=='William') AND LastName='Carter'
    小建議:儘量的減小or的使用(用in代替),由於使用了or,效率呈指數型降低
  • ORDER BY ---對結果集進行排序
    • 默認ASC(升序),降序爲DESC
能夠對多個列進行不一樣的排序,知足的條件是從左往右依次選擇
    例如:
        SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC,OrderNumber ASC
    結果:
        先對全部的結果集按照Company降序排序,若是有相同的Company結果,則按照OrderNumber升序排序

MYSQL高級查詢

LIMIT N,M---選取從第N開始的M條記錄(下標從0開始)——能夠延伸成爲查找前n條記錄

  • LIMIT 5 --選取最前面的5條記錄
  • LIMIT 1,5 --從第1條開始(下標從0開始),選取5條記錄
SELECT * FROM book_borrow_history LIMIT 0,5

LIKE--模糊查詢

  • 選取姓廣的童鞋 nickName LIKE '廣%'
  • 選取名字中含有奇的童鞋 nickName LIKE '%奇%'
  • 選取名字以林結尾的童鞋 nickName LIKT '%林'
  • 選取不包含……則看成是包含,而後加個not便可 NOT LIKE
SELECT * FROM USER WHERE nickName LIKE '廣%'

通配符

通配符 描述
% 代替一個或者多個字符
_ 僅代替一個字符
[charlist] 字符列中的任何單一字符
[^charlist]或者[!charlist] 不在字符列中的任何單一字符
  • _通配符
"Persons" 表中選取名字的第一個字符以後是 "eorge" 的人:
     SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
  • [charlist]字符列中的任何單一字符
選取居住的城市以 "A" 或 "L" 或 "N" 開頭的人:
    SELECT * FROM Persons WHERE City LIKE '[ALN]%'
  • [!charlist]不在字符列中的任何單一字符
選取居住的城市不以 "A" 或 "L" 或 "N" 開頭的人:
    SELECT * FROM Persons WHERE City LIKE '[!ALN]%'

IN——容許咱們在WHRER子句中規定多個值

  • 語法
SELECT * FROM TABLE WHERE COLUMN_NAME IN (value1,value2……)
    例如: 選取姓氏爲 Adams 和 Carter 的人
    SELECT *FROM Persons WHERE FirstName IN('Adams','Carter')
    則只要是知足這個條件(至關於OR)的都會顯示出來

BETWEEN……AND 選取介於兩個值之間的記錄(值能夠爲:數值、文本、日期)

  • 語法
SELECT * FROM TABLE WHERE COLUNM_NAME BETWEEN VALUE1 AND VALUE2
    注意:mysql的是[value1,value2) 是這樣一種範圍
    若是想表示不在這個範圍內,則加上NOT便可
  • 實例
當BETWEEN……AND的值是文本的時候,則代表選取的是表中在這個範圍之間的記錄
    例如:
    SELECT * FROM Persons WHERE lastName BETWEEN 'Adams' ADN 'Carter'
    則選取出來的結果就是 Adams和Bush這兩條的記錄

Persons表sql

lastName firstName
Adams John
Bush George
Carter Thomas
Gates Bill

AS---字段/表取別名(MySQL中)

  • 實例
SELECT b.book_name AS BOOKNAME,b.stu_id AS ID FROM book_borrow_history AS b WHERE b.stu_id='1506200043'

MySQL高級查詢之多表查詢

join:根據兩個或多個表中的列之間的關係,從這些表中查詢數據

  • 這裏的列通常指明的是:主鍵以及外鍵
  • 類型
    1. (INNER) JOIN: 若是表中有至少一個匹配,則返回行
    2. LEFT JOIN: 即便右表中沒有匹配,也從左表返回全部的行
    3. RIGHT JOIN: 即便左表中沒有匹配,也從右表返回全部的行
    4. FULL JOIN: 只要其中一個表中存在匹配,就返回行
INNER JOIN (內鏈接)
  • 說明:在表中存在至少一個匹配時,INNER JOIN 關鍵字返回行,若是兩個表之間沒有匹配上則不會返回東西——————即必須兩個表都有的,纔會顯示
  • 語法:
SELECT CLOUMN_NAME(S) FROM TABLE_NAME1 INNER JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN
    關鍵字:INNER JOIN……ON 條件
  • 例子:
查詢用戶的訂單,沒有用戶的訂單不顯示
    SELECT user.name,orders.* FROM user INNER JOIN orders ON user.id=orders.user_id
LEFT JOIN (也寫做 LEFT OUTER JOIN 左外鏈接)
  • 說明:會從左表 (table_name1) 那裏返回全部的行,即便在右表 (table_name2) 中沒有匹配的行——————即左邊的全部行必定會顯示
  • 語法:
SELECT COLUMN_NAME(S) FROM TABLE_NAME1 LEFT JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN ORDER BY COLUMN_NAME DESC(ASC)
    關鍵字:LEFT JOIN……ON 條件
  • 例子:
查詢全部用戶的訂單詳情——便是以用戶爲主體,全部的用戶都要顯示
    SELECT user.name,orders.* FROM user LEFT JOIN orders ON user.id=orders.user_id
RIGHT JOIN (RIGHT OUTER JOIN 右外鏈接)
  • 說明:會右表 (table_name2) 那裏返回全部的行,即便在左表 (table_name1) 中沒有匹配的行————即右邊的行必定會顯示
  • 語法:
SELECT COLUMN_NAME(S) FROM TABLE_NAME1 RIGHT JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN
FULL JOIN ( FULL OUTER JOIN 全鏈接 )
  • 說明:合併了左外/右外鏈接,即即便左邊不匹配也會顯示,同理右邊不匹配也一樣會顯示,沒有的值就爲空
  • 語法:
SELECT COLUMN_NAME(S) FROM TABLE_NAME1 FULL JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN

MySQL高級查詢之子查詢

  • 說明:一個查詢的結果依賴於另一個查詢
  • 分類:
    1. 其中一個查詢的結果返回一行一列(即一個肯定的值)
    2. 其中一個查詢的結果返回一行多列(即多個值)
    3. 其中一個查詢的結果返回多行多列(至關於另外的一個表)
      一行一列(單個值):使用 =
  • 查看用戶爲張三的訂單詳情
    1. 在用戶表中查找到用戶名爲'張三'的童鞋的id
    2. 在訂單表中查找出id爲'張三'的訂單
SELECT id FROM Users WHERE NAME='張三'
    SELECT * FROM Orders WHERE user_id='張三的id'
    整合:
        SELECT *FROM Orders WHERE user_id=(SELECT id FROM Users WHERE NAME='張三')

一行多列(多個值):使用 IN數據庫

  • 查詢出訂單的價格大於300的用戶的全部信息
    1. 在訂單表中查詢出訂單價格大於300的記錄的用戶id——由於須要和其餘表關聯
    2. 在用戶表中查詢出用戶信息
SELECT user_id FROM Orders WHERE price>300
    SELECT *FROM Users WHERE id='從訂單表獲取到的user_id'
    整合:
        SELECT *FROM Users WHERE id in(SELECT user_id FROM Orders WHERE price>300)

多行多列(至關於另一個表)函數

  • 查詢訂單價格大於300的訂單信息及相關用戶的信息
    1. 先查詢出訂單價格大於300的訂單信息---做爲一張臨時表
    2. 把臨時表和用戶表進行內鏈接便可
SELECT Orders.* FROM Orders WHERE price>300
    整合在一塊兒(基本寫法)
    SELECT Temp.*,Users.* FROM Users,(SELECT Orders.* FROM Orders WHERE price>300) AS Temp WHERE Temp.user_id=Users.id 
    內鏈接寫法:
    SELECT  Orders.*,Users.* from Orders INNER JOIN Users ON Users.id=Orders.user_id and orders.price>300;

總結

  1. 子查詢中返回的是一個肯定的值————用‘=’
  2. 子查詢返回的是多個值—————用IN
  3. 返回的是多行多列的話—————用內鏈接

MySQL高級查詢之其餘

  • UNION
  • Constraints(約束)
    • NOT NULL ————不爲空
    • UNIQUE ————惟一標識數據庫表中的每條記錄
    • PRIMARY KEY
    • FOREIGN KEY
    • CHECK
    • DEFAULT
* INDEX(索引)
* VIEW(視圖)

UNION

  • 說明:用於合併兩個或多個 SELECT 語句的結果集。
  • 注意:UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有類似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。
  • 語法:
SELECT COLUMN_NAME(S) FROM TABLE_NAME1
    UNION
    SELECT COLUMN_NAME(S) FROM TABLE_NAME2
    默認地,UNION 操做符選取不一樣的值。若是容許重複的值,請使用 UNION ALL。

Employees_China:學習

E_ID E_NAME
01 Zhang, Hua
02 Wang, Wei
03 Carter, Thomas
04 Yang, Ming

Employees_USA:code

E_ID E_NAME
01 Adams, John
02 Bush, George
03 Carter, Thomas
04 Gates, Bill

則若是想獲取兩個表的全部僱員的話對象

SELECT E_NAME FROM Employees_China
    UNION
    SELECT E_NAME FROM Employees_USA
    這樣會對重複的名字進行任意的選取其中之一,若想顯示所有的話UNION ALL

Constraints部分

  1. UNIQUE和PRIMARY KEY的區別和聯繫:
    • 聯繫:
      • PRIMARY KEY自動獲取UNIQUE約束,二者都表明惟一性約束
    • 區別:
      • 一個表中只能有一個PRIMARY KEY,可是能夠有多個UNIQUE
  2. FOREIGN KEY:一個表中的 FOREIGN KEY 指向另外一個表中的 PRIMARY KEY
  3. CHECK約束用於限制列中的值的範圍
    CREATE INDEX建立索引(重要)
  • 做用:不讀取整個表的狀況下,索引使數據庫應用程序能夠更快地查找數據
  • 注意:更新一個包含索引的表須要比更新一個沒有索引的表更多的時間,這是因爲索引自己也須要更新。所以,理想的作法是僅僅在經常被搜索的列(以及表)上面建立索引。
  • 語法
在表上建立一個簡單的索引。容許使用重複的值:
    CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN_NAME)
    註釋:"COLUMN_NAME" 規定須要索引的列。
    在表上建立一個惟一的索引。惟一的索引意味着兩個行不能擁有相同的索引值。
    CREATE UNIQUE INDEX index_name ON table_name (column_name)
    例如:
        若是但願以降序索引某個列中的值,能夠在列名稱以後添加保留字 DESC:
        CREATE INDEX PersonIndex On Person(firstName DESC)
        若是但願索引不止一個列,能夠在括號中列出這些列的名稱,用逗號隔開:
        CREATE INDEX PersonIndex ON Person (lastName, firstName)

VIEW視圖排序

SQL函數

  • AVG(COLUMN) 平均值
  • COUNT(COLUMN) 返回行數
  • FIRST(COLUMN) 返回該列的第一個值,可以使用 ORDER BY 語句對記錄進行排序
  • LAST(COLUMN) 該列的最後一個值
  • MAX(COLUMN) ....
  • MIN(COLUMN) ....
  • SUM(COLUMN) 返回該列的總數(總額)
  • UCASE(COLUMN) 把字段的值轉換成大寫
  • LCASE(COLUMN) 把字段的值轉換成小寫

GROUP BY從句

  • 說明:GROUP BY語句用於結合聚合函數,根據一個或多個列對結果集進行分組;——聚合函數是對GROUP BY後的結果進行計算
  • 例子:
但願查找每一個客戶的訂單總額
    錯誤:
        SELECT Customer,SUM(OrderPrice) FROM Orders
    錯誤緣由:首先SUM(OrderPrice)返回的是一個值,若是沒有使用group by
    的話,那麼就是計算的全部客戶的訂單的總額
    正確:
        SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
    正確緣由:由於使用的GROUP BY,那麼相同客戶的訂單(一個客戶能夠有多個訂單)就會合並在一塊兒,那麼SUM()出來的就是每一個客戶本身的訂單的總額
    擴展:
        也能夠對多個列進行GROUP BY操做
        SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders GROUP BY Customer,OrderDate

HAVING子句

  • 說明:HAVING和WHERE都是用來作條件判斷,可是由於WHERE沒法與聚合函數一塊兒使用,於是出現了HAVING
  • 語法:
SELECT column_name,aggregate_function(column_name),FROM table_name where column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) OPERATOR VALUE
  • 例子:
找出訂單總金額少於2000元的客戶
    SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000
    但願查找客戶 "Bush" 或 "Adams" 擁有超過 1500 的訂單總金額
    SELECT Customer,SUM(OrderPrice) FROM Orders WHERE Customer in("Bush","Adams") GROUP BY Customer HAVING SUM(OrderPrice)>1500

SQL語句的執行順序

去找找題來寫一寫,而後再去弄弄索引

相關文章
相關標籤/搜索