设为首页 加入收藏

TOP

mysql SELECT查询(六)
2015-11-21 01:28:04 来源: 作者: 【 】 浏览:6
Tags:mysql SELECT 查询
_tb ON 连接条件
右外联结 ? ?以右表为基准,左表没有的为NULL.
?left_tb RIGHT JOIN right_tb ON 连接条件
全外联结 ? ?以两个表为基准,哪个没有哪个为NULL. ? mysql中没有。
?
MariaDB [hellodb]> SELECT * FROM students LEFT JOIN classes ON students.ClassID=classes.ClassID;
+-------+---------------+-----+--------+---------+-----------+---------+----------------+----------+
| StuID | Name ? ? ? ? ?| Age | Gender | ClassID | TeacherID | ClassID | Class ? ? ? ? ?| NumOfStu |
+-------+---------------+-----+--------+---------+-----------+---------+----------------+----------+
| ? ?18 | Hua Rong ? ? ?| ?23 | M ? ? ?| ? ? ? 7 | ? ? ?NULL | ? ? ? 7 | Ming Jiao ? ? ?| ? ? ? 27 |
| ? ?19 | Xue Baochai ? | ?18 | F ? ? ?| ? ? ? 6 | ? ? ?NULL | ? ? ? 6 | Lianshan Pai ? | ? ? ? 27 |
| ? ?20 | Diao Chan ? ? | ?19 | F ? ? ?| ? ? ? 7 | ? ? ?NULL | ? ? ? 7 | Ming Jiao ? ? ?| ? ? ? 27 |
| ? ?21 | Huang Yueying | ?22 | F ? ? ?| ? ? ? 6 | ? ? ?NULL | ? ? ? 6 | Lianshan Pai ? | ? ? ? 27 |
| ? ?22 | Xiao Qiao ? ? | ?20 | F ? ? ?| ? ? ? 1 | ? ? ?NULL | ? ? ? 1 | Shaolin Pai ? ?| ? ? ? 10 |
| ? ?23 | Ma Chao ? ? ? | ?23 | M ? ? ?| ? ? ? 4 | ? ? ?NULL | ? ? ? 4 | Wudang Pai ? ? | ? ? ? 12 |
| ? ?24 | Xu Xian ? ? ? | ?27 | M ? ? ?| ? ?NULL | ? ? ?NULL | ? ?NULL | NULL ? ? ? ? ? | ? ? NULL |
| ? ?25 | Sun Dasheng ? | 100 | M ? ? ?| ? ?NULL | ? ? ?NULL | ? ?NULL | NULL ? ? ? ? ? | ? ? NULL |
+-------+---------------+-----+--------+---------+-----------+---------+----------------+----------+
?
就是这样的了。打个比方,如果classes的表有额外的ClassID,如8,9,10之类的,而students表中没有,那么也是不会显示出来的。因为左外连接是以左表为准,管你右边的表有什么。而右外连接就是以右边的表为准了。当然在写表的时候把classes表写左边也是一样的。
?
这些表还可以作三个表甚至四个表连接的操作。比如加上成绩。大家就自己试试吧。
?
2、子查询:
?
在查询中嵌套的查询。
?
用于WHERE中的子查询
?
1、用于比较表达式中的子查询。子查询的返回值只能有一个
?
2、用于EXISTS中的子查询,判断存在与否。
?
3、用于IN中的子查询,判断存在于指定的列表中。
?
4、用于FROM中的子查询,SELECT * FROM (SELECT clause) AS alias。这里一定要用别名。
?
5、在SELECT中也可以用子语句的值来作为一个字段。
?
先解决查询age>AVG(age)的问题。为什么在上面那里不能用,因为这种写法就是错的。一行还是一组呢。
?
1、放到WHERE后,WHERE语句的数据是一行一行的,age是可以表示当前行的age值。但是AVG(age)就有问题了,它只能放在GROUP BY后面来计算组的平均值,或是SELECT后面全表的平均值。
?
2、放到HAVING后面,同样的问题。是一组数据。
?
如果要查询就要用子查询先计算平均值。
?
查询所有同学年龄大于平均年龄的。
?
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE age > (SELECT AVG(age) FROM students);
+--------------+-----+
| Name ? ? ? ? | Age |
+--------------+-----+
| Xie Yanke ? ?| ?53 |
| Ding Dian ? ?| ?32 |
| Shi Qing ? ? | ?46 |
| Tian Boguang | ?33 |
| Sun Dasheng ?| 100 |
+--------------+-----+
5 rows in set (0.00 sec)
?
延伸一下:显示平均年龄:
?
MariaDB [hellodb]> SELECT Name,Age,(SELECT AVG(age) FROM students) AS avg_age FROM students WHERE age > (SELECT AVG(age) FROM students);
+--------------+-----+---------+
| Name ? ? ? ? | Age | avg_age |
+--------------+-----+---------+
| Xie Yanke ? ?| ?53 | 27.4000 |
| Ding Dian ? ?| ?32 | 27.4000 |
| Shi Qing ? ? | ?46 | 27.4000 |
| Tian Boguang | ?33 | 27.4000 |
| Sun Dasheng ?| 100 | 27.4000 |
+--------------+-----+---------+
5 rows in set (0.00 sec)
?
那么再延伸一下,显示在各个班级内同学,大于班级内年龄平均值的。
有点复杂,我这里是这样作的。
?
第一步:求出各个班内的平均年龄。
?
MariaDB [hellodb]> SELECT AVG(age),ClassID FROM students GROUP BY ClassID;
+----------+---------+
| AVG(age) | ClassID |
+----------+---------+
| ?63.5000 | ? ?NULL |
| ?20.5000 | ? ? ? 1 |
| ?36.0000 | ? ? ? 2 |
| ?20.2500 | ? ? ? 3 |
| ?24.7500 | ? ? ? 4 |
| ?46.0000 | ? ? ? 5 |
| ?20.7500 | ? ? ? 6 |
| ?19.6667 | ? ? ? 7 |
+----------+---------+
8 rows in set (0.00 sec)
?
第二步:以上面这个结果与students表建立连接。
?
MariaDB [hellodb]> S
首页 上一页 3 4 5 6 7 8 下一页 尾页 6/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇后端分布式系列:分布式存储-MyS.. 下一篇mysql学习记录(二十二)--mysql..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: