`
nijiaben
  • 浏览: 130512 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL select语句之from从句

阅读更多
    本文最新发布于http://www.lovestblog.cn,欢迎转载该文,但请注明文章出处,谢谢合作。
     mysql的from从句用来指定参与查询的表,当然也可以是生成的中间表,在表前我们有时需要指定数据库,这主要是用在我们需要访问当前数据库之外的数据库中的表的情况,在这中情况下我们采用"."操作符来进行,如userdb.user,其实userdb为数据库名,user为表名,这是对mysql数据库而言的,对于DB2和Oracle就不是通过指定数据库名了,而是指定sql用户了,这就是说不同sql用户可以建立相同名字的表,但是同一个sql用户只能建立唯一名字的表。这就是它们在这表规范上面的区别。对于列规范,mysql可以在需要查询的列则可以采用如下形式进行访问:“数据库名.表名.列名”。对于多个表的规范,也就是涉及查询多个表的情况下,执行的过程是采用笛卡尔积的形式进行的。也就是说生成的中间表的列数为两个表中列数的总和,而行的总数等于一个表中的行的数量与另外一个表中行的数量的乘积。
       对于from从句中使用假名的情况,比如select u.id,name,age,a.account from utb as u,atb as a where u.id=a.user_id,在我们使用假名之后,那么在该sql语句的任何地方都只能使用假名,不能使用真实的表名,同时上面的as关键字也是可以省略的,也就是说对于上面的语句不能用atb来取代a,utb来取代u了。虽然from从句不是我们指定的第一条语句,但是绝对是第一个被处理的语句,所以在声明假名前使用假名不会导致错误。如果一条from从句引用到两个有着相同名称的表,则必须使用假名。如:
select p.playerno
from players as p,players as par
where par.fn="jp" and par.ln="l" and p.birth_date<par.birth_date

       对于多个表间的连接处理可能会导致有相同的结果,即有重复的结果,sql并不会自动从最终结果中删除重复的行,这是如果我们不希望在结果中出现重复的行,那么我们可以在select后直接指定distinct。如:
select distinct T.playerno 
from teams as T,penalties as pen 
where T.playerno=pen.playerno。

        接下来说说连接哈,对于内连接,如果是两个表的话,就取两个表的一个交集,如果是左外连接的话,那就是左边的表全取,右边没有的用null替代,弱国是右外连接的话,那就是右边的表全取,左边没有的用null表示。下面看看一个具体的例子:
--表stu        --表exam 
id name        id grade 
1, Jack         1, 56 
2, Tom         2, 76
3, Kity         11, 89
4, nono 

内连接 (显示两表id匹配的)
select stu.id,exam.id,stu.name, exam.grade from stu (inner) join exam on stu.id=exam.id 
-------------------------------- 
1 1 Jack 56 
2 2 Tom 76 

左连接(显示join 左边的表的所有数据,exam只有两条记录,所以stu.id,grade 都用NULL 显示)
select stu.id,exam.id,stu.name, exam.grade from stu left (outer) join exam on stu.id=exam.id 
1 1 Jack 56 
2 2 Tom 76 
3 NULL Kity NULL 
4 NULL nono NULL 

右连接(与作连接相反,显示join右边表的所有数据)
select stu.id,exam.id,stu.name, exam.grade from stu right join exam on stu.id=exam.id 
1 1 Jack 56 
2 2 Tom 76 
NULL 11 NULL 89 

内连接取交集,外连接分左和右,
左连接左边的全取,
右连接右边的全取

      对于连接的列的名称相同的话,那么可以使用using来替代条件,如上面的内连接可以这样改写:
      select stu.id,exam.id,stu.name, exam.grade from stu inner join exam using(id)。
      对于左外连接使用的情况一般是当左表的连接列中存在未出现在右表的连接列中的值时,左外连接才有用。
      还有个全外连接的,也就是说只要在两个表中出现的记录都会在中间表中出现,当右表有而左表没有或当左表有而右表没有的时候用null表示。具体语法如下:select stu.id,exam.id,stu.name, exam.grade from stu full join exam using(id)。
      交叉连接:就是显示求表的笛卡尔积,select * from teams cross join penalties.这句完全等价于select teams.*,penalties.* from teams,penalties.
      联合连接:select * from teams union join penalties,这个其实很容易理解,产生结果所包含的列为两个表所有的列和,对于数据的列出,首先列出左表的数据,对于属于右表的列,用null表示,接下来列出右表的数据,对于属于左表的列用null表示。
       自然连接:
select * from teams nature inner join penalties where division='first';
此句完全等同于
select t.playerno,t.teamno,t.division,pen.paymentno,pen.payment_date,pen.amount from teams  as t inner join penalties as pen on t.playerno=pen.playerno where dividion='first'.
相比就知道,我们无须显示指出必须要连接到哪些列,sql会自动查找两表中是否有相同名称的列,且假设他们必须在连接条件中使用。此处的on或using从句是多余的,因此不允许使用。

       下面看个例子创建一个称为towns的虚拟表:
select *
from (select 'Stratford' as town,4 as number 
       union
       select 'Plymouth',6
       union
       select 'Inglewood',1                 
       union
       select 'Douglas',2) as towns
order by town;
结果为:
town             number
----------------------
Douglas              2
Inglewood           1
Plymouth            6
Stratford            4
1
0
分享到:
评论

相关推荐

    mySQL的常用语句

    MySQL是世界上最流行的关系型数据库管理系统之一,用于存储和管理数据。本文将深入讲解MySQL的一些常用语句,包括创建表、创建索引、修改表结构、删除数据对象以及执行查询。 1. 创建表 创建表是数据库设计的第一步...

    MYSQL基本查询操作命令笔记

    SELECT * FROM Orders WHERE EXISTS (SELECT * FROM OrderDetails WHERE OrderID = Orders.OrderID); ``` 12. **量词转化** 将子查询转换为更高效的形式。 13. **在FROM子句中连接表 - JOIN** - 内连接...

    mysql中的一些稍微复杂用法实例代码

    子查询是在主查询内部嵌套的另一个查询,它可以作为从句或返回单个值。在以下示例中,我们看到了两个级别的子查询: ```sql SELECT * FROM ( SELECT o.id, o.student_intention_id, s.NAME, s.area_id, a.area_...

    关系数据库语言SQL知识介绍.pptx

    - 基本查询:简单的无条件或条件查询,如SELECT * FROM 表名 WHERE 条件。 - 使用列表达式:可以查询特定列或计算表达式。 - WHERE从句:用于设定查询条件。 - 数据汇总:GROUP BY和聚合函数(如COUNT、SUM、AVG、...

    MySQL新手入门指南--快速参考

    创建表是数据库的最基本元素之一,表与表之间可以相互独立,也可以相互关联。创建表的基本语法如下: create table table_name (column_name datatype {identity | null | not null}, …) 其中参数table_name和...

    VC数据库编程

    - **SQL从句**:包括SELECT、FROM、WHERE等子句,用于构建复杂的查询语句。 - **SQL运算符**:用于比较或逻辑运算,如AND、OR、NOT等。 - **SQL合计函数**:如SUM、AVG、COUNT等,用于统计分析。 #### 二、COM与...

    MFC数据库编程(ODBC)

    - **SQL从句**:SELECT、FROM、WHERE等子句的使用。 - **SQL运算符**:AND、OR、NOT等逻辑运算符以及比较运算符的使用。 - **SQL合计函数**:COUNT、SUM、AVG等用于统计汇总的函数。 #### COM与数据库访问 - **...

    visual c++ 数据库编程(PDF)

    - **SQL从句**:SELECT、FROM、WHERE等从句是SQL中最常用的部分。 - **SQL运算符**:AND、OR、NOT等逻辑运算符用于组合条件表达式。 - **SQL合计函数**:COUNT、SUM、AVG等函数用于计算聚合值。 #### 二、COM与...

    VC++数据库编程

    - **关系数据库服务器**:基于SQL标准,如Oracle、MySQL。 - **选择适用的数据库**:根据项目需求选择合适的数据库类型。 ##### 1.2 数据库访问技术 - **概述**:介绍不同类型的数据库访问方式。 - **ODBC API**:...

    MFC+Access 数据库编程

    - **关系数据库服务器**:例如MySQL、Oracle等,支持大规模数据处理和高并发访问,适用于企业级应用。 - **选择适用的数据库**:根据项目需求、数据量大小、性能要求等因素综合考虑。 **1.2 数据库访问技术** - **...

Global site tag (gtag.js) - Google Analytics