前者学数据库之多表操作,mysql学习笔记查询

前方的话

  上一篇博文中介绍了子查询的连锁内容,最终大家将查询结果存款和储蓄到3个新的数量表中。上面大家将接着子查询的案例,详细介绍数据库中的多表操作

 

前方的话

  上1篇博文中牵线了子查询的相关内容,最终大家将查询结果存储到二个新的数量表中。下边大家将接着子查询的案例,详细介绍数据库中的多表操作

 

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

×

MySQL学习笔记-子查询和一而再,mysql学习笔记查询

MySQL学习笔记-子查询和连接
  使客户端进入gbk编码情势展现:

mysql> SET NAMES gbk;

 

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

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

 

其中SELECT * FROM t一 称为Outer
Query / Outer Statement (外部查询) SELECT col二 FROM t二 ,
被称之为SubQuery  (子查询)   子查询的标准化: 子查询指嵌套在询问内部
,且务必始终出现在圆括号内。 子查询能够包含七个至关心保养要字或标准,
               
如:DISTINCT,GROUP BY,O奇骏DEBMWX伍 BY,LIMIT函数等。 子查询的表面查询能够是:SELECT ,
INSERT , UPDATE , SET 或 DO   子查询的重返值: 子查询能够重回标量、一行、一列或子查询
  贰.运用相比运算符的子查询
使用相比运算符的子查询:
=、>、<、>=、<=、<>、!=、
<=> 语法结构: operand(操作数)、comparison_operator
(比较运算符)、subquery(子查询) 用ANY  、SOME
或ALL修饰的可比运算符 operand comparison_operator ANY
(subquery) operand
comparison_operator SOME (subquery) operand comparison_operator ALL
(subquery) 997755.com澳门葡京 1
  一.语法结构  操作数 
相比运算符 any(子查询)             操作数  比较运算符
some(子查询)             操作数  比较运算符
all(子查询) 贰.契合于子查询有多个结实 叁.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; 

 

997755.com澳门葡京 2

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

 

997755.com澳门葡京 3
  查询超极本的列表,按价格升序排列:

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

 

997755.com澳门葡京 4

  • 询问比超极本的最低价格高的列表,按价格降序的办法排列:

mysql> SELECT * FROM tdb_goods WHERE goods_price > ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本') ORDER BY goods_price DESC;

 

997755.com澳门葡京 5

  • 前者学数据库之多表操作,mysql学习笔记查询。查询比超极本的最高价格高的列表,按价格降序的措施排列:

