MySQL基礎筆記(1) - 資料庫基礎概念&基礎查詢,條件查詢
阿新 • • 發佈:2021-10-20
本文為MySQL基礎入門相關筆記,同時參考了尚矽谷的BV1xW411u7ax網課和《MySQL必知必會》兩者,主要用於個人記錄與分享,如有錯誤歡迎留言指出
資料庫基礎概念&基礎查詢,條件查詢
目錄前言
- 本文為MySQL基礎入門相關筆記,同時參考了尚矽谷的BV1xW411u7ax網課和《MySQL必知必會》兩者,主要用於個人記錄與分享,如有錯誤歡迎留言指出
- 本文所使用的大部分表都來自於《MySQL必知必會》官網上提供的指令碼,可以前往http://www.forta.com/books/0672327120/下載(在網頁的最底下)
1. 資料庫基礎概念
-
資料庫相關簡寫
- DB:資料庫,儲存一組有組織的資料的容器
- DBMS:資料庫管理系統,又稱為資料庫軟體,用於管理DB中的資料
- SQL:結構化查詢語言,用於和DBMS通訊的語言
-
資料庫相關術語
-
表(table)是某種特定型別資料的結構化清單。儲存資料時,先將資料放到表中,表再放到庫中。
-
一個數據庫中可以有多個表,每個表都有一個名字用來標識自己。表名具有唯一性
-
表具有一些特性,這些特性定義了資料在表中如何儲存。描述表的這組資訊就是模式(schema),模式可以用來描述資料庫中特定的表以及整個資料庫。
-
表由列(column)組成,列又稱為欄位。所有表都是由一個或多個列組成的,每一列類似於Java中的屬性
-
行(row)是表中的一個記錄。表中的資料是按行儲存的,所儲存的每個記錄儲存在自己的行內。
-
主鍵(primary key)是一列(或一組列),其值能唯一區分表中每個行。
表中的任何列都可以作為主鍵,只要滿足以下兩個條件:1.任意兩行都不具有相同的主鍵值 2.每個行都必須具有一個主鍵值(主鍵列不允許為NULL值)
主鍵也不一定是單獨的一個列,也可以使用多個列組合作為主鍵,只要所有列值的組合都是唯一的。
主鍵的設定準則:
- 不更新主鍵列中的值
- 不重用主鍵列的值
- 不在主鍵列中使用可能會更改的值
-
-
MySQL常見指令
- 檢視當前所有資料庫:show databases;
- 開啟指定的庫:use [庫名]
- 檢視當前庫的所有表:show tables;
- 檢視其它庫的所有表:show tables from [庫名];
- 建立表:create table 表名([列名] [列型別] , [...])
- 查看錶結構:desc 表名
-
MySQL語法規範
-
不區分大小寫,但建議關鍵字大寫,表名,列名小寫
-
每條指令最好用分號結尾
-
註釋:
# 單行註釋 -- 單行註釋 /* 多行註釋 */
-
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]