day89---MySQL階段性整理
day89---MySQL階段性整理
DQL
基礎查詢
語法:
SELECT 要查詢的東西
【FROM 表名】;
類似於Java中 :System.out.println(要列印的東西);
特點:
-
通過select查詢完的結果 ,是一個虛擬的表格,不是真實存在
-
要查詢的東西 可以是常量值、可以是表示式、可以是欄位、可以是函式
條件查詢
條件查詢:根據條件過濾原始表的資料,查詢到想要的資料
語法:
select
要查詢的欄位|表示式|常量值|函式
from
表
where
條件 ;
分類:
一、條件表示式
示例:salary>10000
條件運算子:
< >= <= = != <>
二、邏輯表示式
示例:
salary>10000 && salary<20000
邏輯運算子:
and(&&):兩個條件如果同時成立,結果為true,否則為false
or(||):兩個條件只要有一個成立,結果為true,否則為false
not(!):如果條件成立,則not後為false,否則為true
三、模糊查詢
示例:
last_name like 'a%'
排序查詢
語法:
select 要查詢的東西 from 表 where 條件
order by 排序的欄位|表示式|函式|別名 【asc|desc】
分組函式
sum 求和
max 最大值
min 最小值
avg 平均值
count 計數
特點:
1、以上五個分組函式都忽略null值,除了count(*)
2、sum和avg一般用於處理數值型
max、min、count可以處理任何資料型別
3、都可以搭配distinct使用,用於統計去重後的結果
4、count的引數可以支援:
欄位、*、常量值,一般放1
建議使用 count(*)
分組查詢
語法:
select 查詢的欄位,分組函式
from 表
group by 分組的欄位
特點:
1、可以按單個欄位分組
3、分組篩選
針對的表 | 位置 | 關鍵字 | |
---|---|---|---|
分組前篩選: | 原始表 | group by的前面 | where |
分組後篩選: | 分組後的結果集 | group by的後面 | having |
4、可以按多個欄位分組,欄位之間用逗號隔開
5、可以支援排序
6、having後可以支援別名
連線查詢
笛卡爾乘積:如果連線條件省略或無效則會出現
解決辦法:新增上連線條件
等值連線——非等值連線
- 等值連線的結果 = 多個表的交集
- n表連線,至少需要n-1個連線條件
- 多個表不分主次,沒有順序要求
- 一般為表起別名,提高閱讀性和效能
通過join關鍵字實現連線
含義:1999年推出的sql語法
支援:
等值連線、非等值連線 (內連線)
外連線
交叉連線
語法:
select 欄位,...
from 表1
【inner|left outer|right outer|cross】join 表2 on 連線條件
【inner|left outer|right outer|cross】join 表3 on 連線條件
【where 篩選條件】
【group by 分組欄位】
【having 分組後的篩選條件】
【order by 排序的欄位或表示式】
好處:語句上,連線條件和篩選條件實現了分離,簡潔明瞭!
三、自連線
案例:查詢員工名和直接上級的名稱
sql99
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.manager_id=m.employee_id;
sql92
SELECT e.last_name,m.last_name
FROM employees e,employees m
WHERE e.manager_id=m.employee_id;
子查詢
含義:
一條查詢語句中又嵌套了另一條完整的select語句,其中被巢狀的select語句,稱為子查詢或內查詢
在外面的查詢語句,稱為主查詢或外查詢
特點:
1、子查詢都放在小括號內
2、子查詢可以放在from後面、select後面、where後面、having後面,但一般放在條件的右側
3、子查詢優先於主查詢執行,主查詢使用了子查詢的執行結果
4、子查詢根據查詢結果的行數不同分為以下兩類:
① 單行子查詢
結果集只有一行
一般搭配單行操作符使用:> < = <> >= <=
非法使用子查詢的情況:
a、子查詢的結果為一組值
b、子查詢的結果為空
② 多行子查詢
結果集有多行
一般搭配多行操作符使用:any、all、in、not in
in: 屬於子查詢結果中的任意一個就行
any和all往往可以用其他查詢代替
分頁查詢
應用場景:
實際的web專案中需要根據使用者的需求提交對應的分頁查詢的sql語句
語法:
select 欄位|表示式,...
from 表
【where 條件】
【group by 分組欄位】
【having 條件】
【order by 排序的欄位】
limit 【起始的條目索引,】條目數;
特點:
1.起始條目索引從0開始
2.limit子句放在查詢語句的最後
3.公式:select * from 表 limit (page-1)*sizePerPage,sizePerPage
假如:
每頁顯示條目數sizePerPage
要顯示的頁數 page
進階9:聯合查詢
union 聯合、合併
語法:
select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
.....
select 欄位|常量|表示式|函式 【from 表】 【where 條件】
特點:
1、多條查詢語句的查詢的列數必須是一致的
2、多條查詢語句的查詢的列的型別幾乎相同
3、union代表去重,union all代表不去重
DML
插入
語法:
insert into 表名(欄位名,...)
values(值1,...);
特點:
1、欄位型別和值型別一致或相容,而且一一對應
2、可以為空的欄位,可以不用插入值,或用null填充
3、不可以為空的欄位,必須插入值
4、欄位個數和值的個數必須一致
5、欄位可以省略,但預設所有欄位,並且順序和表中的儲存順序一致
修改
修改單表語法:
update 表名 set 欄位=新值,欄位=新值
【where 條件】
修改多表語法:
update 表1 別名1,表2 別名2
set 欄位=新值,欄位=新值
where 連線條件
and 篩選條件
刪除
方式1:delete語句
單表的刪除: ★
delete from 表名 【where 篩選條件】
多表的刪除:
``delete 別名1,別名2
from 表1 別名1,表2 別名2
where 連線條件
and 篩選條件;`
方式2:truncate語句
truncate table 表名
兩種方式的區別【面試題】
- truncate不能加where條件,而delete可以加where條件
- truncate的效率高一丟丟
- truncate 刪除帶自增長的列的表後,如果再插入資料,資料從1開始
delete 刪除帶自增長列的表後,如果再插入資料,資料從上一次的斷點處開始 - truncate刪除不能回滾,delete刪除可以回滾
DDL語句
庫和表的管理
庫的管理:
一、建立庫
create database 庫名
二、刪除庫
drop database 庫名
表的管理:
- 建立表
CREATE TABLE IF NOT EXISTS stuinfo(
stuId INT,
stuName VARCHAR(20),
gender CHAR,
bornDate DATETIME
);
DESC studentinfo;
- 修改表 alter
- 語法:
ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 欄位名 【欄位型別】;
- 語法:
① 修改欄位名
ALTER TABLE studentinfo CHANGE COLUMN sex gender CHAR;
② 修改表名
ALTER TABLE stuinfo RENAME [TO] studentinfo;
③ 修改欄位型別和列級約束
ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;
④ 新增欄位
ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first;
⑤ 刪除欄位
ALTER TABLE studentinfo DROP COLUMN email;
- 刪除表
DROP TABLE [IF EXISTS] studentinfo;
桃園三屁吃,簡稱桃園寶寶:
紙上得來終覺淺,絕知此事要躬行。---冬夜讀書示子聿【朝代】宋
- 程式碼不敲是不行滴,成天總結這個總結那個,手上功夫都廢了。
- 2020年11月20日 今天是週五,大家都是成年人了,都懂???
- 現在的我對於四個小時開發一個小外掛還沒有什麼概念,很厲害嗎?
- MySQL快要結束了,感覺自己成長得很快,但是我感覺虛的不行,知識掌握的不牢固,真就是一聽就會,一敲全廢。也許到了後面綜合運用起來會好一些吧。回到幾天前的話題,現在的我們還需要造輪子嗎?
- 最近看到,deepin,又有了兩款軟體。一款是瀏覽器,一款是下載器。你覺得現在再寫兩款這樣的軟體有什麼意義嗎?
- 你看,瀏覽器Windows 自帶的edge瀏覽器換成了谷歌的核心,還有chrome 火狐 幾乎沒有生存空間了呀。用deepin的開發者居多,難道是想讓更多的開發者用這個嗎
- 還一個下載器,國內迅雷一家獨大。下載支援HTTP協議的都可以用瀏覽器下載,之外的BT 什麼的都有專門的軟體,還有各大網盤的離線下載,具體的我不懂,難道真的還有什麼地方可以挖掘的嗎(會不是多執行緒這一塊,猜的doge)