1. 程式人生 > 其它 >MySQL語句-DQL篇2

MySQL語句-DQL篇2

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);



-- 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 WHERE
atk=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) INNER
JOIN 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;
17 子查詢的種類

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 ASC
19 檢視的單表查詢

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 v12
20 操作檢視

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 NULL
21 檢視的多表查詢