SELECT
SELECT [ALL|DISTINCT] select_expr FROM -> WHERE -> GROUP BY [合計函式] -> HAVING -> ORDER BY -> LIMIT
a. select_expr
-- 可以用 * 表示所有欄位,
select * from tb;
-- 可以使用運算式(計算公式、函式呼叫、欄位也是個運算式)
select stu, 29+25, now() from tb;
-- 可以為每個列使用別名,適用于簡化列標識,避免多個列識別符號重復,
- 使用 as 關鍵字,也可省略 as.
select stu+10 as add10 from tb;
b. FROM 子句
用于標識查詢來源,
-- 可以為表起別名,使用as關鍵字,
SELECT * FROM tb1 AS tt, tb2 AS bb;
-- from子句后,可以同時出現多個表,
-- 多個表會橫向疊加到一起,而資料會形成一個笛卡爾積,
SELECT * FROM tb1, tb2;
-- 向優化符提示如何選擇索引
USE INDEX、IGNORE INDEX、FORCE INDEX
SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3;
SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;
c. WHERE 子句
-- 從from獲得的資料源中進行篩選,
-- 整型1表示真,0表示假,
-- 運算式由運算子和運算陣列成,
-- 運算元:變數(欄位)、值、函式回傳值
-- 運算子:
=, <=>, <>, !=, <=, <, >=, >, !, &&, ||,
in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor
is/is not 加上ture/false/unknown,檢驗某個值的真偽
<=>與<>功能相同,<=>可用于null比較
d. GROUP BY 子句, 分組子句
GROUP BY 欄位/別名 [排序方式]
分組后會進行排序,升序:ASC,降序:DESC
以下[合計函式]需配合 GROUP BY 使用:
count 回傳不同的非NULL值數目 count(*)、count(欄位)
sum 求和
max 求最大值
min 求最小值
avg 求平均值
group_concat 回傳帶有來自一個組的連接的非NULL值的字串結果,組內字串連接,
e. HAVING 子句,條件子句
與 where 功能、用法相同,執行時機不同,
where 在開始時執行檢測資料,對原資料進行過濾,
having 對篩選出的結果再次進行過濾,
having 欄位必須是查詢出來的,where 欄位必須是資料表存在的,
where 不可以使用欄位的別名,having 可以,因為執行WHERE代碼時,可能尚未確定列值,
where 不可以使用合計函式,一般需用合計函式才會用 having
SQL標準要求HAVING必須參考GROUP BY子句中的列或用于合計函式中的列,
f. ORDER BY 子句,排序子句
order by 排序欄位/別名 排序方式 [,排序欄位/別名 排序方式]...
升序:ASC,降序:DESC
支持多個欄位的排序,
g. LIMIT 子句,限制結果數量子句
僅對處理好的結果進行數量限制,將處理好的結果的看作是一個集合,按照記錄出現的順序,索引從0開始,
limit 起始位置, 獲取條數
省略第一個引數,表示從索引0開始,limit 獲取條數
h. DISTINCT, ALL 選項
distinct 去除重復記錄
默認為 all, 全部記錄
UNION
將多個select查詢的結果組合成一個結果集合,
SELECT ... UNION [ALL|DISTINCT] SELECT ...
默認 DISTINCT 方式,即所有回傳的行都是唯一的
建議,對每個SELECT查詢加上小括號包裹,
ORDER BY 排序時,需加上 LIMIT 進行結合,
需要各select查詢的欄位數量一樣,
每個select查詢的欄位串列(數量、型別)應一致,因為結果中的欄位名以第一條select陳述句為準,
子查詢
- 子查詢需用括號包裹,
-- from型
from后要求是一個表,必須給子查詢結果取個別名,
- 簡化每個查詢內的條件,
- from型需將結果生成一個臨時表格,可用以原表的鎖定的釋放,
- 子查詢回傳一個表,表型子查詢,
select * from (select * from tb where id>0) as subfrom where id>1;
-- where型
- 子查詢回傳一個值,標量子查詢,
- 不需要給子查詢取別名,
- where子查詢內的表,不能直接用以更新,
select * from tb where money = (select max(money) from tb);
-- 列子查詢
如果子查詢結果回傳的是一列,
使用 in 或 not in 完成查詢
exists 和 not exists 條件
如果子查詢回傳資料,則回傳1或0,常用于判斷條件,
select column1 from t1 where exists (select * from t2);
-- 行子查詢
查詢條件是一個行,
select * from t1 where (id, gender) in (select id, gender from t2);
行構造符:(col1, col2, ...) 或 ROW(col1, col2, ...)
行構造符通常用于與對能回傳兩個或兩個以上列的子查詢進行比較,
-- 特殊運算子
!= all() 相當于 not in
= some() 相當于 in,any 是 some 的別名
!= some() 不等同于 not in,不等于其中某一個,
all, some 可以配合其他運算子一起使用,
連接查詢 (join)
將多個表的欄位進行連接,可以指定連接條件,
-- 內連接(inner join)
- 默認就是內連接,可省略inner,
- 只有資料存在時才能發送連接,即連接結果不能出現空行,
on 表示連接條件,其條件運算式與where類似,也可以省略條件(表示條件永遠為真)
也可用where表示連接條件,
還有 using, 但需欄位名相同, using(欄位名)
-- 交叉連接 cross join
即,沒有條件的內連接,
select * from tb1 cross join tb2;
-- 外連接(outer join)
- 如果資料不存在,也會出現在連接結果中,
-- 左外連接 left join
如果資料不存在,左表記錄會出現,而右表為null填充
-- 右外連接 right join
如果資料不存在,右表記錄會出現,而左表為null填充
-- 自然連接(natural join)
自動判斷連接條件完成連接,
相當于省略了using,會自動查找相同欄位名,
natural join
natural left join
natural right join
select info.id, info.name, info.stu_num, extra_info.hobby, extra_info.sex from info, extra_info where info.stu_num = extra_info.stu_id;
匯入匯出
select * into outfile 檔案地址 [控制格式] from 表名; -- 匯出表資料
load data [local] infile 檔案地址 [replace|ignore] into table 表名 [控制格式]; -- 匯入資料
生成的資料默認的分隔符是制表符
local未指定,則資料檔案必須在服務器上
replace 和 ignore 關鍵詞控制對現有的唯一鍵記錄的重復的處理
-- 控制格式
fields 控制欄位格式
默認:fields terminated by '\t' enclosed by '' escaped by '\\'
terminated by 'string' -- 終止
enclosed by 'char' -- 包裹
escaped by 'char' -- 轉義
-- 示例:
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
lines 控制行格式
默認:lines terminated by '\n'
terminated by 'string' -- 終止
INSERT
select陳述句獲得的資料可以用insert插入,
可以省略對列的指定,要求 values () 括號內,提供給了按照列順序出現的所有欄位的值,
或者使用set語法,
INSERT INTO tbl_name SET field=value,...;
可以一次性使用多個值,采用(), (), ();的形式,
INSERT INTO tbl_name VALUES (), (), ();
可以在列值指定時,使用運算式,
INSERT INTO tbl_name VALUES (field_value, 10+10, now());
可以使用一個特殊值 DEFAULT,表示該列使用默認值,
INSERT INTO tbl_name VALUES (field_value, DEFAULT);
可以通過一個查詢的結果,作為需要插入的值,
INSERT INTO tbl_name SELECT ...;
可以指定在插入的值出現主鍵(或唯一索引)沖突時,更新其他非主鍵列的資訊,
INSERT INTO tbl_name VALUES/SET/SELECT ON DUPLICATE KEY UPDATE 欄位=值, …;
DELETE
DELETE FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]
按照條件洗掉,where
指定洗掉的最多記錄數,limit
可以通過排序條件洗掉,order by + limit
支持多表洗掉,使用類似連接語法,
delete from 需要洗掉資料多表1,表2 using 表連接操作 條件,
TRUNCATE
TRUNCATE [TABLE] tbl_name
清空資料
洗掉重建表
區別:
1,truncate 是洗掉表再創建,delete 是逐條洗掉
2,truncate 重置auto_increment的值,而delete不會
3,truncate 不知道洗掉了幾條,而delete知道,
4,當被用于帶磁區的表時,truncate 會保留磁區
備份與還原
備份,將資料的結構與表內資料保存起來,
利用 mysqldump 指令完成,
-- 匯出
mysqldump [options] db_name [tables]
mysqldump [options] ---database DB1 [DB2 DB3...]
mysqldump [options] --all--database
1. 匯出一張表
mysqldump -u用戶名 -p密碼 庫名 表名 > 檔案名(D:/a.sql)
2. 匯出多張表
mysqldump -u用戶名 -p密碼 庫名 表1 表2 表3 > 檔案名(D:/a.sql)
3. 匯出所有表
mysqldump -u用戶名 -p密碼 庫名 > 檔案名(D:/a.sql)
4. 匯出一個庫
mysqldump -u用戶名 -p密碼 --lock-all-tables --database 庫名 > 檔案名(D:/a.sql)
可以-w攜帶WHERE條件
-- 匯入
1. 在登錄mysql的情況下:
source 備份檔案
2. 在不登錄的情況下
mysql -u用戶名 -p密碼 庫名 < 備份檔案
視圖
什么是視圖:
視圖是一個虛擬表,其內容由查詢定義,同真實的表一樣,視圖包含一系列帶有名稱的列和行資料,但是,視圖并不在資料庫中以存盤的資料值集形式存在,行和列資料來自由定義視圖的查詢所參考的表,并且在參考視圖時動態生成,
視圖具有表結構檔案,但不存在資料檔案,
對其中所參考的基礎表來說,視圖的作用類似于篩選,定義視圖的篩選可以來自當前或其它資料庫的一個或多個表,或者其它視圖,通過視圖進行查詢沒有任何限制,通過它們進行資料修改時的限制也很少,
視圖是存盤在資料庫中的查詢的sql陳述句,它主要出于兩種原因:安全原因,視圖可以隱藏一些資料,如:社會保隙訓金表,可以用視圖只顯示姓名,地址,而不顯示社會保險號和工資數等,另一原因是可使復雜的查詢易于理解和使用,
-- 創建視圖
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement
- 視圖名必須唯一,同時不能與表重名,
- 視圖可以使用select陳述句查詢到的列名,也可以自己指定相應的列名,
- 可以指定視圖執行的演算法,通過ALGORITHM指定,
- column_list如果存在,則數目必須等于SELECT陳述句檢索的列數
-- 查看結構
SHOW CREATE VIEW view_name
-- 洗掉視圖
- 洗掉視圖后,資料依然存在,
- 可同時洗掉多個視圖,
DROP VIEW [IF EXISTS] view_name ...
-- 修改視圖結構
- 一般不修改視圖,因為不是所有的更新視圖都會映射到表上,
ALTER VIEW view_name [(column_list)] AS select_statement
-- 視圖作用
1. 簡化業務邏輯
2. 對客戶端隱藏真實的表結構
-- 視圖演算法(ALGORITHM)
MERGE 合并
將視圖的查詢陳述句,與外部查詢需要先合并再執行!
TEMPTABLE 臨時表
將視圖執行完畢后,形成臨時表,再做外層查詢!
UNDEFINED 未定義(默認),指的是MySQL自主去選擇相應的演算法,
點關注,不迷路
好了各位,以上就是這篇文章的全部內容了,能看到這里的人呀,都是人才,之前說過,PHP方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這里把它整理成了PDF和檔案,如果有需要的可以
點擊進入暗號: PHP+「平臺」


更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)
以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以加入我的 PHP技術交流群
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/128487.html
標籤:AI
上一篇:查詢,單行函式,多行函式
