连接
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子句中,这样的子查询必须为其赋予别名
连接类型
Inner join ,内连接
在mysql中,join,cross join 和inner join是等价的。
Left 【outer】 join ,左外连接
Right 【outer】 join , 右外连接
连接条件
使用on关键字来设定连接条件,也可以使用where来代替。
通常使用on关键字来设定连接条件,使用where关键字进行结果集记录的过滤。
内连接:显示左表以及右表符合连接条件的记录
Eg:select goods_id , goods_name , brandName from tdb_goods as b inner join tdb_goods_name as d on b.brand_id = d.name_id;
左外连接
显示左表的全部记录及右表符合连接条件的记录
右外连接
显示右表的全部记录及左表符合连接条件的记录
表的连接
可以说就是外键的一种逆向操作,外键将数据分开来存储,通过连接又将多张表联系在一起
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
INNER JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;
外连接
A left join b join_condition
数据表B的结果集依赖数据表A。
数据表A的结果结果集左连接条件依赖所有数据表(B表除外)
左外连接条件决定如何检索数据表B(在没有指定where条件的情况下)。
如果数据表A的某条记录符合where条件,但是在数据表B不存在符合连接条件的记录,将生成一个所有列为空的额外B行。
如果使用内连接查询的记录在连接数据表中不存在,并且在where子句中尝试一下操作:col_name is null时,如果col_name被定义为not null,mysql将在找到符合连接条件的记录后停止搜索更多的行。
显示表结构:show clumns from 表名;
无限分类:即在同一张表中既有父类,又有子类
通过在分类表中再增加多一个字段标识其属于哪一个父类的 ID 来实现
可以通过对同一张数据表的自身连接来进行查询,需要对表标识别名
查找显示父级id对应的名称
SELECT s.type_id ,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types 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 p.type_id=s.parent_id;
查找有多少子级
SELECT p.type_id ,p.type_name,COUNT(s.type_name) child_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON p.type_id=s.parent_id GROUP BY p.type_name ORDER BY p.type_id;
(1)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);
(2)查找重复记录
SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2;
(3) 删除重复记录
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;
delete t1 //从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 //t1和t2的连接条件
where t1.goods_id>t2.goods_id; //删除id号较大的条目
共同学习,写下你的评论
评论加载中...
作者其他优质文章