1. 程式人生 > 其它 >MySQL基礎筆記(1) - 資料庫基礎概念&基礎查詢,條件查詢

MySQL基礎筆記(1) - 資料庫基礎概念&基礎查詢,條件查詢

本文為MySQL基礎入門相關筆記,同時參考了尚矽谷的BV1xW411u7ax網課和《MySQL必知必會》兩者,主要用於個人記錄與分享,如有錯誤歡迎留言指出

資料庫基礎概念&基礎查詢,條件查詢

目錄

前言

  • 本文為MySQL基礎入門相關筆記,同時參考了尚矽谷的BV1xW411u7ax網課和《MySQL必知必會》兩者,主要用於個人記錄與分享,如有錯誤歡迎留言指出
  • 本文所使用的大部分表都來自於《MySQL必知必會》官網上提供的指令碼,可以前往http://www.forta.com/books/0672327120/下載(在網頁的最底下)

1. 資料庫基礎概念

  • 資料庫相關簡寫

    • DB:資料庫,儲存一組有組織的資料的容器
    • DBMS:資料庫管理系統,又稱為資料庫軟體,用於管理DB中的資料
    • SQL:結構化查詢語言,用於和DBMS通訊的語言
  • 資料庫相關術語

    1. 表(table)是某種特定型別資料的結構化清單。儲存資料時,先將資料放到表中,表再放到庫中。

    2. 一個數據庫中可以有多個表,每個表都有一個名字用來標識自己。表名具有唯一性

    3. 表具有一些特性,這些特性定義了資料在表中如何儲存。描述表的這組資訊就是模式(schema),模式可以用來描述資料庫中特定的表以及整個資料庫。

    4. 表由列(column)組成,列又稱為欄位。所有表都是由一個或多個列組成的,每一列類似於Java中的屬性

    5. 行(row)是表中的一個記錄。表中的資料是按行儲存的,所儲存的每個記錄儲存在自己的行內。

    6. 主鍵(primary key)是一列(或一組列),其值能唯一區分表中每個行。

      表中的任何列都可以作為主鍵,只要滿足以下兩個條件:1.任意兩行都不具有相同的主鍵值 2.每個行都必須具有一個主鍵值(主鍵列不允許為NULL值)

      主鍵也不一定是單獨的一個列,也可以使用多個列組合作為主鍵,只要所有列值的組合都是唯一的。

      主鍵的設定準則:

      • 不更新主鍵列中的值
      • 不重用主鍵列的值
      • 不在主鍵列中使用可能會更改的值
  • MySQL常見指令

    1. 檢視當前所有資料庫:show databases;
    2. 開啟指定的庫:use [庫名]
    3. 檢視當前庫的所有表:show tables;
    4. 檢視其它庫的所有表:show tables from [庫名];
    5. 建立表:create table 表名([列名] [列型別] , [...])
    6. 查看錶結構:desc 表名
  • MySQL語法規範

    1. 不區分大小寫,但建議關鍵字大寫,表名,列名小寫

    2. 每條指令最好用分號結尾

    3. 註釋:

      # 單行註釋
      -- 單行註釋
      /* 多行註釋 */
      

2. 查詢操作

2.1 基礎查詢

語法:select [查詢列表] from [表名]

查詢列表的結果可以是:表中的欄位,常量值,表示式,函式;查詢的結果是一個虛擬的表格

#1.查詢表中的單個欄位
SELECT prod_name
FROM products;

#2.查詢表中的多個欄位
SELECT prod_id,prod_name,prod_price
FROM products;
#如果欄位名稱與關鍵詞重複,可以使用''指明該詞語是欄位;如,'name'

#3.查詢表中的所有欄位
SELECT *
FROM products;
#使用萬用字元只能按照預設的順序顯示所有表格

#4.別名
#別名是一個欄位或值的替換名;如果要查詢的欄位有重名的情況,可以使用別名區分開來
SELECT CONCAT(vend_name,'(',vend_country,')') AS vend_title
FROM vendors
ORDER BY vend_name;

