理解MySQL及其他关系数据库中JOINs用法
来源:互联网 发布:软件销售人员岗位职责 编辑:程序博客网 时间:2024/05/22 12:41
这篇文章包括大部分JOINs出现的情况,如果你是高手精通MySQL,请跳过,本文仅适合对JOINs用法不熟练的选手。
“JOIN" 是标准SQL的关键字常用于查询两个或多个关联数据表指定的数据。JOIN的几种用法在实际开发过程中很容易造成混淆,程序员开发过程中总是在处理混淆,下面将通过简洁的介绍这些用法。
一个很简单的例子,学生(user)和课程登记(course)
例子表
'user' table:
MySQL table creation code:
CREATE TABLE `user` (`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(30) NOT NULL,`course` smallint(5) unsigned DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB;
'course'表
id name 1HTML52CSS33JavaScript4PHP5MySQLMySQL table creation code:
CREATE TABLE `course` (`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(50) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB;
由于我们用InnoDB表和知道user.course 和 course.id 是关联 的,我们能指定一个外键关联:
ALTER TABLE `user`ADD CONSTRAINT `FK_course`FOREIGN KEY (`course`) REFERENCES `course` (`id`)ON UPDATE CASCADE;
重要:这个数据库是无效的。这个示例很好
,但学生只能进入零或一个课程。真实系统需要克服这一限制,可能使用一个中间的注册表映射任意数量的学生任意数量的课程。连接允许我们以多种方式查询这些数据。
INNER JOIN (or just JOIN)
INNER JOIN用的比较频繁。这种关联常常在用户和课程表匹配的产生一组记录,比如users在course中关联。
SELECT user.name, course.nameFROM `user`INNER JOIN `course` on user.course = course.id;
Result:
user.name course.name AliceHTML5BobHTML5CarlineCSS3DavidMySQLLEFT JOIN假如我们获取所有学生及他们的course即使他们没有登记课程。A LEFT JOIN会产生一个记录集合匹配在左表(user)每一个实体,不管在右表(course)是否有匹配项。
SELECT user.name, course.nameFROM `user`LEFT JOIN `course` on user.course = course.id;
Result:
user.name course.name AliceHTML5BobHTML5CarlineCSS3DavidMySQLEmma(NULL)RIGHT JOIN假如我们需要所有课程和学生的列表即使是没有人选择的课程?A RIGHT JOIN会生成一组记录匹配每一个右表(course)不管左表(user)中是否匹配:
SELECT user.name, course.nameFROM `user`RIGHT JOIN `course` on user.course = course.id;
Result:
user.name course.name AliceHTML5BobHTML5CarlineCSS3(NULL)JavaScript(NULL)PHPDavidMySQL
RIGHT JOINs 会很少用到,因为你可以使用 a LEFT JOIN表达相同的结果。这个更加有效和快速数据库解析。举一个右连接的例子,我们能够计算每一门课程有多少学生选择:SELECT user.name, course.nameFROM `course`LEFT JOIN `user` on user.course = course.id;
SELECT course.name, COUNT(user.name)FROM `course`LEFT JOIN `user` ON user.course = course.idGROUP BY course.id;
Result:
course.name count() HTML52CSS31JavaScript0PHP0MySQL1OUTER JOIN(也叫全连接 FULL OUTER JOIN)我们最后的选择是OUTER JOIN 其返回两个表里所有匹配的记录。若没有匹配项,则missing的一边回显示NULL。
OUTER JOIN 比INNER, LEFT 或者RIGHT 少用,它在MySQL中没有实施。然而你能够用UNION of a LEFT 和RIGHT JOIN在这个限制下工作。例如:SELECT user.name, course.nameFROM `user`LEFT JOIN `course` on user.course = course.idUNIONSELECT user.name, course.nameFROM `user`RIGHT JOIN `course` on user.course = course.id;
Result:
user.name course.name AliceHTML5BobHTML5CarlineCSS3DavidMySQLEmma(NULL)(NULL)JavaScript(NULL)PHP
希望这篇文章能够帮助到你,理解JOINs并且写出更高效的SQL 查询。
0 0
- 理解MySQL及其他关系数据库中JOINs用法
- PI与关系数据库及其他实时数据库对比
- Oracle及其他数据库中SQL分类
- 命令行下mysql数据库插入记录中包含中文1366错误问题解决方法及其他
- MySQL substring()用法及其他截取字段方式
- Understanding JOINs in MySQL and Other Relational Databases 理解JOIN在MySQL和其他数据库中的运用
- MySQL数据库的导入与导出,及其他相关命令
- Talend中变量载入(tContextLoad)的用法,及其他注意事项
- matlab中num2str控制空格数及其他用法
- Understanding Joins (理解联接)
- java 中 问题及其他
- MySql数据库中null值与其他值的比较
- Oracle SQLServer MySQL查看当前所有数据库表名及其他信息
- Oracle SQLServer MySQL查看当前所有数据库表名及其他信息
- Oracle SQLServer MySQL查看当前所有数据库表名及其他信息
- Every other 的用法及其他
- Every other 的用法及其他
- android:windowSoftInputMode及其他部分属性用法
- HDU2068 RPG的错排 【组合+错排】
- indonesia poker online where the favorites
- SharePoint 2013 工作流平台的选项不可用
- 如何把UltraEDIT 添加到右键打开的快捷方式
- [笔记] 《互联网思维独孤九剑》
- 理解MySQL及其他关系数据库中JOINs用法
- NPOI操作Excel 003:写入空Excel
- 队列---旅行家算法
- 【machine learning】linear regression
- 可以让你少奋斗十年的工作经验
- 升级日志logging框架到logback
- 关于JAVA的try catch finally的return返回值问题
- java 内部类
- C#中的扩展方法