Mysql开发技巧(1)join的使用

本文详细介绍了SQL中的连接类型,包括内连接、左外连接、右外连接和全连接的概念及用法,并提供了实际的SQL语句示例。此外,还分享了如何利用JOIN操作优化查询效率的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一:内连接:取两个表的公共部分
内连接inner join:
 select a.user_name,a.over,b.over from user1 a join user2 b on a.user_name=b.user_name;

二:左外连接

例如:select A.内容,B.内容 from A left join B ON a.key=b.key where b.key is null。选择只在A不在B的部分
 
 
三:右外连接

 
 
 
 
四:全连接
MySQL 中 不会支持 full join

      解决方法:采用左连接和右连接结合+ union all 方法来取得两表的合集
      select a.user_name , a.over , b.over 
      from user1 a
      left join user2 b on a.user_name = b.user_name
      union all
      select b.user_name , b.over, a.over
      from user1 a
      right join user2 b on a.user_name = b.user_name


五:笛卡尔积



使用技巧(1):联合更新
update user1 set over=‘齐天大圣’ where user1.user_name in (
select b.user_name from user1 a join user2 b on a.user_name = b.user_name);
ERROR 1093错误 不能更新from语句中出现的表字段
解决办法:
通过使用join进行联合更新
update user1 a join select b.user_name from user1 a join user2 b on a.user_name = b.user_name) b on a.user_name = b.user_name set a.over=‘齐天大圣’;


使用技巧二:join优化子查询技巧:
一般子查询写法:(数据小时,没有多大影响,如果数据量大时,则要消耗大量的查询)
select a.user_name , a.voer , (select over from user2 where a.user_name = b,user_name) as over2
from user1 a;
如果这两张表的记录相当多 那么这个子查询相当于对A标的每一条记录都要进行一次子查询。

join优化(左连接)后的写法:
select a.user_name , a.over , b.over from user1 a
left join user2 b on a.user_name = b.user_name


使用技巧三:使用join + having优化聚合子查询:
select a.user_name,b.timestr,b.kills from user1 a
join user_kills b on a.id = b.user_id 
join user_kills c on c.user_id = b.user_id
group by a.user_name,btimestr,b.kills
having b.kills = max(c.kills);
使用技巧四分组选择
SELECT d.user_name ,c.timestr,kills FROM
(SELECT user_id ,timestr ,kills ,(
SELECT COUNT(*) FROM user_kills b WHERE b.user_id = a.user_id AND a.kills >= b.kills) AS cnt 
FROM user_kills a GROUP BY user_id,timestr,kills) c 
JOIN user1 d ON c.user_id = d.id WHERE cnt <= 2


MySQL中,视图(View)是一种虚拟,它基于SQL查询的结果集。视图不存储数据本身,而是存储查询的定义。每次访问视图时,数据库都会执行定义视图的查询,并返回结果集。视图在数据库开发中有许多优点,以下是一些MySQL开发技巧: ### 1. 创建视图 使用`CREATE VIEW`语句可以创建一个视图。例如,假设有一个名为`employees`的,包含员工的信息: ```sql CREATE VIEW employee_view AS SELECT id, name, department FROM employees; ``` ### 2. 查询视图 视图可以像普通一样进行查询: ```sql SELECT * FROM employee_view; ``` ### 3. 更新视图 可以使用`CREATE OR REPLACE VIEW`语句来更新视图的定义: ```sql CREATE OR REPLACE VIEW employee_view AS SELECT id, name, department, salary FROM employees; ``` ### 4. 删除视图 使用`DROP VIEW`语句可以删除一个视图: ```sql DROP VIEW IF EXISTS employee_view; ``` ### 5. 视图的优点 - **简化复杂查询**:视图可以将复杂的SQL查询封装起来,使查询更加简洁。 - **提高安全性**:通过视图可以限制用户访问数据的范围,只暴露必要的数据。 - **数据抽象**:视图可以隐藏底层的结构,提供一个抽象层,使应用程序不受结构变化的影响。 ### 6. 示例 假设有一个`orders`和一个`customers`,可以通过视图将客户信息和订单信息结合起来: ```sql CREATE VIEW customer_orders AS SELECT c.name, o.order_id, o.order_date FROM customers c JOIN orders o ON c.customer_id = o.customer_id; ``` ### 7. 使用视图进行数据过滤 视图可以用于数据过滤,例如,只显示特定部门的信息: ```sql CREATE VIEW hr_employees AS SELECT id, name, department FROM employees WHERE department = 'HR'; ``` ### 8. 视图的局限性 - **性能问题**:复杂的视图查询可能会影响性能。 - **更新限制**:并非所有视图都可以更新,决于视图的定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值