mysql学习笔记(六)

一、子查询
1、定义:出现在其他SQL语句里面的查询语句叫做子查询
2、指嵌套在查询内部的查询,且始终出现在括号里面的查询
3、子查询可以包含如DISTINCT GROUP BY ORDER BY LIMIT
4、子查询的外层查询包括INSERT UPDATE SELECT等
5、子查询可以返回一个标量,一行,一列或是一个子查询
(一)使用比较运算引发的子查询
=,>,<,>=,<=,!=,<=>
SELECT AVG(goods_price) FROM tbl_goods;//AVG是一个聚合函数,就平均值
SELECT ROUND(AVG(goods_price),2) FROM tbl_goods;//ROUND是聚合函数,可以按小数的约定进行修约;
SELECT goods_id,goods_name,goods_price FROM tbl_goods WHERE goods_price>=(SELECT AVG(goods_price) FROM tbl_goods);
ANY SOME ALL:前两个差不多,对于大于号来说只要大于其中的一个好就好,取最小值,对于ALL来说取最大值。
(二)[NOT]IN 引发的子查询
=ANY 与IN等价
<>ALL ,!=ALL和NOT IN等价
SELECT goods_id,goods_name,goods_price FROM tbl_goods WHERE goods_price NOT IN (SELECT goods_price FROM tbl_price WHERE id=1);
(三)[NOT] EXISTS引发的子查询
如果有返会的话,就会返回TRUE,否则返回FALSE
(四)使用insert。。。select,把查询结果插入到新的数据表里面
INSERT INTO tbl_goods_cate(goods_cate) SELECT goods_cate FROM tbl_goods GROUP BY goods_cate;
(五)多表的更新;参照其他表来更新本表
1、
UPDATE tbl_goods INNER JOIN tbl_goods_cate ON tbl_goods.goods_cate=tbl_goods_cate.goods_cate SET tbl_goods.goods_cate=tbl_goods_cate.id;
2、直接使用CREATE..SELECT来在创建表的同时跟新表
CREATE TABLE IF NOT EXISTS tbl_goods_brand(
id TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
brand_name VARCHAR(50) NOT NULL
)
SELECT brand_name FROM tbl_goods GROUP BY brand_name;
二、连接
1、多表连接
注意由于版本的不同,使得在5.5中多表连接只能够用
SELECT goods_id,goods_price,cate_id FROM tbl_goods AS g
INNER JOIN (tbl_goods_cate AS c,tbl_goods_brand AS b)
ON (g.cate_id=c.id AND g.brand_id=b.id);
不能使用两条连续的INNER JOIN 来使用

2、a LEFT JOIN b condit
数据表b的结果集依赖于数据表a
数据表a根据左外连接依赖所有数据表(除表b)
左外连接条件决定如何检索b表
如果数据表a满足符合条件的WHERE子句,在数据表b不存在满足条件的记录,则会生成一个null行

3、无限分类数据表
一般至少包含三部分:id,type_name,parent-id;
4、自身连接
-- 查找所有分类及其父类

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;
-- 查找所有分类及其子类

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;

-- 查找所有分类及其子类的数目

SELECT p.type_id,p.type_name,count(s.type_name) AS children_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;
5、-- 将刚才查询到的子类数量更新到tdb_goods_types数据表

UPDATE tdb_goods_types AS t1 INNER JOIN ( SELECT p.type_id,p.type_name,count(s.type_name) AS children_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.children_count;
6、-- 删除重复记录

DELETE t1 FROM tbl_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tbl_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;
7、-- INSERT ... SELECT实现复制

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



三、注意点
1、SET NAMES char_set;可以使用这个命令来改变客户端的数据显示编码,而不会影响数据实际存储的编码方式

你可能感兴趣的:(mysql学习笔记)