MySQL數據庫查詢詳解
1.查詢之前需要做的準備
1.1如果是自己創建的數據庫或者有權限查看數據庫中每個表之間的關係,則可以把數據庫內容導入到navicat工具或者其他的軟件,通過查看E-R圖能夠快速熟悉表與表之間的關係,爲多表連接查詢做好準備。
1.2數據庫不是自己所創建的,沒有權限查看數據庫中表與表之間的關係,只能查看每個數據表中的字段的定義和內容。在數據表不是特別多情況下就打開逐一打開每個數據表熟悉每個字段,瞭解每個數據表中各個字段表示什麼含義,常見的是兩個表存在主外鍵的關係,兩個數據表中存在共同的字段,則比較容易建立連接關係,特別需要注意的是不一定實在字段名稱相同的情況下兩個表才能連接起來,只要兩個數據表表達的字段的含義(字段數據類型必須一致)相同,即可讓兩個數據表建立連接。例如,在project數據表中存在個id,name(項目名稱),number等字段,在team表中有name(團隊名稱),project等,需要注意的是雖然兩個數據表都有name字段,但是表示的含義卻完全不同,因此不能作爲連接的條件,而project表中的id(int類型)表示的項目編號,而在team表中project字段(假設是int類型的)和project表中的id字段雖然兩個字段名稱不同,但是表示的確實相同的含義,即都表示項目編號,可以作爲兩個連接的條件。其他表的連接也遵循這一原則。至於表數量特別多,然後又沒有權限查看錶與表之間關係的,只能聯繫數據庫管理人員,申請權限進行訪問了。
2.單表查詢
2.1介紹一下MySQL數據庫中常用的關鍵字
1.distinct關鍵字
作用:檢索出有不同值的列,比如一個商品表中存在供應商product_pro,一個供應商會對應很多商品,我們要查找有多少供應商,就可以用到該關鍵字去重。
select distinct product_pro fromproducts;
2.limit關鍵字
作用:返回表中指定行範圍的數據(即查詢有限條數據)
select name from products limit 5; --返回不多於5行的數據
select name from products limit 1,5; --返回從1行開始的5行。
3.order by關鍵字
作用:對所查詢的列進行升序排列
select name from products order by id asc(其中asc可以省略不寫,默認按升序進行排序)
在字段後加上desc關鍵字進行降序排序
select name from products order by id desc;
order by 和 limit 組合可以查詢最大值,示例如下:
select prod_price from products orderby prod_price DESC limit 1;
order by 和 where 語句連着使用時必須放在where後面。
4.and 和 or 結合使用
and和or常在where後面進行條件的限定,要求and兩端的條件都要滿足,而or只要求滿足其中一個條件即可。
5.in 和 not in
用 in可以代替 or
應用場景:假設1002和1003生產的商品
select * from products where vend_id =1002 or vend_id = 1003; -- or方法
select * from products where vend_id in(1002,1003); -- in方法
select * from products where vend_idnot in (1002,1003); -- not in方法查詢不是 1002 和1003 生產的商品
6. like 關鍵字
作用:進行一些模糊匹配,通常和一些通配符進行搭配查找
select * from products where prod_namelike 'jet%' --匹配以jet開頭的字符
select * from products where prod_name like'%dcb%' --匹配任何位置包含dcb字符商品信息
select * from products where prod_namelike '_jet' -- 匹配一個字符
select * from products where prod_namelike '[jdk]%'; --匹配以 j, d , k ,開頭的商品
select * from products where prod_namelike '[!jdk]%'; --匹配不以j , d , k ,開頭的商品
7.update 關鍵字
作用:根據一些條件更新數據庫中的值,update 表名set 字段 = 新的值 where 條件(是什麼),示例如下:
update products set prod_price = 100where prod_name = jet; --修改商品名稱爲jet商品價格
8.union 關鍵字
UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每個SELECT 語句中的列的順序必須相同。
SELECT City FROM Customers UNION SELECTCity FROM Suppliers
ORDER BY City;
UNION 不能用於列出兩個表中所有的城市。如果一些客戶和供應商來自同一個城市,每個城市只會列出一次。UNION 只會選取不同的值。請使用 UNION ALL 來選取重複的值!
SELECT City FROM Customers UNION ALL SELECTCity FROM Suppliers
ORDER BY City;
2.2基本查詢
查詢的格式:
SELECT[distinct]*(所有)|字段名,...字段名 from 表名 [where 條件過濾] -- 查詢指定字段信息pname,price
SELECT pname,price FROM products; -- 去除價格重複的記錄
SELECT DISTINCT price FROM products; --別名查詢,使用的as關鍵字,as可以省略的
SELECT pname AS 名稱,priceAS 價格 FROM products或者寫成
SELECT pname 名稱,price價格 FROM products都可以
-- 查詢出所有的商品價格,把價格增加20元
SELECT pname,price+20 price FROMproducts;
2.3條件查詢
格式:
select [distinct]*(所有)|字段名,...字段名 from 表名[where 條件過濾]
比較運算符 >(大於) <(小於) >=(大於等於) <=(小於等於) =(等於)<>或者!=(不等於)
查詢商品名稱爲“花花公子”的商品所有信息
SELECT * FROM products WHERE pname = '花花公子';
SELECT * FROM products WHERE pname IN('花花公子');
查詢價格爲800商品
SELECT * FROM products WHERE price =800;
查詢價格不是800的所有商品
SELECT * FROM products WHERE price !=800或者
SELECT * FROM products WHERE price<> 800
查詢商品價格大於60元的所有商品信息
SELECT * FROM products WHERE price >60;
2.4聚合函數:
count:統計指定列不爲NULL的記錄行數;
sum:計算指定列的數值和,如果指定列類型不是數值類型,那麼計算結果爲0;
max:計算指定列的最大值,如果指定列是字符串類型,那麼使用字符串排序運算;
min:計算指定列的最小值,如果指定列是字符串類型,那麼使用字符串排序運算;
avg:計算指定列的平均值,如果指定列類型不是數值類型,那麼計算結果爲0;
使用聚合函數的格式如下:
select 聚合函數(字段) from 表名
2.5分組查詢
分組查詢語句:
select 被分組的字段 from 表名 group by 字段 [having 字段]
注意:被分組的字段,一定要寫在select後面
例:根據商品名稱相同,對數據進行分組,對每組數據進行求和
SELECT pname,SUM(price) FROM productsGROUP BY pname;
例:對分組求和的結果進行過濾,只顯示求和結果大於1000的商品
SELECT pname,SUM(price) s FROM productsGROUP BY pname
HAVING SUM(price)>1000;
3、多表查詢(主要分爲內連接、外連接、交叉連接)
3.1連接方法如下:
內連接:join,inner join
外連接:left join,left outer join,right join,right outer join,union
交叉連接:cross join
3.2 內連接
首先是內連接,使用join或者是inner join
格式如下(查詢列1):select 列1,列2 from 表1 join 表2 on 表1.字段 = 表2.字段
Where條件
注意:1、兩個表連接的前提是具有共同的字段,所謂共同的字段是指名稱有可能相同也有可能不同,但是兩個字段所表達的含義一定是一樣的。
2、使用內連接的兩個表,查詢出來的數據是兩個表共有的數據(指的是連接條件),
比如說表1中有id爲1,2,3,4,表2中有id爲2,3,4,5的數據那麼id爲表一和表二
的連接條件,查詢出來的數據只有id爲2,3,4的字段內容。
3.3外連接
使用left join或者left outer join(左連接)
表一與表二查詢出來的結果把表一的id爲1234所有數據都查詢出來,表二中沒有id爲1的數據則用null進行代替。
使用right join或者 right outer join(右連接)
表一與表二查詢出來的結果把表二的id爲2345所有數據都查詢出來,表1中沒有id爲1的數據則用null進行代替。
3.4交叉連接
格式:select 表一.字段1,表一.字段2,表二.字段1,表二.字段2 from 表一 cross join表二 where 條件
在什麼時候使用交叉連接,示例如下:
某些情況下,用於 尋找連續日期中殘缺的數據 的時候,可以先笛卡爾積做一個排列組合。然後和目標表進行關聯,查找哪些數據缺少了。