day46 資料庫學習
今天學習了資料增刪改、單標查詢、正則表示式查詢、多表查詢和子查詢
一、資料增刪改
新增資料:
1.insert [into] 表名[(可選欄位名)] values(一堆值1),(一堆值2),......
into 可以省略
表名後的欄位可以選
如果寫了 後面的values中的值必須與表名後的欄位一一對應
如果沒寫 後面的values中的值必須與表的所有欄位一一對應
values後面可以給多組值 用逗號隔開
刪除
delete from 表名[where 條件]
條件不寫 是刪除所有記錄 是一行一行刪除 自增id 不會歸零
truncate 重建表 先記錄表結構 刪除整個表再重新建出來表 自增id 會歸零
更新資料 update 表名 set 欄位名 = 值[,欄位2 = 值2],[where 條件]
可以一次性修改多個欄位的值用逗號隔開
條件如果不寫 修改所有記錄
2.單表查詢
不帶關鍵字的查詢
select {1.*|2.欄位名|3.四則執行|4.聚合函式} from 表名 [where 條件]
1.*表示查詢所有欄位
2.可以手動要查詢的欄位
3.欄位的值可以進行加減乘除運算
4.聚合函式,用於統計
where 是可選的
關鍵字的作用
distinct 去除重複資料 所有資料全都重複才算重複
where 在逐行讀取資料時的一個判斷條件
group by 對資料分組
having 對分組後的資料進行過濾
order by 對結果排序
limit 指定獲取資料條數
完整的select 語句 語法
select [distinct] * from 表名
[where group by having order by limit]
注意 在書寫時 必須按照這個順序來寫
group by 分組查詢
什麼是分組
把一個整體 分割為多個部分
為什麼分組
在資料庫中分組為了統計
分組後 組裡的詳細記錄就被隱藏起來了 不能直接檢視
create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double); insert into emp values (1,"劉備","男","市場","總監",5800), (2,"張飛","男","市場","員工",3000), (3,"關羽","男","市場","員工",4000), (4,"孫權","男","行政","總監",6000), (5,"周瑜","男","行政","員工",5000), (6,"小喬","女","行政","員工",4000), (7,"曹操","男","財務","總監",10000), (8,"司馬懿","男","財務","員工",6000);
dept 一分組 變成三條記錄 每個組中卻包含多條記錄 沒辦法顯示
一定要顯示的話
可以使用group_concat(欄位名)
可以將多個值拼接成一個字串
注意:1.只有出現在group by 後面的欄位 才可以被顯示 其他都被隱藏了
2.聚合函式不能寫在where的後面 where最先執行 它的作用 硬碟讀取資料並過濾 因為資料還沒有讀取完 此時不能進行統計
什麼樣的欄位適合用於分組
重複性高的欄位
order by 排序用的
asc 表示升序 是預設的
desc 表示降序
by 後面可以有多個排序依據
limit 限制顯示條數
limit a,b
limit 1,5
從1開始 不包含1 取5條
三、正則表示式匹配
由於like只能使用 %和_不太靈活
可以將like換為 regexp 來使用正則表示式
四、多表查詢
create table emp (id int,name char(10),sex char,dept_id int); insert emp values(1,"大黃","m",1); insert emp values(2,"老王","m",2); insert emp values(3,"老李","w",30); create table dept (id int,name char(10)); insert dept values(1,"市場"); insert dept values(2,"財務"); insert dept values(3,"行政");
1.笛卡爾積查詢
select *from 表1,表n
查詢結果是 將座標中的每條記錄 與右表中的每條記錄都關聯一遍
因為他不知道什麼樣的對應關係是正確 只能幫你都對一遍
a表有m條記錄 b表有n條記錄
笛卡爾積結果為m * n 記錄
需要自己篩選出正確的關聯關係
select *from emp,dept where emp.dept_id = dept.id;
2.內連線查詢 就是笛卡爾積查詢
select * from emp inner join dept where emp.dept_id = dept.id;
3.左外連線查詢
select *from emp left join dept on emp.dept_id = dept.id;
左表資料全部顯示 右表只顯示匹配上的
4.右外連線查詢
select *from emp right join dept on emp.dept_id = dept.id;
右表資料全部顯示 左表只顯示匹配上的
內和外的理解 內指的是匹配上的資料 外指的是沒匹配上的資料
5.全外連線
union 合併查詢結果
select * from emp left join dept on emp.dept_id = dept.id
union
select *from emp right join dept on emp.dept_id = dept.id;
union 去除重複資料 只能合併欄位數量相同的表
union all 不會去除重複資料
on 關鍵字 where 都是用於條件過濾 沒有本質區別
在單表中where的作用是篩選過濾條件
在多表中where 連線多表 滿足條件就連線 不滿足就不連線
為了區分是單表還是多表 搞個新的名字 就是 on
只要是連線多表的條件 就使用on
五、子查詢
條件當一個查詢的結果是另一個查詢的結果時 這個查詢稱之為子查詢(內層查詢)
什麼時候使用子查詢
當一次查詢無法得到想要結果時 需要多次查詢
解決問題的思路
是把一個複雜的問題 拆分為多個簡單的問題
是把一個複雜的查詢 拆分為多個簡單的查詢