mysql> SELECT * FROM tdb_goods WHERE goods_price > ALL(SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本') ORDER BY goods_price DESC;

 

997755.com澳门葡京 6
  3.使用[NOT]IN/EXISTS引发的子查询
子查询格局: 一.选取IN的子查询 贰.选用[NOT]IN的子查询   语法结构:operand
comparison_operator [NOT] IN (subquery)   =ANY 运算符与IN
等效,!=ALL或<>ALL运算符与NOT IN等效 三.应用[NOT]EXISTS的子查询(用的争论较少)
 
假设实查询重临任何行,EXISTS将赶回TRUE,不然为FALSE 例,查找不是超极本的货色列表:

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

 

997755.com澳门葡京 7
    四.应用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 | 超级本              |
+---------+---------------------+

 

伍.多表更新
多表更新:

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

 

其中,table_references即一连的语法结构
  连接类型: INNECRUISER JOIN,内连接    在MySQL中,JOIN,CROSS JOIN和INNE中华VJOIN是等价的 LEFT
[OUTER] JOIN,左外连接 昂CoraIGHT [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;

 

997755.com澳门葡京 8
  陆.多表更新之一步到位
CREATE…SELECT 创造数据表同时将查询结果写入到数据表(合并了CREATE
和 INSERT…SELECT多个操作步骤)

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

 

例:创设品牌分类数据表tdb_goods_brand,并将tdb_goods表中的brand_997755.com澳门葡京 ,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;

 

997755.com澳门葡京 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;

 

997755.com澳门葡京 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子句中,
那样的子查询必须给予别名。  
八.内连接INNE猎豹CS陆 JOIN
INNELacrosse JOIN,内连接 在MySQL中,JOIN,CROSS JOIN 和 INNELX570JOIN 是等价的 LEFT
[OUTER] JOIN,左外连接 奥德赛IGHT [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;

 

997755.com澳门葡京 11
    九.外连接OUTE奥迪Q3JOIN 左外连接
997755.com澳门葡京 12

  • 来得左表的壹切笔录及右表符合连接条件的笔录

  • 例,查看符合左外连接的笔录,表中出现商品表的任何和二表表都某些记录,那正是左外连接(那里商品表为左表,分类表为右表)

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;

 

997755.com澳门葡京 13
   

  • 右外连接

997755.com澳门葡京 14
 

  • 来得右表的一切记下及左表符合连接条件的笔录

  • 例,查看符合右外连接的笔录,表中出现品牌表的任何和二表表都有个别记录,这便是右外连接(那里商品表为左表,分类表为右表)

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;

 

  997755.com澳门葡京 15
  拾.多表连接 /**     多表的连年跟两张表的连年一样 
表的总是实质就是外键的逆向约束 */ 例,查看符合内三番五次的记录,表中只出现商品表和品牌表都有的记录,这正是内接连的多表连接(那里商品表为左表,品牌表和分类表为右表):

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;

 

997755.com澳门葡京 16
  1一.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 |
+---------+-----------------+-----------+-------------+

 

1壹.多表删除

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;

 

1二.复制记录
复制编号为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);

 

997755.com澳门葡京 17

MySQL学习笔记-子查询和一连 使客户端进入gbk编码方式突显: mysql SET NAMES
gbk; 一.子查询 子查…

计划工作

  在上1篇博文,我们将详细数据存储到tdb_goods数据表中,将详细数据中的种类音讯存储到tdb_goods_cates数据表中

997755.com澳门葡京 18

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

 

安不忘危工作

  在上1篇博文,大家将详见数据存储到tdb_goods数据表中,将详细数据中的系列新闻存款和储蓄到tdb_goods_cates数据表中

997755.com澳门葡京 19

  接下去,我们要研究什么通过tdb_goods_cates数据表来更新tdb_goods表

 

目录

[1]桑土策动工作 [2]多表更新 [3]两步更新[4]连接[5]不过级表

多表更新

  多表更新类似于单表更新

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的值。那样1来,用数字代表字符串,不小地节约了仓库储存空间

997755.com澳门葡京 20

 

多表更新

  多表更新类似于单表更新

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的值。那样壹来,用数字代表字符串,相当大地节约了积累空间

997755.com澳门葡京 21

 

目前的话

  上壹篇博文中介绍了子查询的连锁内容,最终我们将查询结果存储到3个新的数量表中。上边大家将接着子查询的案例,详细介绍数据库中的多表操作

 

两步更新

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

  假设选拔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;

997755.com澳门葡京 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;

997755.com澳门葡京 23

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

997755.com澳门葡京 24

  这里要留心的是,两张表中,同时设有brand_name这一个字段。要区分它们,需求给它们起不一样的外号或在字段后边加入表名

997755.com澳门葡京 25

  查看商品数据表的列结构,大家开采,就算数额被修改为了数字,但数据类型照旧是字符型

997755.com澳门葡京 26

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

997755.com澳门葡京 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');

997755.com澳门葡京 28

 

两步更新

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

  固然选择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;

997755.com澳门葡京 29

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

997755.com澳门葡京 30

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

997755.com澳门葡京 31

  那里要留心的是,两张表中,同时设有brand_name这些字段。要分别它们,须求给它们起分歧的别名或在字段前边加入表名

997755.com澳门葡京 32

  查看商品数据表的列结构,我们发掘,尽管数额被涂改为了数字,但数据类型依然是字符型

997755.com澳门葡京 33

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

997755.com澳门葡京 34

  那样,大家早就将1个大的多寡表分为小的数据表进行仓库储存了。今后,分别在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');

997755.com澳门葡京 35

 

预备干活

  在上1篇博文,大家将详细数据存款和储蓄到tdb_goods数据表中,将详细数据中的体系消息存款和储蓄到tdb_goods_cates数据表中

997755.com澳门葡京 36

  接下去,我们要切磋怎么通过tdb_goods_cates数据表来更新tdb_goods表

 

连接

  通过地点的操作,已经把重复的数量分散到分歧的数据表中开展仓库储存了,尽也许的节约存款和储蓄空间了。不过,显示时,却须求把原本的数额显示出来,那就必要利用上边要介绍的定义——连接

语法结构

  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)、右外连接(PRADOIGHT [OUTER] JOIN)

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

连日来条件

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

内连接

  内接连彰显左表及右表符合连接条件的笔录

997755.com澳门葡京 37

  上边通过内接二连三来询问全部商品的详细信息,原来商品表中有2四件货色,但只呈现出二三件,因为那1件不适合连接条件

997755.com澳门葡京 38

997755.com澳门葡京 39  

  关于内接连,有以投注意:使用内连接查找的笔录在连接数据表中不存在,并且在WHERE子句中尝试一下操作:column_name
IS NULL 。如果 column_name 被钦赐为 NOT
NULL,MySQL将在找到符合连接着标准的记录后停下搜索更加多的行(查找争辩)

左外连接

  左外连接指展现左表的百分之百记下及右表符合连接条件的笔录

997755.com澳门葡京 40

  上面通过左外连接来询问全体商品的详细新闻,原来商品表中有二四件物品,未来也显得出二四件,但最终壹件货品的分类为NULL,那是因为右表的那三个分拣不符合条件,所以展现为NULL

997755.com澳门葡京 41

右外连接

  右外接连指展现右表的成套记录及左表符合连接条件的记录

997755.com澳门葡京 42

  上面通过右外连接来询问全部商品的详细音信,原来商品表中有二四件货品,现在呈现出贰六件,多出去的是契合右表但不适合左表的记录

997755.com澳门葡京 43

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

A LEFT JOIN B join_condition

  数据表B的结果集依赖于数据表A,数据表A的结果集依照左连接条件信赖全数数据表(B表除此而外)

  左外连接条件决定哪些寻觅数据表B(在未有点名WHERE条件的状态下)

  假如数量表A的某条记下符合WHERE条件,可是在数量表B不设有符合连接条件的记录,将生成一个装有列为空的附加的B行

多表连接

  叁张表以上的连日称为多表连接,原理与两张表的连年同样

  上面通过内接连完毕查询全数商品的详细音讯

997755.com澳门葡京 44

 

连接

  通过地点的操作,已经把重复的多寡分散到区别的数据表中实行仓库储存了,尽可能的节约存储空间了。可是,呈现时,却需求把本来的数目展现出来,那就要求运用上边要介绍的定义——连接

语法结构

  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)、右外连接(帕杰罗IGHT [OUTER] JOIN)

  在mysql中,JOIN、CROSS JOIN 和 INNE奥德赛 JOIN是等价的

