使用[NOT] IN引發的子查詢的語法結構:operand comparsion_operator [NOT] IN (subquery)。其中,=ANY運算
符與IN等價;!=ALL或<>ALL運算符與NOT IN等價。
例子:
1)查詢所有商品中價格等于超級本價格(任意1個)的商品SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price IN (SELECT
goods_price FROM tdb_goods WHERE goods_cate = '超級本');
2)查詢所有商品中價格不等于超級本價格(任意1個)的商品
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引發的子查詢的語法結構:operand comparsion_operator [NOT] EXISTS (subquery);如果子
查詢返回任何行,EXISTS將返回TRUE;否則返回FALSE。這類情況我們使用的比較少。
使用INSERT...SELECT插入記錄的語法結構:INSERT [INTO] table_name [(col_name,...)] SELECT ...;
1)先來創建1個數據表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
);
2)再對數據表tdb_goods中的記錄進行商品類型分類
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
3)將查詢的結果寫入到數據表tdb_goods_cates
INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROm tdb_goods GROUP BY goods_cate;
SELECT * FROM tdb_goods_cates;
4)參照商品分類表tdb_goods_cates的商品類型cate_id去更新商品表tdb_goods的商品類型(這里用到多表更新和
連接)
UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name SET goods_cate = cate_id;
SELECT goods_id,goods_cate FROM tdb_goods;
多表更新的語法結構:
UPDATE table_references SET col_name1={expr1|DEFAULT} [,col_name2={expr2|DEFAULT}] ... [WHERE
where_condition];
上述的例子就是多表更新。
我們在上面進行多表更新需要幾個步驟,我們可以將其幾個步驟結合在1起使用,也就是CREATE SELECT命
令哎創建數據表的同時將查詢結果直接寫入到指定的數據表中。
創建數據表同時將查詢結果寫入到數據表的語法結構:
CREATE TABLE [IF NOT EXISTS] table_name [(create_definition,...)] select_statement;
例子:
1)查找數據表tdb_goods中的商品品牌(不屬于步驟,只是1個簡單的查詢)
SELECT brand_name FROM tdb_goods GROUP BY brand_name;
2)創建數據表的同時寫入記錄:
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;
SHOW TABLES;
SELECT * FROM tdb_goods_brands;
3)參照數據表tdb_goods_brands中的brand_id去更新數據表tdb_goods中的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 goods_id,brand_name FROM tdb_goods;
到這里我們還有1個問題,就是更新了tdb_goods數據表中的goods_cate字段和brand_name字段,更新后的都
是數字類型的,而原來的是字符串型的,因此需要修改tdb_goods數據表中的那兩個字段名稱和數據類型。
1)查看tdb_goods數據表的表結構
DESC tdb_goods;
2)修改指定列的數據類型和字段名稱
ALTER TABLE tdb_goods
CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,
CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;
DESC tdb_goods;
修改以后的檢查操作
3)分別在tdb_goods_cates和tdb_goods_brands表插入記錄
INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交換機'),('網卡');
INSERT tdb_goods_brands(brand_name) VALUES('海爾'),('清華同方'),('神州');
4)在tdb_goods數據表中寫入任意記錄
INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES('LaserJet Pro P1606dn 黑白激光打印
機',12,4,1849);
我們看到寫入記錄的時候中的cate_id是12,而在數據表tdb_goods_cates中的cate_id不存在12,但是仍然可以插
入記錄,這是沒有使用外鍵束縛的結果。