MySQL学习笔记(九)多表更新

来源:互联网 发布:什么叫erp软件 编辑:程序博客网 时间:2024/05/22 23:39

1. 将查询结果写入数据表

INSET[INTO] tbl_name [(col_name,...)] SELECT ...

示例:

//创建保存商品种类的数据表tdb_goods_cates

CREATE TABLE IF NOT EXISTS tdb_goods_cates(

                               cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

                               cate_name VARCHAR(40) NOT NULL);

//将数据表tdb_goods中的商品按种类分组,并将分组结果保存在表tdb_goods_cates

INSERT INTO  tdb_goods_cates(cate_name) SELECT  goods_cate FROM  tdb_goods GROUP BY goods_cate;

//查看数据表tdb_goods_cates记录

SELECT * FROM  tdb_goods_cates

2. 参照分类表tdb_goods_cates更新商品表tdb_goods,主要更新其中的goods_cate字段

参考点

多表更新

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


//将参照分类表tdb_goods_cates更新商品表tdb_goods的语句如下

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

//显示商品表的记录

SELECT * FROM tdb_goods;

3.创建数据表同时将查询结果写入到数据表中

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

因此,一步实现将商品表tdb_goods中的品牌brand_name进行分组,并且保存到新创建的品牌表中tdb_goods_brands

CREATE TABLE tdb_goods_brands(

                           brand_idSMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

                           brand_name VARCHAR(40) NOT NULL

                           ) SELECT brand_name FROM tdb_goods GROUP BY brand_name;

//显示品牌表的记录

SELECT * FROM tdb_goods_brands;

//再将商品表中的品牌字段更新为品牌表中的索引

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

注意:上述也可以通过起别名来实现,如下所示

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;

//再次将商品表中的goods_cate和brand_name的列名和定义修改为cate_id和brand_id

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

//在种类表和品牌表中添加记录

INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');

 
INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神舟');


//在商品表中添加记录,因为种类表中没有12,因此有小错误,但是语法不会出错。

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


4. FROM子句中的查询

语法结构:SELECT... FROM (subquery) [AS] name;

说明:名称为选项,且子查询的列名称必须唯一

5.连接

MySQL在SELECT语句、多表更新、多表删除语句中支持JOIN操作。

语法结构:

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

6. 数据表参照:

table_references tbl_name [[AS]alias] | table_subquery [AS] alias;

数据表可使用tbl_name AS alias_nametbl_name alias_name赋予别名。table_subquery可做为子查询使用在FROM子句中,这样的子查询必须为其赋予别名

7. 连接类型

INNER JOIN为内连接,在MySQL中,JOIN、CROSS JOIN 和 INNER JOIN是等价的。

LEFT[OUTER] JOIN为左外连接,RIGHT[OUTER] JOIN为右外连接。

左连接是以左表为准,即左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表中不足的地方均为NULL。右连接与左连接恰好相反

8. 连接条件

使用ON关键字来设定连接条件,也可以使用WHERE来代替。通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果集记录的过滤。

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;

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;

0 0
原创粉丝点击