连接条件

  使用ON关键字来设定连接条件,也足以使用WHERE来代替。一般地,使用ON关键字来设定连接条件,使用WHERE关键字张开结果集记录的过滤

内连接

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

997755.com澳门葡京 45

  下边通过内接连来查询全数商品的详细音信,原来商品表中有二四件商品,但只呈现出贰三件,因为那壹件不切合连接条件

997755.com澳门葡京 46

997755.com澳门葡京 47  

  关于内一而再,有以投注意:使用内连续查找的笔录在一而再数据表中不设有,并且在WHERE子句中品尝一下操作:column_name
IS NULL 。如果 column_name 被钦点为 NOT
NULL,MySQL将在找到适合连接着标准的记录后终止找寻越来越多的行(查找争论)

左外连接

  左外连接指展现左表的壹体笔录及右表符合连接条件的记录

997755.com澳门葡京 48

  上面通过左外连接来询问全数商品的详细音讯,原来商品表中有二四件货品,未来也出示出24件,但聊起底一件货色的分类为NULL,那是因为右表的那3个分拣不符合条件,所以体现为NULL

997755.com澳门葡京 49

右外连接

  右外接连指显示右表的全数笔录及左表符合连接条件的记录

997755.com澳门葡京 50

  上边通过右外连接来查询全数商品的详细消息,原来商品表中有二4件商品,现在体现出26件,多出来的是吻合右表但不切合左表的笔录

