MySQL語句-DQL篇2
阿新 • • 發佈:2021-09-10
17 子查詢的種類
-- 17 子查詢的種類 包含: 標量,行,表子查詢 列子查詢在19中 -- exists查詢 -- 題目: 查詢deck表中的全部資料 條件是如果deck和deck2兩表的id相等 -- 1 方法1 使用where子查詢 SELECT * FROM deck a WHERE a.id IN (SELECT b.id FROM deck2 b); -- 2 方法2 使用exists查詢 SELECT * FROM deck a WHERE EXISTS (SELECT 1 FROM deck2 b WHERE b.id = b.id);17 子查詢的種類-- where子查詢 -- 3 找出deck表atk最大值, 且要是id最大的 結果為id=5 卡通混沌戰士 atk=3000 SELECT * FROM deck WHERE atk=(SELECT MAX(atk) FROM deck) ORDER BY id DESC LIMIT 0,1; -- 4 找出atk為2500中 def最小的值 結果id為7 卡通惡魔 def 1200 -- 標記: min函式 查詢def的最小值 作為條件 給外層 SELECT * FROM deck WHERE def = (SELECT MIN(def) FROM deck WHEREatk=2500 ); -- from子查詢 -- 5 將子查詢作為表去查詢 標記: 外層的排序會覆蓋內層的排序,內層的順序會失效 SELECT * FROM (SELECT * FROM deck ORDER BY def DESC) AS a ORDER BY a.atk ASC; -- 6 四表連線 要求: 內連線 四表連線 檢索列分別為a.b.c的c_name SELECT a.c_name,b.c_name,c.c_name,d.c_name FROM( (deck a INNER JOIN deck2 b ON a.id=b.id) INNERJOIN deck3 c ON a.id=c.id ) INNER JOIN deck4 d ON a.id=d.id; -- 7 要求: 外層查atk列 用in 子查詢: 檢索列def 條件id=5 標記: 5為混沌戰士 SELECT * FROM deck WHERE atk IN ( SELECT def FROM deck WHERE id=5 ); -- 8 要求: 外層檢列隨意 不去重 子查詢: deck中地屬性條數, 作新列給外層 SELECT c_name,race,atk, (SELECT COUNT(attribute) FROM deck WHERE attribute='地') AS subColumn FROM deck;
18 列子查詢
-- 子查詢的關鍵字 all 和 any 標記: 也就是列子查詢 -- 1 3中的記錄行,大於2中最大值 要求: 使用>all 標記: 3200,2900 由於2800相等不算 SELECT * FROM deck3 WHERE atk >ALL (SELECT atk FROM deck2) -- 2 1表最低是1300 2表中小於這個值有3條 2表中的自然南瓜1400 正好要比1300大 SELECT * FROM deck2 WHERE atk<ALL (SELECT atk FROM deck) -- 3 要求: 使用any 2中大於1表的任一數值 結果7條 都比1300大 標記: 別名some SELECT * FROM deck2 WHERE atk >ANY (SELECT atk FROM deck) -- 4 對比 =any和in 效果一樣 SELECT * FROM deck2 WHERE atk =ANY (SELECT atk FROM deck) -- 使用in SELECT * FROM deck2 WHERE atk IN (SELECT atk FROM deck) -- 5 對比 <>all和not in SELECT * FROM deck2 WHERE atk <>ALL (SELECT atk FROM deck) -- 使用notin SELECT * FROM deck2 WHERE atk NOT IN (SELECT atk FROM deck)18 列子查詢
19 檢視的單表查詢
-- ⑥ 檢視 -- 如果檢視存在就刪除 DROP VIEW IF EXISTS v1 -- 1 要求: deck表 atk表 查前三 檢視中列要設屬於檢視的列名v_原列名 CREATE VIEW v1 (v_name,v_atk,vdef) AS SELECT c_name,atk,def FROM deck ORDER BY atk DESC LIMIT 0,3 -- 2 計算欄位 要求: atk和def相加 指定屬於檢視的列的名稱 v_原列名 CREATE VIEW v2 (v_name,v_atkdefSum) AS SELECT c_name,atk+def FROM deck -- 3 格式化處理數 要求: 使用concat和trim 原表檢索欄位設別名concat_title CREATE VIEW v3 AS SELECT CONCAT(TRIM(id) , '(' , TRIM(c_name) , ')' ) AS concat_title FROM deck -- 4 要求: 日期加時間 日期 時間 標記: now curdate curtime CREATE VIEW v4 (v_currentTime,v_curdate,v_curtime) AS SELECT NOW(),CURDATE(),CURTIME() AS current; -- 5 正則表示式 and 模糊查詢 要求:名稱中卡通開頭,後4個字元 atk值是3000-4000 CREATE VIEW v5 AS SELECT * FROM deck WHERE c_name LIKE '卡通____' AND atk REGEXP '3[0-9]00' -- 6 and和or優先順序 將必要條件 和 任一 合併 要求: 只用and和or 結果id為1,2,3,4 -- 必要條件地屬性 排除6個 必要條件atk>2700 四個中再排除兩個 機械族再排除一個 -- 有特點的也可以選出來 名稱中有自然字樣的 種族是魔法師族的 CREATE VIEW v6 AS SELECT * FROM deck WHERE (attribute='地' AND atk>2700 AND race='機械族') OR c_name LIKE '%自然%' OR race='魔法師族' -- 7 原表分組彙總 要求: 分組 降序 彙總 檢索列atk,count,sum 不指定檢視列名 CREATE VIEW v7 AS SELECT atk,COUNT(atk) AS atkCount,SUM(atk) AS atkSum FROM deck GROUP BY atk DESC WITH ROLLUP -- 8 使用檢視保護原表資料 要求: 將c_name列名改成v_name 標記: 提高安全性 CREATE VIEW v8 (id,v_name,attribute,race,atk,def) AS SELECT * FROM deck -- 9 檢視的檢視 在v1的基礎上再新建一個檢視 標記: 檢視巢狀 CREATE VIEW v9 (v1_name,v1_atk,v1_def)AS SELECT * FROM v1 LIMIT 0,2 -- 10 排序 查詢檢視時,如果指定順序,那麼這個順序會覆蓋"原檢視中的排序"順序 CREATE VIEW v10 AS SELECT * FROM deck ORDER BY atk DESC SELECT * FROM v10 ORDER BY atk ASC19 檢視的單表查詢
20 操作檢視
-- 19 操作檢視 -- 11 查詢檢視資料 要求: 查v11前6的名稱和攻擊力 結果為3800到2900 SELECT c_name,atk FROM v11 ORDER BY atk DESC LIMIT 0,6 -- 要求: v8 列v_name屬於檢視, c_name是原表 標記: 檢索的列名是檢視的 SELECT v_name FROM v8 -- 標記: 列名為原表中的列名 "檢視資料"只顯示列名,不顯示列型別 SELECT * FROM v8 -- 12 修改檢視資料 標記: 對檢視操作,會影響到原表(基本表) -- 建立檢視v12 內容是deck2表 CREATE VIEW v12 AS SELECT * FROM deck2 -- 修改檢視本身資料 要求: v12 id為2的列 atk值改成2700 UPDATE v12 SET atk=2700 WHERE id=2 -- 就是修改原表中的資料, 檢視會自動更新 SELECT * FROM v12 SELECT * FROM deck2 -- 刪除行 DELETE FROM v12 WHERE id=2 -- 新增行 INSERT INTO v12 (id,c_name,attribute,race,atk,def) VALUES (2, '自然獸', '地', '獸族', 2200, 1700); -- 13 修改檢視本身 要求: v12 deck2改成deck3 不是修改檢視內容 ALTER VIEW v12 AS SELECT * FROM deck3 -- 刪除檢視 DROP VIEW v1; DROP TABLE v1; -- 14 查詢資訊: 檢視列表, 建檢視語句, 結構 -- 方法1 檢視資料表列表 標記: 檢視也在普通表的列表中 SHOW TABLES; -- 方法2 檢視檢視列表 檢視名模糊查詢 SHOW TABLES LIKE '%v%'; -- 方法3 不切換資料庫 列表在information_schema SELECT * FROM information_schema.VIEWS -- 檢視建檢視的語句 標記: 可看到編碼格式 SHOW CREATE VIEW v1 SHOW CREATE TABLE v12 -- 檢視檢視的列結構 要求: 檢視v1 標記: "檢視結構"是不顯示資料的 DESC v1220 操作檢視
21 檢視的多表查詢
-- 19 檢視的多表查詢 -- 15 4表合併 要求: 合併 不去重 CREATE VIEW v15 AS SELECT * FROM deck UNION ALL SELECT * FROM deck2 UNION ALL SELECT * FROM deck3 UNION ALL SELECT * FROM deck4 -- 16 要求: where連線兩表 檢索id和名稱 檢視列不指定名稱,檢索列重複時要指定 表別名 CREATE VIEW v16 AS SELECT a.id,a.c_name,b.attribute FROM deck a, deck b WHERE a.id=b.id -- 17 要求: 兩表內連線 屬性關聯 檢索id,名稱,右表任意列 重名時給檢視列別名 CREATE VIEW v17 AS SELECT a.id,a.c_name,a.attribute,b.deckRace,b.effect FROM deck a INNER JOIN deck5 b ON a.attribute=b.attribute -- 18 屬於mysql的外連線方式 左連線+union+右連線 CREATE VIEW v18 (id,c_name,attribute,race,atk,def,r_id,r_attribute,r_deckRace,r_effect) AS SELECT * FROM deck a LEFT JOIN deck5 b ON a.attribute=b.attribute UNION SELECT * FROM deck a RIGHT JOIN deck5 b ON a.attribute=b.attribute -- 去除不想要查詢的列 CREATE VIEW v18_2 (id,c_name,attribute,race,atk,def,r_deckRace,r_effect) AS SELECT a.id,a.c_name,a.attribute,a.race,a.atk,a.def,b.deckRace,b.effect FROM deck a LEFT JOIN deck5 b ON a.attribute=b.attribute UNION SELECT a.id,a.c_name,a.attribute,a.race,a.atk,a.def,b.deckRace,b.effect FROM deck a RIGHT JOIN deck5 b ON a.attribute=b.attribute -- 19 並集去交集 CREATE VIEW v19 (id,c_name,attribute,race,atk,def,r_deckRace,r_effect) AS SELECT a.id,a.c_name,a.attribute,a.race,a.atk,a.def,b.deckRace,b.effect FROM deck a LEFT JOIN deck5 b ON a.attribute=b.attribute WHERE b.attribute IS NULL UNION SELECT a.id,a.c_name,a.attribute,a.race,a.atk,a.def,b.deckRace,b.effect FROM deck a RIGHT JOIN deck5 b ON a.attribute=b.attribute WHERE a.attribute IS NULL21 檢視的多表查詢