sql命令(五)-子查询与连接

set names gbk ;客户端以GBK的编码显示数据(只影响客户端显示的数据,并不影响真实的显示数据)

数据准备:

  -- 创建数据表


  CREATE TABLE IF NOT EXISTS tdb_goods(
    goods_id    SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    goods_name  VARCHAR(150) NOT NULL,
    goods_cate  VARCHAR(40)  NOT NULL,
    brand_name  VARCHAR(40)  NOT NULL,
    goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0,
    is_show     BOOLEAN NOT NULL DEFAULT 1,
    is_saleoff  BOOLEAN NOT NULL DEFAULT 0
  );


 -- 写入记录


 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('R510VC 15.6英寸笔记本','笔记本','华硕','3399',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Y400N 14.0英寸笔记本电脑','笔记本','联想','4899',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('G150TH 15.6英寸游戏本','游戏本','雷神','8499',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X550CC 15.6英寸笔记本','笔记本','华硕','2799',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X240(20ALA0EYCD) 12.5英寸超极本','超级本','联想','4999',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('U330P 13.3英寸超极本','超级本','联想','4299',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('SVP13226SCB 13.3英寸触控超极本','超级本','索尼','7999',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad mini MD531CH/A 7.9英寸平板电脑','平板电脑','苹果','1998',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版)','平板电脑','苹果','3388',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版)','平板电脑','苹果','2788',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('IdeaCentre C340 20英寸一体电脑 ','台式机','联想','3499',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Vostro 3800-R1206 台式电脑','台式机','戴尔','2899',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iMac ME086CH/A 21.5英寸一体电脑','台式机','苹果','9188',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('AT7-7414LP 台式电脑 (i5-3450四核 4G 500G 2G独显 DVD 键鼠 Linux )','台式机','宏碁','3699',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Z220SFF F4F06PA工作站','服务器/工作站','惠普','4288',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('PowerEdge T110 II服务器','服务器/工作站','戴尔','5388',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Mac Pro MD878CH/A 专业级台式电脑','服务器/工作站','苹果','28888',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);


 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);


 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X3250 M4机架式服务器 2583i14','服务器/工作站','IBM','6888',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('玄龙精英版 笔记本散热器','笔记本配件','九州风神','',DEFAULT,DEFAULT);


 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);


 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);



1,比较运算引发的子查询(出现在其他sql语句内的select子句

SELECT avg(goods_price) from tdb_goods;  //计算tdb_goods表中字段goods_price的平均值

SELECT ROUND(avg(goods_price),2) from tdb_goods;//计算tdb_goods表中字段goods_price的平均值,并且四舍五入到小数点后面2位

SELECT * from tdb_goods where goods_price >= (SELECT ROUND(avg(goods_price),2) from tdb_goods);  //查询表中goods_price  大于平均值的记录

2,any,some,all

sql命令(五)-子查询与连接_第1张图片

 //查询价格大于或等于"超级本"价格的商品,并且按价格降序排列 (因为子查询查出的超基本有几条数据,               因此any的意思是,只要价格大于或等于其中一条都可以)

SELECT goods_id,goods_name,goods_price FROM tdb_goods 
WHERE goods_price = ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本')
ORDER BY goods_price DESC;


   3,  = ANY 或 = SOME 等价于 IN   (效果和上面的那条SQL一样)
SELECT   SELECT goods_id,goods_name,goods_price FROM tdb_goods 
WHERE goods_price IN (SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本')
ORDER BY goods_price DESC; 

  4,    使用insert 。。。select 插入记录 (将查询的结果写入到数据表)

select goods_cate from tdb_goods GROUP BY goods_cate //查出表中有多少分类

insert tdb_goods_cates(cate_name) SELECT goods_cate from tdb_goods GROUP BY goods_cate;   //将查询出来的分类,插入数据分类表tdb_goods_cates中的字段cate_name

 5,多表更新(参照tdb_goods_cates 表更新tdb_goods 表

 //将表tdb_goods中的goods_cate(原先是中文的描述,现在映射成为tdb_goods_cates 表中的id,该id对应的cate_name 就是中文类别描述) 修改成tdb_goods_cates 表中的cate_id

UPDATE tdb_goods INNER JOIN tdb_goods_cates on goods_cate = cate_name SET
goods_cate = cate_id;  

6,多表更新一步到位(创建数据表的同时,将输入插入到数据表)

//创建表tdb_goods_brands ,并且将tdb_goods 表中的brand_name 分组,然后插入到tdb_goods_brands 中
CREATE TABLE tdb_goods_brands (
brand_id SMALLINT UNSIGNED PRIMARY KEY auto_increment,
brand_name VARCHAR (40) NOT NULL
) SELECT brand_name FROM tdb_goods GROUP BY brand_name;

//tdb_goods 表中的brand_name 参照tdb_goods_brands 表中的brand_name更新,AS可以给表取别名

UPDATE tdb_goods as g
INNER JOIN tdb_goods_brands as b ON g.brand_name = b.brand_name
SET g.brand_name = b.brand_id;

7,内连接inner join(多张表查询,为用户呈现可读字段),使用on来设定连接条件

sql命令(五)-子查询与连接_第2张图片

内连接:只显示A表和B表中的数据的交集部分

//连接两张表,将表tdb_goods goods_cate 在表tdb_goods_cates 对应的cate_name 查询出来

SELECT goods_id, goods_name,cate_name from tdb_goods INNER JOIN tdb_goods_cates
on tdb_goods.goods_cate = tdb_goods_cates.cate_id;

8,外连接(分为左外连接和右外连接)

a,左外连接

sql命令(五)-子查询与连接_第3张图片

SELECT goods_id, goods_name,cate_name from tdb_goods left JOIN tdb_goods_cates
on tdb_goods.goods_cate = tdb_goods_cates.cate_id;

sql命令(五)-子查询与连接_第4张图片


SELECT goods_id, goods_name,cate_name from tdb_goods right JOIN tdb_goods_cates
on tdb_goods.goods_cate = tdb_goods_cates.cate_id;

9,多表连接()

// 查询所有商品的详细信息(通过内连接实现)
   SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g

   INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id

   INNER JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id;


10,无限级分类的设计(比如:大家电属于家用电器)

//数据准备

 CREATE TABLE tdb_goods_types(
     type_id   SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
     type_name VARCHAR(20) NOT NULL,
     parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
  ); 


  INSERT tdb_goods_types(type_name,parent_id) VALUES('家用电器',DEFAULT);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑、办公',DEFAULT);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('大家电',1);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('生活电器',1);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('平板电视',3);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('空调',3);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('电风扇',4);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('饮水机',4);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑整机',2);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑配件',2);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('笔记本',9);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('超级本',9);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('游戏本',9);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('CPU',10);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('主机',10);

sql命令(五)-子查询与连接_第5张图片

//查出上面这张表的子类以及子类对应的父类(没有父类的为null)



-- 查找所有分类及其父类


  SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS  p ON s.parent_id = p.type_id;
   
-- 查找所有分类及其子类


  SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS  s ON s.parent_id = p.type_id;


-- 查找所有分类及其子类的数目


  SELECT p.type_id,p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id;


-- 为tdb_goods_types添加child_count字段


  ALTER TABLE tdb_goods_types ADD child_count MEDIUMINT UNSIGNED NOT NULL DEFAULT 0;


-- 将刚才查询到的子类数量更新到tdb_goods_types数据表


  UPDATE tdb_goods_types AS t1 INNER JOIN ( SELECT p.type_id,p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p 


                                            LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id 
                             
                                            GROUP BY p.type_name 


                                            ORDER BY p.type_id ) AS t2 


  ON  t1.type_id = t2.type_id 


  SET t1.child_count = t2.children_count;




-- 复制编号为12,20的两条记录


  SELECT * FROM tdb_goods WHERE goods_id IN (19,20);




-- INSERT ... SELECT实现复制


  INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20);


-- 查找重复记录


  SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2;


-- 删除重复记录


  DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2  ON t1.goods_name = t2.goods_name  WHERE t1.goods_id > t2.goods_id;

你可能感兴趣的:(sql命令(五)-子查询与连接)