设为首页 收藏本站
查看: 1275|回复: 0

[经验分享] mysql dba系统学习(23)必须明白的sql知识

[复制链接]

尚未签到

发表于 2018-10-17 13:01:30 | 显示全部楼层 |阅读模式
  必须明白的sql知识
  一,两表外连接查询
  现有两个表A,B内容如下
mysql> select * from A;  
+------+------+

  
|>  
+------+------+
  
|    1 | AA   |
  
|    2 | BB   |
  
|    3 | CC   |
  
+------+------+
  
3 rows in set (0.00 sec)
  
mysql> select * from B;
  
+------+------+

  
|>  
+------+------+
  
|    2 | DD   |
  
|    3 | EE   |
  
|    4 | FF   |
  
+------+------+
  
3 rows in set (0.01 sec)
  1,A表和B表左连接
  先将左表(A)数据查出,然后根据on后面的条件,将右表中凡是id与左表id相等的记录都查出来,与匹配的左表记录依次排成一行或多行,若无匹配的记录,则显示null。
mysql> select * from A left join B on A.id=B.id;  
+------+------+------+------+

  
|>  
+------+------+------+------+
  
|    1 | AA   | NULL | NULL |
  
|    2 | BB   |    2 | DD   |
  
|    3 | CC   |    3 | EE   |
  
+------+------+------+------+
  
3 rows in set (0.00 sec)

  
mysql> select A.id>  
+------+------+------+

  
|>  
+------+------+------+
  
|    1 | AA   | NULL |
  
|    2 | BB   | DD   |
  
|    3 | CC   | EE   |
  
+------+------+------+
  
3 rows in set (0.00 sec)
  下面的结果也是一样的
  
  
  2,A表和B表右连接
  先将右表(B)数据查出,然后根据on后面的条件,将左表中凡是id与右表id相等的记录都查出来,与匹配的左表记录依次排成一行或多行,若无匹配的记录,则显示null
mysql> select * from A right join B on A.id=B.id;  
+------+------+------+------+

  
|>  
+------+------+------+------+
  
|    2 | BB   |    2 | DD   |
  
|    3 | CC   |    3 | EE   |
  
| NULL | NULL |    4 | FF   |
  
+------+------+------+------+
  
3 rows in set (0.07 sec)

  
mysql> select A.id>  
+------+------+------+

  
|>  
+------+------+------+
  
|    2 | BB   | DD   |
  
|    3 | CC   | EE   |
  
| NULL | NULL | FF   |
  
+------+------+------+
  
3 rows in set (0.00 sec)
  3,A表和B表交叉连接
  没有用where子句的交叉连接将产生连接所涉及的笛卡尔积第一个表的行数乘以第二个表的行数等于笛卡尔积和结果集的大小。 Cross join 后面不能跟on 只能用where 。但是如果带返回或显示的是匹配的行数。不带条件where。
mysql> select *   from A cross join B  ;  
+------+------+------+------+
  
|>  
+------+------+------+------+
  
|    1 | AA   |    2 | DD   |
  
|    2 | BB   |    2 | DD   |
  
|    3 | CC   |    2 | DD   |
  
|    1 | AA   |    3 | EE   |
  
|    2 | BB   |    3 | EE   |
  
|    3 | CC   |    3 | EE   |
  
|    1 | AA   |    4 | FF   |
  
|    2 | BB   |    4 | FF   |
  
|    3 | CC   |    4 | FF   |
  
+------+------+------+------+
  
9 rows in set (0.00 sec)
mysql> select A.id>
+------+------+------+

  
|>  
+------+------+------+
  
|    2 | BB   | DD   |
  
|    3 | CC   | EE   |
  
+------+------+------+
  
2 rows in set (0.01 sec)
  这里还有一种交叉连接表示方法
mysql> select * from A,B ;  
+------+------+------+------+

  
|>  
+------+------+------+------+
  
|    1 | AA   |    2 | DD   |
  
|    2 | BB   |    2 | DD   |
  
|    3 | CC   |    2 | DD   |
  
|    1 | AA   |    3 | EE   |
  
|    2 | BB   |    3 | EE   |
  
|    3 | CC   |    3 | EE   |
  
|    1 | AA   |    4 | FF   |
  
|    2 | BB   |    4 | FF   |
  
|    3 | CC   |    4 | FF   |
  
+------+------+------+------+
  
9 rows in set (0.02 sec)

  
mysql> select A.id>  
+------+------+------+

  
|>  
+------+------+------+
  
|    2 | BB   | DD   |
  
|    3 | CC   | EE   |
  
+------+------+------+
  
2 rows in set (0.00 sec)
  4,A表和B表完整外部连接查询(mysql 目前不支持)
select * from A full join B on  A.id=B.id  
+------+------+------+

  
|>  
+------+------+------+
  
|    1 | AA   |      |
  
|    2 | BB   | DD   |
  
|    3 | CC   | EE   |
  
|    4 |      | FF   |
  
+------+------+------+
  二,group by if count sum
  group by 将查询的结果按列或者多列的值分组,值相等的为一组
  if  if(表达式,value1,value2) 表达式成立时值是value1 否则是value2
  count 计数
  sum 求和
  某表ps内容如下
mysql> select * from ps;  
+------------+------+
  
| RQ         | SF   |
  
+------------+------+
  
| 2005-05-09 | s    |
  
| 2005-05-09 | s    |
  
| 2005-05-09 | f    |
  
| 2005-05-09 | f    |
  
| 2005-05-10 | s    |
  
| 2005-05-10 | f    |
  
| 2005-05-10 | f    |
  
+------------+------+
  
7 rows in set (0.00 sec)
  希望求到如下结果
    RQ          s        f  
| 2005-05-09 |  2    |   2    |
  
| 2005-05-10 |  1    |   2    |
mysql>  select  RQ,sum(if(SF="s",1,0)) s ,sum(if(SF="f",1,0)) f from ps group by RQ;  
+------------+------+------+
  
| RQ         | s    | f    |
  
+------------+------+------+
  
| 2005-05-09 |    2 |    2 |
  
| 2005-05-10 |    1 |    2 |
  
+------------+------+------+
  
2 rows in set (0.00 sec)
  sum(if(SF="s",1,0)) 可以求得s的出现次数



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-622830-1-1.html 上篇帖子: 遭遇:java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 下篇帖子: 在WIN7 系统中安装SQL2008 步骤和注意事项
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表