997755.com澳门葡京 51

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

A LEFT JOIN B join_condition

  数据表B的结果集信赖于数据表A,数据表A的结果集依据左连接条件依赖全体数据表(B表除却)

  左外连接条件决定哪些寻觅数据表B(在尚未点名WHERE条件的事态下)

  如若数量表A的某条记下符合WHERE条件,不过在多少表B不设有符合连接条件的记录,将生成3个存有列为空的附加的B行

多表连接

  叁张表以上的延续称为多表连接,原理与两张表的连天一样

  上边通过内连接达成查询全部商品的详细音讯

997755.com澳门葡京 52

 

多表更新

  多表更新类似于单表更新

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的值。那样壹来,用数字代表字符串,一点都不小地节约了仓库储存空间

997755.com澳门葡京 53

 

可是级表

997755.com澳门葡京 54

  上海教室中是tdb_goods_cates表的笔录。但实质上的分类并非那10类,而是Infiniti分类。上面来介绍Infiniti分类的数据表的贯彻

  Infiniti级表至少必要八个列,一个是种类id,3个类型名称,3个是父级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
); 

  然后,写入加以数据

997755.com澳门葡京 55

本身连接

  自个儿连接指同三个数据表对其自身实行连接。为作区分,须要加多小名。字表小名定义为s,父表别称定义为p

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

997755.com澳门葡京 56

  下边来搜寻全数分类及其子类

997755.com澳门葡京 57

  下边来寻觅全部分类及其子类的数额

997755.com澳门葡京 58

去除重复项

  从记录中,能够见到二四条记下中存在重新的项,今后要想办法把重复的项删除

997755.com澳门葡京 59

  首先,先查找到重复的项

997755.com澳门葡京 60

  然后,供给动用多表删除来落到实处删除操作

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

997755.com澳门葡京 61

极端级表

997755.com澳门葡京 62

  上海体育场合中是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
); 

  然后,写入加以数据

997755.com澳门葡京 63

本身连接

  本身连接指同1个数据表对其本身实行连续。为作区分,需求加多外号。字表小名定义为s,父表小名定义为p

  上面来搜寻全体分类及其父类

997755.com澳门葡京 64

  下边来搜索所有分类及其子类

997755.com澳门葡京 65

  上边来查找全部分类及其子类的数额

997755.com澳门葡京 66

剔除重复项

  从记录中,可以看出二四条记下中留存双重的项,今后要想艺术把重复的项删除

997755.com澳门葡京 67

  首先,先查找到重复的项

997755.com澳门葡京 68

  然后,必要使用多表删除来得以完结删除操作

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

997755.com澳门葡京 69

两步更新

  在上头的多表更新的操作中,实际上我们通过了八个步骤,先创建了二个空表,将原数据表的询问结果写入空表,再利用写入结果的表反向立异原数据表

  假如运用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;

997755.com澳门葡京 70

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

997755.com澳门葡京 71

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

997755.com澳门葡京 72

  那里要专注的是,两张表中,同时设有brand_name那么些字段。要区分它们,需求给它们起分裂的别称或在字段前面参与表名