#5.去重
#可以讓輸出的列去掉內部重複的元素
SELECT DISTINCT vend_id
FROM products;
#無法同時對兩個不同的列去重,如果這樣做會預設把所有的列顯示出來

#9.連線
#查詢生產商名稱和國籍,並連線成一個欄位
SELECT CONCAT(vend_name,'(',vend_country,')')
FROM vendors
ORDER BY vend_name;

/*與Java不同,mysql中的'+'號只有運算子功能:
	select 100+90;		兩個運算元都為數值型,則做加法運算
	select '123'+90;	其中一方為字元型,試圖將字元型轉換為數值型
	select 'john'+90;	如果轉換失敗,則將字元型數值轉換為0
	select null+10;		只要其中一方為null,則結果肯定為null
*/

2.2 條件查詢

語法:select [查詢列表] from [表名] where [篩選條件]

條件查詢分為三種:

#1.按條件表示式篩選
#條件運算子: > < = != >= <= <>(等同於!=)
#查詢所有價格小於等於10的產品
SELECT prod_name,prod_price
FROM products
WHERE prod_price <= 10;
#注意mysql中相等是'='而不是'=='

#2.按邏輯表示式篩選
#邏輯運算子: &&(and) ||(or) !(not)
#查詢價格大於等於10且由1002或1003號生產商製造的產品
SELECT prod_name,prod_price
FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
#AND的優先順序比OR高,建議在where中新增複數or/and時使用括號


#3.模糊查詢
#3.1.like
#a.查詢以s起頭e結尾的所有產品
SELECT prod_name
FROM products
WHERE prod_name LIKE 's%e';
#‘%’為萬用字元,表示任意多個字元(含0)出現任意多次	
#b.查詢前面有一個任意字元的,包含" ton anvil"的所有產品
SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE '_ ton anvil';
#"_"也為萬用字元,表示任意單個字元
#如果要查詢包含'_'的名稱,可以在'_'前加/,這樣'_'就不會被識別為萬用字元,而是作為一個普通的字元
#不要過度使用萬用字元,會造成效能下降,優先使用其它操作符;如果真的要使用萬用字元,不要把它們用在搜尋模式的開始處,否則效率會非常低

#3.2.between
#查詢價格在[5,10]之間的商品
SELECT prod_name,prod_price
FROM products
WHERE prod_price BETWEEN 5 AND 10;
#between和and可以被比較運算子替代;between包含兩個臨界值,且臨界值不可調換順序
	
#3.3.in
#查詢生產商id為1002或1003的產品
SELECT prod_name,prod_price
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;
#in可以被'='和邏輯運算子替代;in列表的值型別必須一致或相容,不支援萬用字元
/*
除了in以外還有其它類似的比較符:
1.IN/NOT IN:等於列表中的任意一個 
2.ANY|SOME:和子查詢返回的某一個值比較(等價於MIN/MAX)
3.ALL:和子查詢返回的所有值比較(等價於MIN/MAX)
*/

#3.4.is null
#查詢沒有郵箱的使用者
SELECT cust_id
FROM customers
WHERE cust_email IS NULL;
#=或<>不能用於判斷null值,但是is null或is not null可以
#安全等於(<=>)既可以判斷數值,又可以判斷null值

2.3 分頁查詢

定義:當要顯示的資料一頁顯示不全時,需要分頁提交sql請求

語法:select [查詢列表] from [表] limit [start] offset [size];

​ ([start]表示要顯示條目的起始索引(起始索引從0開始),[size]要顯示的條目個數)

#顯示預設排序下前五個產品
SELECT DISTINCT prod_name
FROM products
LIMIT 5;

#顯示從行5開始的後5個產品
SELECT DISTINCT prod_name
FROM products
LIMIT 5 OFFSET 5;
#檢索是從行0開始的,而非行1
#公式:offset=(page-1)*size;所以limit最終寫法就是limit [(page-1)*size] offset [size]