博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
慕课网--mysql开发技巧一 学习笔记
阅读量:6995 次
发布时间:2019-06-27

本文共 3349 字,大约阅读时间需要 11 分钟。

现在存在下面的两张表,表的结构如下所示

师徒四人表结构:

id,user_name,over
数据:
id user_name over
1 唐僧 旃檀功德佛
2 猪八戒 净坛使者
3 孙悟空 斗战胜佛
4 沙僧 金身罗汉

孙悟空朋友表结构:

id,user_name,over
数据:
id user_name over
1 孙悟空 成佛
2 牛魔王 被降服
3 蛟魔王 被降服
4 鹏魔王 被降服
5 狮驼王 被降服

over字段表示最后的成就

 

我们创建上面的两张表

CREATE TABLE `shitu` (  `id` tinyint(3) unsigned NOT NULL auto_increment,  `user_name` varchar(22) NOT NULL,  `over` varchar(22) NOT NULL,  PRIMARY KEY  (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `friend` (  `id` tinyint(4) NOT NULL auto_increment,  `user_name` varchar(22) default NULL,  `over` varchar(22) NOT NULL,  PRIMARY KEY  (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

左连接:

mysql> select a.user_name , a.over ,b.over       from  shitu  as a             left join  friend as b on a.user_name = b.user_name;  +-----------+------------+----------+| user_name | over       | over     |+-----------+------------+----------+| 唐僧      | 旃檀功德佛 | NULL     || 猪八戒    | 净坛使者   | NULL     || 孙悟空    | 斗战剩发   | 斗战胜佛 || 沙僧      | 金剩罗汉   | NULL     |+-----------+------------+----------+4 rows in set

inner join 连接:

mysql> select a.user_name , a.over ,b.over       from  shitu  as a              join  friend as b on a.user_name = b.user_name;  +-----------+----------+----------+| user_name | over     | over     |+-----------+----------+----------+| 孙悟空    | 斗战剩发 | 斗战胜佛 |+-----------+----------+----------+1 row in set

右连接

mysql> select a.user_name , a.over ,b.over       from  shitu  as a             right join  friend as b on a.user_name = b.user_name;  +-----------+----------+----------+| user_name | over     | over     |+-----------+----------+----------+| 孙悟空    | 斗战剩发 | 斗战胜佛 || NULL      | NULL     | 被降服   || NULL      | NULL     | 被降服   |+-----------+----------+----------+3 rows in set

 

9.   使用join从句更新表

 把同时存在于取经四人组和悟空兄弟表中的记录的人在取经四人表中的over字段更新为“齐天大圣”

1、第一步 首先取出两张表中都同时存在的人得到集合C

mysql> select a.user_name , a.over ,b.over from shitu as a join friend as b on a.user_name = b.user_name;

2、第二步:判断shitu表中那些人的人名在集合c中存在,如果存在将该记录更新成“齐天大圣”

上面是一种经典的设计思路,我们来看下面的代码

 
mysql> update      shitu  as  tmp1set     tmp1.over = '齐天大圣'where     tmp1.user_namein     (       select              a.user_name       from             shitu as a        join             friend as b        on            a.user_name = b.user_name                         );             1093 - You can't specify target table 'tmp1' for update in FROM clause
 

如何解决该问题了

增加一个临时表解决上面的问题

mysql> update      shitu  as  tmp1set     tmp1.over = '齐天大圣'where     tmp1.user_namein    (       select                   t2.user_name           from            (               select                      a.user_name               from                     shitu as a                join                     friend as b                on                    a.user_name = b.user_name                                ) as t2                )       ;  Query OK, 1 row affectedRows matched: 1  Changed: 1  Warnings: 0
mysql> select * from shitu;+----+-----------+------------+| id | user_name | over       |+----+-----------+------------+|  1 | 唐僧      | 旃檀功德佛 ||  2 | 猪八戒    | 净坛使者   ||  3 | 孙悟空    | 齐天大圣   ||  4 | 沙僧      | 金剩罗汉   |+----+-----------+------------+4 rows in set
 

 

 

参看博客:http://blog.csdn.net/fdipzone/article/details/52695371

上面这种代码比较复杂,可以进行优化,使用下面的代码进行优化,在数据量很大的时候上面的sql语句性能较低,可以使用下面的代码进行优化

 

 

 

转载于:https://www.cnblogs.com/kebibuluan/p/8117847.html

你可能感兴趣的文章
git常用方法整理
查看>>
MongoDB之HelloWord
查看>>
python 面向对象编程
查看>>
MySQL索引原理及慢查询优化
查看>>
jquery-bootgrid
查看>>
一个Redis实现的分布式锁
查看>>
Ehcache详细解读(转)
查看>>
简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)...
查看>>
Oracle存储过程详解(引用)+补充(转) dbms_output包 good
查看>>
关于eclipse和javac编译结果不一致的问题的分析与解决 (转)
查看>>
当magic_quotes_gpc=off
查看>>
expected an indented block
查看>>
批处理学习笔记6 - 重定向符>和>>
查看>>
js的等于号==的判断
查看>>
HtmlHelper用法大全
查看>>
在ASP.NET Core Web API上使用Swagger提供API文档
查看>>
OA项目之左导航
查看>>
UniDac 使用日记(转)
查看>>
Attach to process 的问题
查看>>
bash 的漏洞,你们中招了吗?
查看>>