设为首页 加入收藏

TOP

又是周六了-MySQL特训(二)
2017-10-10 09:51:02 】 浏览:3319
Tags:又是 周六 -MySQL 特训
er','server/Work station','Dell','5388',DEFAULT,DEFAULT);

INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Mac Pro MD878CH/A Professional Desktop','server/Work station','Apple','28888',DEFAULT,DEFAULT);

INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W Headset Display Device','Laptop accessory','Sony','6999',DEFAULT,DEFAULT);

INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Business Backpage','Laptopaccessory','Sony','99',DEFAULT,DEFAULT);

INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X3250 M4 server 2583i14','server/Work station','IBM','6888',DEFAULT,DEFAULT);

INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Xuanlong Laptop Radiator','Laptop accessory','Windgod','',DEFAULT,DEFAULT);

INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W Headset Display Device','Laptop accessory','Sony','6999',DEFAULT,DEFAULT);

INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Business Backpage','Laptop accessory','Sony','99',DEFAULT,DEFAULT);

---INSERT...SELECT

INSERT [INTO] tbl_name [(col_name)] SELECT

使用的时候就这样,创建一个新的表

CREATE TABLE IF NOT EXISTS cates(

cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

cate_name VARCHAR(40) NOT NULL

);

然后把原数据表中的东西有选择性的插入进来

INSERT INTO CATES(CATE_NAME) SELECT GOODS_CATE FROM GOODS GROUP BY GOODS_CATE;

如果需要根据目录表cates,来更新我们的参数表——多表更新

----多表更新

--多步

UPDATE table_ref SET col_name=... ...

其中,ref是表的参照关系

这里有连接关系,INNER JOIN LEFT JOIN 等

最简单的是INNER,内连接

mysql> UPDATE GOODS INNER JOIN CATES ON GOODS_CATE=CATE_NAME
-> SET GOODS_CATE=CATE_ID;

(请原谅我不想打小写的了。。)

解释一下:更新goods这张表,内连接cates这张表,在什么条件呢——goods_cate=cate_name,设定的值是什么呢,是cates这张表中的cate_id

mysql> SELECT * FROM GOODS\G; 验证一下

--一步

CREATE...SELECT...

即创建表的同时写入连接的数据

这里的例子是:对品牌做连接更新

mysql> SELECT BRAND_NAME FROM GOODS GROUP BY BRAND_NAME;

mysql> CREATE TABLE IF NOT EXISTS brands(
-> brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> brand_name VARCHAR(40) NOT NULL
-> )
-> SELECT BRAND_NAME FROM GOODS GROUP BY BRAND_NAME;

就可以省去INSERT的操作了

但是这时候更新要出错

mysql> UPDATE GOODS INNER JOIN BRANDS ON BRAND_NAME=BRAND_NAME
-> SET BRAND_NAME=BRAND_ID;
ERROR 1052 (23000): Champ: 'BRAND_NAME' dans field list est ambigu

因为名字一样,要改字段,或者起别名AS

mysql> UPDATE GOODS AS G INNER JOIN BRANDS AS B ON G.BRAND_NAME=B.BRAND_NAME
-> SET G.BRAND_NAME=BRAND_ID;

虽然实现了外表的更新,但是,比如说goods_cate的类型还是varchar,而我们其实希望主表中,它是int类型的。这时候由于需要修改字段名以及数据类型,用ALTER CHANGE

mysql> ALTER TABLE GOODS
-> CHANGE GOODS_CATE CATE_ID SMALLINT UNSIGNED NOT NULL,
-> CHANGE BRAND_NAME BRAND_ID SMALLINT UNSIGNED NOT NULL;

这种外键称为事实外键,比foreign key的物理外键还要多

----连接

由于我们实现了多表的存储,但是由于显示等需求,要求多个表联动,需要用到连接

数据表参照ref:tbl_name [[AS] alias] | table_subquery [AS] alias

---INNER JOIN

使用ON来设定连接条件,WHERE一般做进一步的筛选

内连接,仅显示符合连接条件的记录

 SELECT GOODS_ID,GOODS_NAME,CATE_NAME FROM GOODS INNER JOIN CATES ON GOODS.CATE_ID=CATES.CATE_ID;

翻译一下:选取goods表中的goods_id,goods_name,cate_name字段,但是显示的时候,需要内连接cates表(因为我们不想显示的是类型的数字表示),条件是当两者的cate_id字段相等;这里由于cate_i

首页 上一页 1 2 3 4 5 6 下一页 尾页 2/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Yii2的深入学习--yii\base\Object.. 下一篇离职了,一切从头开始

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目