《MySQL必知必会学习笔记》:高级联结

创建高级联结

上篇博文简单的介绍了下联结的使用,这篇博文就介绍下如何来创建高级联结。

使用表别名

在前面的学习中,我们知道如何给列取一个别名,现在回顾下,如下:

select cust_name,upper(cust_name) as upper_name from customers;

或者是,用concat函数来对客户的姓名和电话进行组合为一个新的信息 ,将这个新的信息取一个别名,如下:

以上就是给列取别名,也可以给计算字段取别名。不仅如此,SQL还允许给表名取别名。这样做有两个主要理由,如下:

  • 缩短SQL语句
  • 允许在单条select语句中多次使用相同的表。

下面举一个例子来说明,如何给表取别名。如下:

通过as为customers/orders/ordersitems 分别取别名为 c/o/items;这样,在后面的列引用中,直接使用别名,而不是使用全名,这样书写起来稍微可以简单一点点。

使用不同类型的联结

上篇博文中,使用过内部联结(即等值联结)。先回顾下:内部联结就是通过 table_name inner join InnerJoin_table_name on 子句来完成的;实际例子如下:

上面就是一个简单的内部联结,,由于刚好学习了给表取别名,就随带把这个知识点也加进去了。

除了内部联结之外,还有其他的3种形式,分别为:

  • 自联结
  • 自然联结
  • 外部联结

下面一一进行介绍。

自联结

自联结,从字面意思就可以理解,就是只存在一个表,自己和自己联结。

下面看一个例子:想看下学生成绩表中 数学分数为100的人的英语成绩是多少分?

你可能会说,这个还需要用自联结来完成吧,直接用where过滤就应该ok了吧。

的确,对于这个例子,确实可以直接用where子句来完成,如下:

除了可以采用上面的where过滤来完成,还可以采用子查询来完成,如下:

除了采用上面介绍的两种方法之外,还可以采用 自联结来完成,如下:

这里采用自联结的方式来完成的,此查询中的表实际上时相同的表,都是student2,由于我们需要对一个表引用两次,因此就需要引入对表student2引入两个不同的别名,否则对student2的引用就存在歧义。因此MySQL不知道你引用的是student2表中的哪个实例。

当引入别名后,所有的列的访问均需要用别名来指定,否则因为有歧义而报错。

如下就是因为没有指定是student2表中的哪个实例而报错:

以上介绍了3中方法来完成这样一个操作,在实际过程中,到底该用哪一种方法,我们应该都尝试下,以确定哪一种的性能更好。

自然联结

由于对多个表进行联结的前提就是应该至少有一列出现在不止一个表中。标准的联结(即内部联结)会返回所有数据(含有重复的列)。而自然联结排除多次出现,使每个列只返回一次。

下面先看标准的联结 ,当在联结的过程中我们用(select *),则结果就是返回所有的列数据。

而自然联结是如何做到排除多次出现,使每个列只返回一次的呢??

答案是:系统不完成这项工作,由我们自己来完成它。自然联结就是这样一种联结,其中我们只能选择那些唯一的列。这一般是通过对表使用通配符(select *),对所有其他表的列使用明确的子集来完成。

简单来说:自然联结就是我们指定输出的内容,并不是输出所有的内容(因为重复的列数据不是我们想得到的)。

外部联结

明天继续,太晚了,2016年4月3日01:45:33

时间: 2024-08-10 07:06:49

《MySQL必知必会学习笔记》:高级联结的相关文章

MySQL必知必会 学习笔记(一)

第一章  了解SQL 模式:   关于数据库和表的布局以及特性的信息.[描述表可以存储什么样的数据,数据如何分解,各部分信息如何命名等等,可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)]. 第二章 MySQL简介 MySQL是一种DBMS,即它是一种数据库软件.基于客户机----服务器的数据库. MySQL工具: 1.mysql 命令行实用程序 2.MySQL Administrator 3.MySQL query Browser 第四章 检索数据 LIMIT 5 表示MySQL返

《MySQL必知必会》学习笔记_1

#选择数据库 USE mysql #返回可用数据库列表 SHOW DATABASES #返回当前数据库中可用表 SHOW TABLES #返回表列 SHOW COLUMNS FROM db #显示特定数据库的创建语句 SHOW CREATE DATABASE mysql #显示广泛的服务器状态信息 SHOW STATUS #显示授权用户的安全权限 SHOW GRANTS 多条SQL语句必须以分号分隔. SQL语句不区分大小写,习惯性大写. 检索不同的行用DISTINCT,只返回不同的值. 限制结

《MySQL必知必会学习笔记》:正则表达式

正则表达式的应用 前面的几节的过滤例子允许用匹配.比较和通配操作符来寻找数据.对于基本的数据过滤,这样就足够了.但是随着过滤条件的复杂性的增加,where子句本身的复杂性也有必要增加.这也就是正则表达式变得有用的地方. 正则表达式是用来匹配文本中特殊的字符集合. 正则表达式不是自己第一次见,在JAVA/C++ 这些语言中,都有正则表达式,不过他们的用途是一样的,都是匹配文本中的字符串.可能具体的用法不太一样,但也差不多.下面将一一进行学习.介绍. 基本字符的匹配 当我们想查找某列中的字符中是否有

《MySQL必知必会》学习笔记

<MySQL必知必会>注重实用性,操作性很强,适用于广大软件开发和数据库管理人员学习参考,Amazon全五星评价.学习与参考皆宜.

《mysql必知必会》读书笔记--存储过程的使用

以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书笔记. 如有转载请注明出处~ 存储过程的使用 执行存储过程 CALL productpricing() 执行名为productpricing的存储过程 创建存储过程 CREATE PROCEDURE productpricing() BEGIN SELECT avg(prod_price) AS pricea

《MySQL必知必会》读书笔记_3

PS:这次的信息量有点大. 聚集不同值 SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003 #相同的值不会被计算 组合聚集函数 SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products

《MySQL必知必会》读书笔记_4

PS:一个实际的存储过程案例 CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_delete_article_by_id`(IN `id` int) BEGIN #Routine body goes here... DECLARE temp INT; SET @aid = id; SELECT COUNT(*) FROM gk_reply_article WHERE a_id = @aid INTO temp; IF(temp <> 0) THEN

mysql学习--mysql必知必会1

?? 例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式处理. (.)是正則表達式的一个符号,表示匹配随意一个字符: mysql> select prod_name -> from products -> where prod_name regexp '.000' -> order by prod_name; +--------------

mysql学习--mysql必知必会

上图为数据库操作分类: 以下的操作参考(mysql必知必会) 创建数据库 执行脚本建表: mysql> create database mytest; Query OK, 1 row affected (0.07 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | mytest | | performan

《SQL必知必会》学习笔记(一)

<SQL必知必会>学习笔记(一) 下面变列出我新学到的知识. 这个是数据库的全部记录 1.order by   语句: select * from Scores order by name , Score desc 执行结果: ①order by在执行排序功能时,会先对排序字段按abcd这样的顺序进行,汉字的话是按拼音的首字母,默认是正序. ②例子中先按name字段进行正序排序,当name相同时,又按score倒叙排,例如拜仁两条数据,胜的开头字母是s,负的是f,因为是倒叙,所以胜的那条数据排