Mysql起步之路三

特殊形式的查詢:

1、 子查詢:SELECT 字段名稱,… FROM tb1_name WHERE col_name=(SELECT  col_name FROM tb2_name);

——內層語句的查詢結果可以作爲外層語句的查詢條件            

            a)      由IN引發的子查詢

                    SELECT * FROM emp WHERE depId [NOT]IN (SELECT id FROM dep);

         b)      由比較運算符引發的子查詢:SELECT 字段名稱,… FROM tb1_name WHERE col_name>=[<=…](SELECT                      col_name  FROM  tb2_name);

            c)      由EXISTS引發的子查詢(內層查詢語句不返回記錄,而返回Boolean值):

                     SELECT 字段名稱,… FROM tb1_name WHERE EXISTS (SELECT  col_name  FROM  tb2_name);——內層查詢語 句爲 真,則查詢外層語句,反之不查詢

                       SELECT * FROM emp WHERE EXISTS SELECT depName FROM dep WHERE id=10;

            d)      ANY  SOME ALL的子查詢

運算符\關鍵字

ANY

SOME

ALL

>、>=

最小值

最小值

最大值

<、<=

最大值

最大值

最小值

=

任意值

任意值

 

<>、!=

 

 

任意值

            Eg: SELECT * FROM stu WHERE score>= ANY(SELECT score FROM level);----大於等於內層查詢的最小值

                  SELECT * FROM stu WHEREscore>= ALL(SELECT score FROM level);----大於等於內層查詢的最大值

        e)      INSERT… SELECT:

                INSERT user1(name) SELECT nameFROM user;

        f)       CREATE… SELECT:

                CREATE TABLE user1(

                  id tinyint unsigned auto_increment key,

                  name varchar(20) unique

               )engine=innodb charset=utf8 select id,name from emp;

        g)      INSERT tb_name SET col_name=(SELECT…);

                    INSERT user2 SET name=(SELECT name FROM user WHERE id=1);

2、 聯合查詢

        a)        UNION:會去掉表中的重複記錄

                SELECT 字段名稱… FROM tb1_name

                UNION

                SELECT 字段名稱… FROM tb2_name;

        b)        UNION ALL:簡單的合併

                SELECT 字段名稱… FROM tb1_name

                UNION ON

                SELECT 字段名稱… FROM tb2_name;

3、 自身連接查詢:無限級分類

    //無限級分類表設計

CREATE TABLE cate(

    id SMALLINT UNSIGNED AUTO_INCREMENT KEY,

    cateName VARCHAR(40) NOT NULL UNIQUE,

    pId SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父id'

)ENGINE=INNODB CHARSET=UTF8;

 

INSERT cate(cateName) VALUES('服裝'),

('數碼'),

('玩具');

 

INSERT cate(cateName, pId)VALUES('男裝',1),

('女裝',1),

('內衣',1);

 

INSERT cate(cateName, pId)VALUES('電視',2),

('冰箱',2),

('洗衣機',2);

 

 

INSERT cate(cateName, pId)VALUES('愛馬仕',3),

('LV',3),

('GUCCI',3);

 

INSERT cate(cateName, pId)VALUES('夾克',4),

('襯衫',4),

('褲子',4);

 

INSERT cate(cateName, pId) VALUES('液晶電視',10),

('等離子電視',10),

('背投電視',10);

 

//查詢各個分類的父分類

SELECT s.id, s.cateName ASsCateName, p.cateName AS pCateName FROM cate AS s

LEFT JOIN cate AS p

ON s.pId=p.id;

 

//查詢父分類下有哪些子分類

SELECT p.id, p.cateName AS pCateName, s.cateName AS sCateName FROM cate AS s

RIGHT JOIN cate AS p

ON s.pId=p.id;

 

//統計各分類下的條數

SELECT p.id, p.cateName AS pCateName, COUNT(s.cateName) FROM cate AS s

RIGHT JOIN cate AS p

ON s.pId=p.id

GROUP BY p.cateName

ORDER BY id;

 

//統計各分類下的條數,及顯示詳細信息

SELECT GROUP_CONCAT(s.id),GROUP_CONCAT(s.cateName) AS sCateNames, COUNT(s.cateName), p.cateName AS pCateName FROM cate AS s

LEFT JOIN cate AS p

ON s.pId=p.id

GROUP BY p.cateName;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章