澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

子查询与连接,子查询和连接

2019-10-30 作者:数据库网络   |   浏览(113)

前方的话

  上意气风发篇博文中介绍了子查询的相关内容,最终大家将查询结果存储到贰个新的多少表中。上边大家将接着子查询的案例,详细介绍数据库中的多表操作

 

前端学数据库之多表操作,前端数据库

×

MySQL学习笔记-子查询和连接,mysql学习笔记查询

MySQL学习笔记-子查询和连接   使顾客端进入gbk编码方式展现:

mysql> SET NAMES gbk;

 

1.子查询 子查询的定义: 子查询(Subquery)是提出现在其余SQL语句内的SELECT子句。 举例:  

 SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2);

 

其中SELECT * FROM t1 称为Outer Query / Outer Statement (外界查询) SELECT col2 FROM t2 , 被誉为SubQuery  (子查询)   子查询的准则: 子查询指嵌套在查询内部 ,且必得始终出未来圆括号内。 子查询能够包含多个入眼字或条件,                 如:DISTINCT,GROUP BY,O奇骏DE奥迪Q5 BY,LIMIT函数等。 子查询的表面查询能够是:SELECT , INSERT , UPDATE , SET 或 DO   子查询的重返值: 子查询能够重回标量、风流倜傥行、一列或子查询   2.利用相比较运算符的子查询 使用比较运算符的子查询: =、>、<、>=、<=、<>、!=、 <=> 语法结构: operand(操作数)、comparison_operator (比较运算符)、subquery(子查询) 用ANY  、SOME 或ALL修饰的相比较运算符 operand comparison_operator ANY (subquery) operand comparison_operator SOME (subquery) operand comparison_operator ALL (subquery) 澳门新萄京官方网站 1   1.语法结构  操作数  相比运算符 any(子查询)             操作数  比较运算符 some(子查询)             操作数  比较运算符 all(子查询) 2.符合于子查询有五个结果 3.any 和some结果相近 all与any、some 相反   例,从tdb_goods表中 查询平平均价值格,小数点保留2位,:

mysql> SELECT ROUND(avg(goods_price),2) AS avg_price FROM tdb_goods;
 ----------- 
| avg_price |
 ----------- 
|   5391.30 |
 ----------- 

 

查询平均价格以上的物品:

mysql> SELECT * FROM tdb_goods WHERE goods_price > 5391.30; 

 

澳门新萄京官方网站 2

mysql> SELECT * FROM tdb_goods WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);

 

澳门新萄京官方网站 3   查询超极本的列表,按价格升序排列:

mysql> SELECT * FROM tdb_goods WHERE goods_cate = '超级本' ORDER BY goods_price ASC; 

 

澳门新萄京官方网站 4

  • 询问比超极本的最实惠位高的列表,按价格降序的不二诀窍排列:
mysql> SELECT * FROM tdb_goods WHERE goods_price > ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本') ORDER BY goods_price DESC;

 

澳门新萄京官方网站 5

  • 查询比超极本的最高价格高的列表,按价格降序的办法排列:
