mysql sql语句里连接符的使用_在mysql数据库中——连接的使用

连接

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号较大的条目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值