997755.com澳门葡京 73

  查看商品数据表的列结构,我们开掘,纵然数额被修改为了数字,但数据类型依然是字符型

997755.com澳门葡京 74

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

997755.com澳门葡京 75

  那样,大家已经将三个大的多寡表分为小的数据表进行仓储了。现在,分别在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');

997755.com澳门葡京 76

 

连接

  通过下边包车型大巴操作,已经把重复的数量分散到分歧的数据表中进行仓库储存了,尽大概的节约存款和储蓄空间了。可是,显示时,却需求把原来的多少展现出来,那就须要动用下边要介绍的概念——连接

语法结构

  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宝马X5 JOIN)、左外连接(LEFT [OUTER]
JOIN)、右外连接(讴歌RDXIGHT [OUTER] JOIN)

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

一而再条件

  使用ON关键字来设定连接条件,也得以运用WHERE来取代。一般地,使用ON关键字来设定连接条件,使用WHERE关键字展开结果集记录的过滤

内连接

  内连接展现左表及右表符合连接条件的笔录

997755.com澳门葡京 77

  上面通过内接连来询问全体商品的详细新闻,原来商品表中有24件商品,但只呈现出23件,因为那1件不符合连接条件

997755.com澳门葡京 78

997755.com澳门葡京 79  

  关于内接连,有以投注意:使用内连接查找的记录在连续数据表中不设有,并且在WHERE子句中品尝一下操作:column_name
IS NULL 。如果 column_name 被钦命为 NOT
NULL,MySQL将要找到适合连接着标准的记录后停止找寻更加多的行(查找争辩)

左外连接

  左外连接指呈现左表的整套笔录及右表符合连接条件的笔录

997755.com澳门葡京 80

  上边通过左外连接来查询全部商品的详细消息,原来商品表中有2肆件商品,以往也出示出24件,但结尾壹件货品的归类为NULL,那是因为右表的那1个分类不符合条件,所以显得为NULL

997755.com澳门葡京 81

右外连接

  右外接连指呈现右表的全方位笔录及左表符合连接条件的记录

997755.com澳门葡京 82

  上边通过右外连接来查询全数商品的详细音讯,原来商品表中有2四件商品,现在体现出26件,多出来的是相符右表但不切合左表的笔录

997755.com澳门葡京 83

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

A LEFT JOIN B join_condition

  数据表B的结果集依赖于数据表A,数据表A的结果集依照左连接条件重视全数数据表(B表除此而外)

  左外连接条件决定哪些寻觅数据表B(在一向不点名WHERE条件的状态下)

  要是数额表A的某条记下符合WHERE条件,然而在数量表B不设有符合连接条件的记录,将生成1个兼有列为空的附加的B行

多表连接

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

  下边通过内接二连三落成查询全数商品的详细音信

997755.com澳门葡京 84

 

无限级表

997755.com澳门葡京 85

  上海体育场所中是tdb_goods_cates表的笔录。但实在的分类并非那拾类,而是无限分类。下边来介绍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
); 

  然后,写入给定数据

997755.com澳门葡京 86

本人连接

  本人连接指同1个数据表对其本人举行一而再。为作区分,供给加多小名。字表外号定义为s,父表别称定义为p

  上面来搜寻全部分类及其父类

997755.com澳门葡京 87

  上边来搜求全部分类及其子类

997755.com澳门葡京 88

  下边来搜寻全体分类及其子类的数码

997755.com澳门葡京 89

删去重复项

  从记录中,能够旁观二四条记下中存在重新的项,以后要想办法把重复的项删除

997755.com澳门葡京 90

  首先,先查找到重复的项

997755.com澳门葡京 91

  然后,须求动用多表删除来促成删除操作

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

997755.com澳门葡京 92

目录
[1]准备专门的学问 [2]多表更新 [3]两步更新[4]连接[5]无限级表 前边的话
上一篇博文中牵线了子查询的…

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website