mysql> SELECT * FROM tdb_goods WHERE goods_price > ALL(SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本') ORDER BY goods_price DESC;

 

澳门新萄京官方网站 6   3.使用[NOT]IN/EXISTS引发的子查询 子查询格局: 1.施用IN的子查询 2.运用[NOT]IN的子查询   语法结构:operand comparison_operator [NOT] IN (subquery)   =ANY 运算符与IN 等效,!=ALL或<>ALL运算符与NOT IN等效 3.行使[NOT]EXISTS的子查询(用的争执少之甚少)   倘诺实查询重临任何行,EXISTS将回到TRUE,不然为FALSE 例,查找不是超极本的物品列表:

mysql> SELECT * FROM tdb_goods WHERE goods_cate NOT IN(SELECT goods_cate FROM tdb_goods WHERE goods_cate = '超级本');

 

澳门新萄京官方网站 7     4.接受INSERT...SELECT插入记录 例:在tdb_goods_cates表中插入tdb_goods表中的goods_cate分类;

mysql> INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
mysql> SELECT * FROM tdb_goods_cates;
 --------- --------------------- 
| cate_id | cate_name           |
 --------- --------------------- 
|       1 | 台式机              |
|       2 | 平板电脑            |
|       3 | 服务器/工作站       |
|       4 | 游戏本              |
|       5 | 笔记本              |
|       6 | 笔记本配件          |
|       7 | 超级本              |
 --------- --------------------- 

 

5.多表更新 多表更新:

UPDATE table_references SET col_name1={expr1|DEFAULT}
[,col_name2={expr2|DEFAULT}]...
[WHERE where_condition]

 

其中,table_澳门新萄京官方网站,references即三回九转的语法结构   连接类型: INNE凯雷德 JOIN,内连接    在MySQL中,JOIN,CROSS JOIN和INNE凯雷德JOIN是等价的 LEFT [OUTER] JOIN,左外连接 景逸SUVIGHT [OUTER] JOIN,右外连接   连接—语法结构

table_reference
{[INNER | CROSS] JOIN |{LEFT|RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr

 

例,将tdb_goods中的goods_cate更新为tdb_goods_cate表中的对应cate_id。 

mysql> UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name SET goods_cate = cate_id;

 

澳门新萄京官方网站 8   6.多表更新之一步到位 CREATE...SELECT 创立数据表同临时间将查询结果写入到数据表(合併了CREATE 和 INSERT...SELECT三个操作步骤)

CREATE TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
select_statement

 

例:创制牌子分类数据表tdb_goods_brand,并将tdb_goods表中的brand_name写入

mysql> CREATE TABLE tdb_goods_brand(
    -> brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    -> brand_name VARCHAR(40) NOT NULL
    -> )
    -> SELECT brand_name FROM tdb_goods GROUP BY brand_name;

 

澳门新萄京官方网站 9

  • 例,将tdb_goods中的brand_name更新为tdb_goods_brand表中的对应brand_id。错误写法(程序分别不出哪个brand_name属于哪个表):
mysql> UPDATE tdb_goods INNER JOIN tdb_goods_brand ON brand_name = brand_name SET brand_name = brand_id;
ERROR 1052 (23000): Column 'brand_name' in field list is ambiguous

 

解决措施是给表起外号:

mysql> UPDATE tdb_goods AS a INNER JOIN tdb_goods_brand AS b ON a.brand_name = b.brand_name SET a.brand_name = b.brand_id;

 

澳门新萄京官方网站 10

  • 查询tdb_goods的数据表结构
mysql>  DESC tdb_goods;
 ------------- ------------------------ ------ ----- --------- ---------------- 
| Field       | Type                   | Null | Key | Default | Extra          |
 ------------- ------------------------ ------ ----- --------- ---------------- 
| goods_id    | smallint(5) unsigned   | NO   | PRI | NULL    | auto_increment |
| goods_name  | varchar(150)           | NO   |     | NULL    |                |
| goods_cate  | varchar(40)            | NO   |     | NULL    |                |
| brand_name  | varchar(40)            | NO   |     | NULL    |                |
| goods_price | decimal(15,3) unsigned | NO   |     | 0.000   |                |
| is_show     | tinyint(1)             | NO   |     | 1       |                |
| is_saleoff  | tinyint(1)             | NO   |     | 0       |                |
 ------------- ------------------------ ------ ----- --------- ---------------- 

 

goods_cate和brand_name任然是varchar,今后大家更改字段名goods_cate为cate_id,brand_name修改为brand_id,  为了节约空间,大家修正数据类型为smallant

mysql> ALTER TABLE tdb_goods;
    -> CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,
    -> CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;
mysql> DESC tdb_goods;

 ------------- ------------------------ ------ ----- --------- ---------------- 
| Field       | Type                   | Null | Key | Default | Extra          |
 ------------- ------------------------ ------ ----- --------- ---------------- 
| goods_id    | smallint(5) unsigned   | NO   | PRI | NULL    | auto_increment |
| goods_name  | varchar(150)           | NO   |     | NULL    |                |
| cate_id     | smallint(5) unsigned   | NO   |     | NULL    |                |
| brand_id    | smallint(5) unsigned   | NO   |     | NULL    |                |
| goods_price | decimal(15,3) unsigned | NO   |     | 0.000   |                |
| is_show     | tinyint(1)             | NO   |     | 1       |                |
| is_saleoff  | tinyint(1)             | NO   |     | 0       |                |
 ------------- ------------------------ ------ ----- --------- ---------------- 

 

7.接二连三的语法结构 连接在MySQL在SELECT语句、多表更新、多表删除语句中援救JOIN操作。

table_reference
{[INNER|CROSS] JOIN|{LEFT|RIGHT}[OUTER]JOIN}
table_reference
ON conditional_expr 

 

数据表参照 table_reference tbl_name [[AS] alias] | table_subquery [AS] alias 数据表能够应用tbl_name AS alias_name 或tbl_name alias_name 授予外号 table_subquery能够当做子查询使用FROM子句中, 那样的子查询必需予以小名。   8.内连接INNELacrosse JOIN INNEGL450 JOIN,内连接 在MySQL中,JOIN,CROSS JOIN 和 INNEOdysseyJOIN 是等价的 LEFT [OUTER] JOIN,左外连接 RAV4IGHT [OUTER] JOIN,右外连接 连接条件: 使用ON关键字来设定连接条件,也能够运用WHERE来替代日常接纳ON关键字来设定连接条件 使用WHERE关键字展开结果集记录的过滤   内连接和外接连的分别 内连接 ,显示左表及右表符合连接条件的笔录,即交集 比如 插入几条记下 -- 分别在tdb_goods_cates和tdb_goods_brands表插入记录

INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');
INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神舟');

 

-- 在tdb_goods数据表写入任性记

INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');

 

例,查看切合内接连的记录,表中只现出商品表和品牌表皆有的记录,那就是内接连(这里商品表为左表,分类表为右表):

mysql> SELECT goods_id,goods_name,cate_name,goods_price FROM tdb_goods
-> INNER JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;

 

澳门新萄京官方网站 11     9.外连接OUTEXC90JOIN 左外连接 澳门新萄京官方网站 12

  • 展现左表的方方面面笔录及右表切合连接条件的笔录
  • 例,查占卜符左外连接的记录,表中出现商品表的漫天和2表表都有个别记录,那正是左外连接(这里商品表为左表,分类表为右表)
mysql> SELECT goods_id,cate_name,goods_price FROM tdb_goods 
LEFT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;

 

澳门新萄京官方网站 13    

  • 右外连接

澳门新萄京官方网站 14  

  • 来得右表的方方面面记下及左表符合连接条件的笔录
  • 例,查看切合右外连接的笔录,表中现身品牌表的全方位和2表表皆某个记录,那便是右外连接(这里商品表为左表,分类表为右表)
mysql> SELECT goods_id,goods_name,cate_name,goods_price FROM tdb_goods 
RIGHT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;

 

  澳门新萄京官方网站 15   10.多表连接 /**     多表的一而再跟两张表的连天相似  表的连年实质便是外键的逆向节制 */ 例,查六柱预测符内一而再三回九转的笔录,表中只现身商品表和牌子表皆有的记录,这正是内一而再一而再再而三的多表连接(这里商品表为左表,品牌表和分类表为右表):

mysql> SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods
    -> INNER JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id
    -> INNER JOIN tdb_goods_brand ON tdb_goods.brand_id = tdb_goods_brand.brand_id;

 

澳门新萄京官方网站 16   11.Infiniti级分类表设计 自个儿连接  

  • 例,查找全体分类及其父类:
mysql> 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;
 --------- ----------------- ----------------- 
| type_id | type_name       | type_name       |
 --------- ----------------- ----------------- 
|       1 | 家用电器        | NULL            |
|       2 | 电脑、办公      | NULL            |
|       3 | 大家电          | 家用电器        |
|       4 | 生活电器        | 家用电器        |
|       5 | 平板电视        | 大家电          |
|       6 | 空调            | 大家电          |
|       7 | 电风扇          | 生活电器        |
|       8 | 饮水机          | 生活电器        |
|       9 | 电脑整机        | 电脑、办公      |
|      10 | 电脑配件        | 电脑、办公      |
|      11 | 笔记本          | 电脑整机        |
|      12 | 超级本          | 电脑整机        |
|      13 | 游戏本          | 电脑整机        |
|      14 | CPU             | 电脑配件        |
|      15 | 主机            | 电脑配件        |
 --------- ----------------- ----------------- 

 

  • 例,查找全部分类及其子类:
mysql> 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; 
 --------- ----------------- -------------- 
| type_id | type_name       | type_name    |
 --------- ----------------- -------------- 
|       1 | 家用电器        | 大家电       |
|       1 | 家用电器        | 生活电器     |
|       2 | 电脑、办公      | 电脑整机     |
|       2 | 电脑、办公      | 电脑配件     |
|       3 | 大家电          | 平板电视     |
|       3 | 大家电          | 空调         |
|       4 | 生活电器        | 电风扇       |
|       4 | 生活电器        | 饮水机       |
|       5 | 平板电视        | NULL         |
|       6 | 空调            | NULL         |
|       7 | 电风扇          | NULL         |
|       8 | 饮水机          | NULL         |
|       9 | 电脑整机        | 笔记本       |
|       9 | 电脑整机        | 超级本       |
|       9 | 电脑整机        | 游戏本       |
|      10 | 电脑配件        | CPU          |
|      10 | 电脑配件        | 主机         |
|      11 | 笔记本          | NULL         |
|      12 | 超级本          | NULL         |
|      13 | 游戏本          | NULL         |
|      14 | CPU             | NULL         |
|      15 | 主机            | NULL         |
 --------- ----------------- -------------- 

 

  • 例,查找全部分类及其子类的数额
mysql> SELECT p.type_id,p.type_name,COUNT(s.type_name) 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;
 --------- ----------------- -------------------- 
| type_id | type_name       | COUNT(s.type_name) |
 --------- ----------------- -------------------- 
|       1 | 家用电器        |                  2 |
|       2 | 电脑、办公      |                  2 |
|       3 | 大家电          |                  2 |
|       4 | 生活电器        |                  2 |
|       5 | 平板电视        |                  0 |
|       6 | 空调            |                  0 |
|       7 | 电风扇          |                  0 |
|       8 | 饮水机          |                  0 |
|       9 | 电脑整机        |                  3 |
|      10 | 电脑配件        |                  2 |
|      11 | 笔记本          |                  0 |
|      12 | 超级本          |                  0 |
|      13 | 游戏本          |                  0 |
|      14 | CPU             |                  0 |
|      15 | 主机            |                  0 |
 --------- ----------------- -------------------- 

 

  • 为tdb_goods_types添加child_count字段
mysql> UPDATE tdb_goods_types AS t1 INNER JOIN
    -> (SELECT p.type_id,p.type_name,count(s.type_name) AS child_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.child_count;

mysql> SELECT * FROM tdb_goods_types;
 --------- ----------------- ----------- ------------- 
| type_id | type_name       | parent_id | child_count |
 --------- ----------------- ----------- ------------- 
|       1 | 家用电器        |         0 |           2 |
|       2 | 电脑、办公      |         0 |           2 |
|       3 | 大家电          |         1 |           2 |
|       4 | 生活电器        |         1 |           2 |
|       5 | 平板电视        |         3 |           0 |
|       6 | 空调            |         3 |           0 |
|       7 | 电风扇          |         4 |           0 |
|       8 | 饮水机          |         4 |           0 |
|       9 | 电脑整机        |         2 |           3 |
|      10 | 电脑配件        |         2 |           2 |
|      11 | 笔记本          |         9 |           0 |
|      12 | 超级本          |         9 |           0 |
|      13 | 游戏本          |         9 |           0 |
|      14 | CPU             |        10 |           0 |
|      15 | 主机            |        10 |           0 |
 --------- ----------------- ----------- ------------- 

 

11.多表删除

DELETE tbl_name[.*][,tbl_name[.*]]...
FROM table_references
[WHERE where_condition]

 

例,查找重复记录:

mysql> SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name having count(goods_name) >= 2;                
 ---------- ----------------------------- 
| goods_id | goods_name                  |
 ---------- ----------------------------- 
|       18 |  HMZ-T3W 头戴显示设备       |
|       19 | 商务双肩背包                |
 ---------- ----------------------------- 

 

剔除重复记录

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

 

12.复制记录 复制编号为19,20的两条记下

mysql>  SELECT goods_id,goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20);
 ---------- ------------------------------------ --------- ---------- 
| goods_id | goods_name                         | cate_id | brand_id |
 ---------- ------------------------------------ --------- ---------- 
|       19 | 商务双肩背包                       |       6 |        7 |
|       20 | X3250 M4机架式服务器 2583i14       |       3 |        1 |
 ---------- ------------------------------------ --------- ---------- 

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

 

澳门新萄京官方网站 17

MySQL学习笔记-子查询和一而再三回九转 使顾客端步向gbk编码方式呈现: mysql SET NAMES gbk; 1.子查询 子查...

数码企图

计划干活

  在上大器晚成篇博文,我们将详见数据存储到tdb_goods数据表中,将详细数据中的系列消息存款和储蓄到tdb_goods_cates数据表中

澳门新萄京官方网站 18

  接下去,大家要研商怎么通过tdb_goods_cates数据表来更新tdb_goods表

 

目录

[1]有备无患工作 [2]多表更新 [3]两步更新[4]连接[5]最为级表

回顾

笔录操作:
写操作:INSERT,UPDATE,DELETE
读取操作:SELECT

那章入眼学习:
子查询
连接
多表删除
多表更新

多少希图:
轻易易行的商场数据库

澳门新萄京官方网站 19

Paste_Image.png

tdb_good表结构:

澳门新萄京官方网站 20

Paste_Image.png

插入数据:略(见下载文件中的”子查询.txt“)

小心编码情势,插入的时候是以utf8的花样插入的,彰显会乱码,这时候选取SET NAMES gbk;安装客商端的编码方式(不会潜移默化服务器)

多表更新

  多表更新相通于单表更新

UPDATE table_references SET col_name1={expr1|DEFAULT}
[,col_name2={expr2|DEFAULT}]...
[WHERE where_condition]

  表的参阅关系如下:

table_reference
{[INNER | CROSS] JOIN |{LEFT|RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr

  从结果中看出,tdb_goods数据表中goods_cate列中的值早就更新为tdb_goods_cates数据表中对应的cate_id的值。那样一来,用数字代表字符串,比相当的大地节约了积存空间

澳门新萄京官方网站 21

 

前方的话

  上大器晚成篇博文中介绍了子查询的连带内容,最后我们将查询结果存款和储蓄到二个新的数目表中。上边我们将接着子查询的案例,详细介绍数据库中的多表操作

 

子查询简要介绍

子查询:
子查询(Subquery)是提出现在此外SQL语句内的SELECT子句。
例如:
SELECT * FROM t1 WHERE col1= (SELECT col2 FROM t2);
其中SELECT * FROM t1,称为Outer Query/Outer Statement
SELECT col2 FROM t2,称为SubQuery

子查询指嵌套在查询内部,且必得一向出今后圆括号内。
子查询能够富含七个举足轻重字或标准,
如DISTINCT、GROUP BY、ORDER BY、LIMIT,函数等。
子查询的外围查询能够是:SELECT,INSERT,UPDATE,DELETE,SET或DO。

子查询中的外层查询是指SQL语句的统称,而不仅是SELECT(SQL:结构化查询语言)

子查询重临值:子查询能够再次回到标量、少年老成行、一列或子查询。

得到结果后就足以在INSERT,UPDATE,SELECT,DELETE等别的的SQL语句中使用

两步更新

  在地点的多表更新的操作中,实际上大家经过了七个步骤,先创制了三个空表,将原数据表的询问结果写入空表,再利用写入结果的表反向立异原数据表

  假诺选拔CREATE SELECT语句将得以达成两步更新,在创造数据表同不时间将查询结果写入到数据表(合併了CREATE和INSERT...SELECT三个操作步骤),再选取写入结果的表反向创新原数据表

CREATE TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
select_statement

  上边来拍卖原数据表tdb_goods中的品牌新闻,首先查询tdb_goods表的"品牌",并分组

SELECT brand_name FROM tdb_goods GROUP BY brand_name;

澳门新萄京官方网站 22

  将品牌音信放入新表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;

澳门新萄京官方网站 23

  再参照他事他说加以考查品牌表,更新原商品数据表

澳门新萄京官方网站 24

  这里要注意的是,两张表中,同不经常候设有brand_name这几个字段。要分别它们,要求给它们起不一样的外号或在字段前边加入表名

澳门新萄京官方网站 25

  查看商品数据表的列结构,大家发掘,固然数额被涂改为了数字,但数据类型仍是字符型

澳门新萄京官方网站 26

  上面修正商品数据表中goods_cate和brand_name的列名称和列类型

澳门新萄京官方网站 27

  那样,大家早就将八个大的数码表分为小的数据表举行仓库储存了。今后,分别在tdb_goods_cates和tdb_goods_brands表再插入几条新的笔录

INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');
INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神舟');

  在tdb_goods数据表也写入新的笔录

 INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');

澳门新萄京官方网站 28

 

策动干活

  在上生龙活虎篇博文,大家将详细数据存储到tdb_goods数据表中,将详细数据中的连串音信存款和储蓄到tdb_goods_cates数据表中

澳门新萄京官方网站 29

  接下去,大家要切磋怎么样通过tdb_goods_cates数据表来更新tdb_goods表

 

由比较运算符引发的子查询

子查询分类:
接受比较运算符的子查询
使用比较运算符的子查询(=、>、<、>=、<=、<>、!=、<=>)
语法结构:operand comparison_operator subquery

追寻平均价值
SELECT AVG(goods_price) FROM tdb_goods;
avg()聚合函数,和i有三个重临值,相仿的函数还大概有sum(),count(),max(),min()

SELECT ROUND(AVG(goods_price),2) FROM tdb_goods;#ROUND(AVG(goods_price),2)指的是对平均值进行四舍五入,最后保留l两位小数

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=5636.36;#选择价格大于平均价格(5636.36)的商品

将上两条查询合并:
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=(SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);#使用了比较运算符,而且使用了小括号

查询超极本类型的标价:
SELECT goods_price FROM tdb_goods WHERE goods_cate='超极本';

询问价格超越超极本价格的货物:
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>(SELECT goods_price FROM tdb_goods WHERE goods_cate='超极本';#错误,因为子查询中返回的不是一个数据而是三条记录,WHERE中应该告诉系统大于哪个数据

用ANY、SOME或ALL修饰的可比运算符

  • operand comparison_operator ANY (subquery)
  • operand comparison_operator SOM(subquery)
  • operand comparison_operator ALL(subquery)

ANY、SOME是等价的,只要切合当中的三个就行,ALL是要符合整个

ANY、SOME、ALL关键字:

澳门新萄京官方网站 30

Paste_Image.png

ANY演示:
`SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price> ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate='超极本');

ALL演示:
`SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price> ALL(SELECT goods_price FROM tdb_goods WHERE goods_cate='超极本');

等于ALL演示:
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price = ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate='超极本');#选择的其实就是子查询里查询的结果

连接

  通过下面的操作,已经把重复的数目分散到差别的数据表中展开仓储了,尽恐怕的节约存款和储蓄空间了。不过,突显时,却必要把原来的多寡彰显出来,这就须求使用上面要介绍的定义——连接

语法结构

  MySQL在SELECT语句、多表更新、多表删除语句中帮衬连接(JOIN)操作

table_reference
{[INNER | CROSS] JOIN |{LEFT|RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr

  数据表参照(table_reference)时,数据表能够运用tbl_name AS alias_name 或tbl_name alias_name付与小名

  table_subquery能够用作子查询使用在FROM子句中,那样的子查询必需为其予以小名

tbl_name[[AS] alias] | table_subquery [AS] alias

连天类型

  连接类型主要归纳内三翻五次(INNE福睿斯 JOIN)、左外连接(LEFT [OUTER] JOIN)、右外连接(LX570IGHT [OUTER] JOIN)

  在mysql中,JOIN、CROSS JOIN 和 INNEENCORE JOIN是等价的

连接条件

  使用ON关键字来设定连接条件,也能够使用WHERE来替代。通常地,使用ON关键字来设定连接条件,使用WHERE关键字展开结果集记录的过滤

内连接

  内连接呈现左表及右表相符连接条件的记录

澳门新萄京官方网站 31

  上边通过内连接来询问全数商品的详细音信,原本商品表中有24件商品,但只显示出23件,因为那生龙活虎件不适合连接条件

澳门新萄京官方网站 32

澳门新萄京官方网站 33  

  关于内接二连三,有以投注意:使用内三回九转查找的笔录在接二连三数据表中不设有,並且在WHERE子句中尝试一下操作:column_name IS NULL 。如果 column_name 被内定为 NOT NULL,MySQL就要找到切合连接着标准的记录后停下找出越来越多的行(查找冲突)

左外连接

  左外连接指显示左表的全部记下及右表切合连接条件的记录

澳门新萄京官方网站 34

  上边通过左外连接来询问全体商品的详细音讯,原本商品表中有24件商品,今后也显得出24件,但最后生龙活虎件物品的分类为NULL,那是因为右表的那贰个分类不相符条件,所以显得为NULL

澳门新萄京官方网站 35

右外连接

  右外接连指展现右表的所有的事记下及左表符合连接条件的笔录

澳门新萄京官方网站 36

  上边通过右外连接来询问全数商品的详细消息,原本商品表中有24件商品,将来来得出26件,多出去的是顺应右表但不合乎左表的笔录

澳门新萄京官方网站 37

  关于外接连,有以下几点注意,以左外连接为例

A LEFT JOIN B join_condition

  数据表B的结果集信任于数据表A,数据表A的结果集依照左连接条件信任全数数据表(B表除了那几个之外)

  左外连接条件决定如何搜索数据表B(在并没有一点名WHERE条件的景况下)

  若是数量表A的某条记下相符WHERE条件,可是在数量表B不设有切合连接条件的笔录,将生成多个存有列为空的额外的B行

多表连接

  三张表以上的总是称为多表连接,原理与两张表的连天相像

  上面通过内连接实现查询全体商品的详细音信

澳门新萄京官方网站 38

 

多表更新

  多表更新相似于单表更新

UPDATE table_references SET col_name1={expr1|DEFAULT}
[,col_name2={expr2|DEFAULT}]...
[WHERE where_condition]

  表的参谋关系如下:

table_reference
{[INNER | CROSS] JOIN |{LEFT|RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr

  从结果中看出,tdb_goods数据表中goods_cate列中的值早就更新为tdb_goods_cates数据表中对应的cate_id的值。那样一来,用数字代表字符串,非常的大地节约了积存空间

澳门新萄京官方网站 39

 

由[NOT] IN/EXISTS引发的子查询

使用[NOT] IN的子查询
语法结构:
operand comparison_operator [NOT] IN (subquery)=ANY 运算符与IN等效。
!=ALL或<>ALL运算符与NOT IN等效

演示:
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price <> ALL(SELECT goods_price FROM tdb_goods WHERE goods_cate='超极本');
等价于
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price NOT IN (SELECT goods_price FROM tdb_goods WHERE goods_cate='超极本');

使用[NOT] EXISTS的子查询
假如子查询再次来到任何行,EXISTS将回到TRUE;不然重临FALSE。

用的少之又少,子查询返回了结果EXISTS再次来到TRUE,不然重返FALSE

最为级表

澳门新萄京官方网站 40

  上海教室中是tdb_goods_cates表的记录。但事实上的分类实际不是那10类,而是Infiniti分类。上边来介绍Infiniti分类的数据表的落到实处

  Infiniti级表最少须求四个列,三个是项目id,一个品种名称,三个是父级id

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

  然后,写入子查询与连接,子查询和连接。加以数据

澳门新萄京官方网站 41

自家连接

  自己连接指同三个数据表对其本身举行三番两次。为作区分,须要增加别称。字表别称定义为s,父表外号定义为p

  上面来探索全部分类及其父类

澳门新萄京官方网站 42

  上面来查找全体分类及其子类

澳门新萄京官方网站 43

  上面来查找全部分类及其子类的多少

澳门新萄京官方网站 44

除去重复项

  从记录中,能够见到24条记下中设有重新的项,未来要想艺术把重复的项删除

澳门新萄京官方网站 45

  首先,先查找到重复的项

澳门新萄京官方网站 46

  然后,要求采纳多表删除来落实删除操作

DELETE tbl_name[.*][,tbl_name[.*]]...
FROM table_references
[WHERE where_condition]

澳门新萄京官方网站 47

两步更新

  在上边包车型地铁多表更新的操作中,实际上我们透过了多个步骤,先创建了三个空表,将原数据表的询问结果写入空表,再选取写入结果的表反向修正原数据表

  如果利用CREATE SELECT语句将得以兑现两步更新,在创立数据表同期将查询结果写入到数据表(合併了CREATE和INSERT...SELECT多个操作步骤),再使用写入结果的表反向立异原数据表

CREATE TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
select_statement

  上面来拍卖原数据表tdb_goods中的品牌新闻,首先查询tdb_goods表的"品牌",并分组

SELECT brand_name FROM tdb_goods GROUP BY brand_name;

澳门新萄京官方网站 48

  将品牌消息放入新表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;

澳门新萄京官方网站 49

  再参谋牌子表,更新原商品数据表

澳门新萄京官方网站 50

  这里要留意的是,两张表中,同期设有brand_name那些字段。要分别它们,须要给它们起不相同的别称或在字段前边插石英钟名

澳门新萄京官方网站 51

  查看商品数据表的列结构,大家开采,固然数额被退换为了数字,但数据类型仍是字符型

澳门新萄京官方网站 52

  上面改进商品数据表中goods_cate和brand_name的列名称和列类型

澳门新萄京官方网站 53

  那样,我们曾经将两个大的多少表分为小的数据表举办仓库储存了。以后,分别在tdb_goods_cates和tdb_goods_brands表再插入几条新的记录

INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');
INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神舟');

  在tdb_goods数据表也写入新的记录

 INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');

澳门新萄京官方网站 54

 

应用INSERT...SELECT插入记录

事先讲过INSERT 和 INSERT SET的区分是INSERT SET 能够使用子查询(SET 可以使XX=XX引发子查询)

tdb_goods表中有多数弊,存在这里超级多种新的音讯,如品牌有为数不菲索尼(Sony),分类中有大多台式机配件,字符串比数字占的字节数多,如若记录越来越多,数据表就能够越来越粗大,查找时进度就能变慢,最棒的主意是选拔外键,供给两张数据表。

创办分类表:

CREATE TABLE IF NOT EXISTS tdb_goods_cates(
cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
cate_name VARCHAR(40) NOT NULL
);

毫不一条一条分类的插入,应该使用子查询
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;#一共有7类,需要写入分类表中
行使INSERT...SELECT将查询写入数据表:

INSERT...SELECT
将查询结果写入数据表
INSERT [INTO] tbl_name [(col_name,...)] SELECT ...

实现:
INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;#不能省略插入表的列名,不用写VALUES
使用SELECT * FROM tdb_goods_cates;查看已经插入成功

唯独依旧未有应用外键,应该参照分类表来更新商品表

连接

  通过地点的操作,已经把重复的数目分散到差别的数据表中进行仓库储存了,尽大概的节约存款和储蓄空间了。但是,呈现时,却需求把原先的多少展现出来,那就要求选择下边要介绍的概念——连接

语法结构

  MySQL在SELECT语句、多表更新、多表删除语句中扶植连接(JOIN)操作

table_reference
{[INNER | CROSS] JOIN |{LEFT|RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr

  数据表参照(table_reference)时,数据表能够行使tbl_name AS alias_name 或tbl_name alias_name赋予小名

  table_subquery能够看作子查询使用在FROM子句中,那样的子查询必需为其授予小名

tbl_name[[AS] alias] | table_subquery [AS] alias

接连类型

  连接类型主要不外乎内接连(INNECRUISER JOIN)、左外连接(LEFT [子查询与连接,子查询和连接。OUTER] JOIN)、右外连接(RubiconIGHT [OUTER] JOIN)

  在mysql中,JOIN、CROSS JOIN 和 INNEPRADO JOIN是等价的

三回九转条件

  使用ON关键字来设定连接条件,也得以动用WHERE来取代。平日地,使用ON关键字来设定连接条件,使用WHERE关键字张开结果集记录的过滤

内连接

  内一而再三回九转显示左表及右表适合连接条件的笔录

澳门新萄京官方网站 55

  上边通过内三回九转来查询全数商品的详细音讯,原本商品表中有24件货色,但只展现出23件,因为那风度翩翩件不合乎连接条件

澳门新萄京官方网站 56

澳门新萄京官方网站 57  

  关于内接连,有以投注意:使用内连接查找的笔录在连年数据表中不设有,並且在WHERE子句中尝试一下操作:column_name IS NULL 。如果 column_name 被钦命为 NOT NULL,MySQL就要找到切合连接着标准的笔录后截至搜索更加多的行(查找冲突)

左外连接

  左外连接指显示左表的全方位记下及右表相符连接条件的笔录

澳门新萄京官方网站 58

  上边通过左外连接来查询全体商品的详细音信,原本商品表中有24件货品,未来也显得出24件,但提及底大器晚成件货品的归类为NULL,那是因为右表的那叁个分拣不切合条件,所以展示为NULL

澳门新萄京官方网站 59

右外连接

  右外接连指显示右表的总体记下及左表切合连接条件的记录

澳门新萄京官方网站 60

  上面通过右外连接来查询全数商品的详细消息,原本商品表中有24件货品,将来来得出26件,多出去的是适合右表但不相符左表的记录

澳门新萄京官方网站 61

  关于外接连,有以下几点注意,以左外连接为例

A LEFT JOIN B join_condition

  数据表B的结果集信赖于数据表A,数据表A的结果集依据左连接条件正视全体数据表(B表除了那么些之外)

  左外连接条件决定哪些找寻数据表B(在未有一些名WHERE条件的景况下)

  要是数额表A的某条记下符合WHERE条件,可是在多少表B官样文章符合连接条件的记录,将生成贰个富有列为空的附加的B行

多表连接

  三张表以上的总是称为多表连接,原理与两张表的一连相仿

  下边通过内一而再再而三完结查询全体商品的详细音讯

澳门新萄京官方网站 62

 

多表更新

UPDATE table_references
SET col_name1={expr1|DEFAULT}
[,col_name2={expr2|DEFAULT}]...
[WHERE where_condition]

CREATE...SELECT
开创数据表同期将查询结果写入到数据表
CREATE TABLE [ID NOT EXISTS] tbl_name
[(create_definition,...)]
select_statement

FROM子句中的子查询
语法结构
SELECT...FROM(subquery) [AS] name...
说明:
名称叫必选项,且子查询的列名称必须唯后生可畏。

连接
MySQL在SELECT语句、多表更新、多表删除语句中协理JOIN操作

表的连天条件,第一张表 连接类型 第二张表 连接条件
语法结构
table_reference
{[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr

表的参照能够给表付与小名也可以不付与别名

一而再类型
INNER JOIN,内连接
在MySQL中,JOIN,CROSS JOIN和INNE本田CR-V JOIN是等价的。
LEFT [OUTER] JOIN,左外连接
RIGHT [OUTER] JOIN,右外连接

UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name SET goods_cate = cate_id;#tdb_goods表中的goods_cate已经被更新

极端级表

澳门新萄京官方网站 63

  上海图书馆中是tdb_goods_cates表的记录。但实则的分类并不是这10类,而是Infiniti分类。下边来介绍无限分类的数据表的兑现

  Infiniti级表最少要求多少个列,一个是系列id,五个连串名称,三个是父级id

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

  然后,写入给定数据

澳门新萄京官方网站 64

笔者连接

  自个儿连接指同叁个数据表对其本人实行一而再。为作区分,须要增加外号。字表别称定义为s,父表小名定义为p

  上面来研究全部分类及其父类

澳门新萄京官方网站 65

  上面来搜索全体分类及其子类

澳门新萄京官方网站 66

  下面来寻觅全部分类及其子类的数目

澳门新萄京官方网站 67

删去重复项

  从记录中,可以看看24条记下中存在重新的项,现在要想艺术把重复的项删除

澳门新萄京官方网站 68

  首先,先查找到重复的项

澳门新萄京官方网站 69

  然后,必要使用多表删除来贯彻删除操作

DELETE tbl_name[.*][,tbl_name[.*]]...
FROM table_references
[WHERE where_condition]

澳门新萄京官方网站 70

目录 [1]计划专业 [2]多表更新 [3]两步更新[4]连接[5]Infiniti级表 前边的话 上后生可畏篇博文中介绍了子查询的...

多表更新之一步到位

如上更新操作参照其余表更新了本表,大器晚成共动用了三步:
1.创建表
2.通过应用INSERT...SELECT把记录写入新表
3.多表更新

把三步合併为一步:
可以应用CREATE...SELECT落成:
CREATE...SELECT
开创数据表同期将查询结果写入到数据表
CREATE TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
select_statement

将表中的品牌也单身出一张表,创立表的还要将查询的数据写入:

CREATE TABLE tdb_goods_brands(
brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
brand_name VARCHAR(49) NOT NULL
)
SELECT brand name FROM tdb_goods GROUP BY brand_name;

查看tdb_goods_brands表能够观察数据写入成功
还也会有一步应该参照品牌表更新商品表中的品牌:
UPDATE tdb_goods INNER JOIN tdb_goods_brands ON brand_name = brand_name SET brand_name = brand_id;#会报错,提示brand_name含义不明确,因为两张表中都有brand_name,系统不知道那两个brand_name是哪张表中的

要消除那一个标题,只可以给表起小名也许在字段前边加上表名
日常是给表起外号:
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;#更新成功
使用SELECT * FROM tdb_goodsG翻开表中的记录,看见表中的brand_name已经被更新

此时,使用SHOW COLUMNS FROM tdb_goods;查看表结构发掘表中的goods_cate和brand_name仍是varchar类型,表中的数字代表的是字符并非tdb_goods_cate和tdb_goods_brands中的id(数字型)

改善标结构:

ALTER TABEL tdb_goods
CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,
CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;

再使用SHOW COLUMNS FROM tdb_goods;查看表结构来看表结构早就改善成功goods_cate和brand_name修正成了数字类型

至于使用外键:不自然要动用FOLX570IGN KEY物理外键,能够用这种外键,称为事实外键,经常非常多选用事实外键,物理外键用的十分少

在分类表和品牌表中插入一些记下:

INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');
INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神舟');

布置多个例外的归类和七个不等的品牌

在商品表中插入记录:
INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');#此时插入数据成功,但是有一个小错误,goods_cate写的是12,但是tdb_goods_cate表中并没有id为12的分类
把表中的笔录查询出来展现出来,存款和储蓄时cate_id和brand_id存款和储蓄的是其它表中的id,呈现的时候就不能够如此直白显示了,应该显得商品品牌和归类并非id,那时就需求使用到延续了

连天的语法结构

连接:
MySQL在SELECT语句、多表更新语句中协理JOIN操作

两种连接:内一而再三番五次,左外连接,右外连接
A表 连接类型 B表 连接条件
语法结构
table_reference
{[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr

数据表参照:
table_reference
tbl_name [[AS] alias] | table_subquery [AS] alias
数据表能够行使tbl_name AS alias_name或tbl_name alias_name付与外号。
table_subquery能够用作子查询使用在FROM子句中,这样的子查询必得为其付与外号。

内连接INNER JOIN

连天类型:
INNER JOIN,内连接
在MySQL中,JOIN,CROSS JOIN和INNE索罗德 JOIN是等价的。
LEFT [OUTER] JOIN,左外连接
RIGHT [OUTER] JOIN,右外连接

接连几天条件:
利用ON关键字来设定连接条件,也得以动用WHERE来替代。
平时采纳ON关键字来设定连接条件,
应用WHERE关键字张开结果集记录的过滤。

内链接:彰显左表及右表切合连接条件的记录

澳门新萄京官方网站 71

内连接

实例:
SELECT goods_id,goods_name,cate_name FROM tdb_goods INNER JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate.id;
可以看出22条记下,并没有刚刚增加的第23条记下,因为第23条记下不符合连接条件,刚才加多的cate_id是12,在tdb_goods_cate表中并子虚乌有id为12的记录,並且恰恰新添长的多少个分类也绝非彰显出来,那就是内连接(两张表都会有的才会显得出来),仅展现相符连接条件的笔录

外连接OUTER JOIN

左外连接:显示左表的不论什么事记下及右表切合连接条件的记录

澳门新萄京官方网站 72

左外连接

演示:SELECT goods_id,goods_name,cate_name FROM tdb_goods LEFT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate.id;#OUTER可以写,也可以不写
取得23条记下,可是第23条记下的cate_name为空,左外连接指的是左表中的全体和右表中契合条件的,要是右表中一向不相符条件的会来得为NULL

右外连接:呈现右表的一切记下及左表契合连接条件的笔录

澳门新萄京官方网站 73

右外连接

演示:SELECT goods_id,goods_name,cate_name FROM tdb_goods RIGHT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate.id;#OUTER可以写,也可以不写
获得25条记下,未有了分外cate_id为12的记录,又多了三条分类的记录,右外连接指的是浮现右表中的全体和左表中符合连接条件的笔录

这两种连接中内接连用的想对非常多

多表连接

商品表中存在商品归类和品牌
兑现三张表的接连:
演示:

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;

能够看看那是有还原了大家最先原始的结果,不均等的是本次是经过多张表的总是完毕的,从前是经过一张表查询出来的

实在表的连天就像外键的逆向操作,外键把表分开积累,连接把多张表连接起来查询

有关连接的几点说明

A LEFT JOIN B join_condition

  • 多少表B的结果集信任数据表A。
  • 数量表A的结果集依据左连接条件正视全体数据表(B表除了这几个之外)。
  • 左外连接条件决定哪些搜索数据表B(在还没点名WHERE条件的情景下)。
  • 假使数据表A的某条记下切合WHERE条件,但是在数码表B子虚乌有适合连接条件的记录,将生成二个独具列为空的附加的B行。

查找到的结果为NULL可是含有约束NOT NULL的情事:
若是选用内接连查找的笔录在连年数据表中不设有,並且在WHERE子句中尝试以下操作:col_namd IS NULL时,如果col_name被定义为NOT NULL,MySQL将要找到符合连接施行尺度的记录后停下找寻更加的多的行。

十二万分极分类表设计

查看tdb_goods_cates表的记录,这几个分类远远达不到现实中分类的须求,超级多网址中,那几个分类有许多级分类,一流分类、二级分类、三级分类……这种分类正是最棒分类,数据表应该什么设计,能够设计超级多张表,随着分类的加码,表的数码也会稳步扩张,查找起来就不便宜了,所以,常常都应用在表中加进父分类的id字段完毕:

实例:

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
);#parent_id为父分类的id,为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);

那正是说难点来了:如何询问那张表

能够由此本身连接查询:
本人连接:同三个数据表对其本人进行一而再

演示演示:
一张表做自己连接必定要起别称,要不就分不清那多个生龙活虎律名称的字段从哪来的了
想像一下有两张相仿的表,左边是父表,右侧是子表
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;#就可以查到子类的id,子类的名字以及父类的名字

追寻子类,父类以至父类下的子类:
侧面是子表,左侧是父表
SELECT p.type_id,p.type_name,s.typename FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id;
含有重复的父类,使用GROUP BY分组:
SELECT p.type_id,p.type_name,s.typename 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 ;
能够看见独有16个分类了,依照id排序:

SELECT p.type_id,p.type_name,s.typename 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;

不用子类的名字,须求子类的数量:

SELECT p.type_id,p.type_name,count(s.typename) AS child_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;

就足以看出子类的数额了

多表删除

DELETE tbl_name[.] [,tbl_name[.]]...
FROM table_references
[WHERE where_condition]

使用SELECT * FROM tdb_goods;翻开表中的笔录,看见第18、19和第21、22条记下是重复的,那是,想要把重复的记录删除,保留id相当的小的记录。
能够由此多表删除实现,也正是利用一张表模拟两张表实现
演示:
SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name;#从23条记录中得到了21个商品,因为有些记录是相同的

大家只想要雷同商品名称超越三个以上的记录
SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING COUNT(goods_name) > 1;#得到重复商品的记录,这就是我们将要删除或者要保留的记录
能够经过那张表来删除原表中的数据:
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;

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:子查询与连接,子查询和连接

关键词: