bitscn.com 1.from 字句 select的查询对象由from子句指定,其格式为: from 表名1 [ , 表名2] … 其中,表名: tbl_name [ [as] 表别名 ] [{use | ignore | force} index (key_list)] /*查询表*/ | join_table /*连接表*/ 说明:表名指出了要查询的表或视图。 ● 表别名主要用在相关子查询及连接查询中。如果from子句指定了表别名,这条select语句中的其他子句都必须使用表别名来代替原始的表名。当同一个表在select语句中多次被提到的时候,就必须要使用表别名来加以区分。 ● {use | ignore | force} index:use index告知mysql选择一个索引来查找表中的行,ignore index告知mysql不要使用某些特定的索引,force index的作用接近use index(key_list),只有当无法使用一个给定的索引来查找表中的行时,才使用表扫描。 2.表名中可以包含一个或多个表: ● 引用一个表: 可以用两种方式引用一个表,第一种方式是使用use语句让一个数据库成为当前数据库,在这种情况下,如果在from子句中指定表名,则该表应该属于当前数据库。第二种方式是指定的时候在表名前带上表所属数据库的名字。例如,假设当前数据库是db1,现在要显示数据库db2里的表tb的内容,使用如下语句: select * from db2.tb; 当然,在select关键字后指定列名的时候也可以在列名前带上所属数据库和表的名字,但是一般来说,如果选择的字段在各表中是唯一的,就没有必要去特别指定。 ● 引用多个表: 如果要在不同表中查询数据,则必须在from子句中指定多个表。指定多个表时就要使用到连接。当不同列的数据组合到一个表中叫做表的连接。 3.连接的方式有以下三种。 高级查询 (多表查询:数据源是多个表) 做多表连接:要找到连接的条件,2个表的公共字段(属性) 分析:1.考虑数据源 :xs:学号 姓名; xs_kc:课程号 成绩 2.连接条件:两表的学号相等 xs.学号=xs_kc.学号 当查看的列在多个表中都存在的话,必须在字段名前加上表名进行限制。 1). 全连接 连接的第一种方式是将各个表用逗号分隔,这样就指定了全连接。from子句产生的中间结果是一个新表,新表是每个表的每行都与其他表中的每行交叉以产生所有可能的组合,列包含了所有表中出现的列,也就是笛卡儿积。这样连接表潜在地产生数量非常大的行,因为可能得到的行数为每个表中行数之积。在这样的情形下,通常要使用where子句设定条件来将结果集减少为易于管理的大小,这样的连接即为等值连接。 例: 查找xscj数据库中所有学生选过的课程名和课程号。 select distinct kc.课程名,xs_kc.课程号 from kc, xs_kc where kc.课程号=xs_kc.课程号; 2). join连接 语法格式如下: 表名1 inner join 表名2 [join_condition] | 表名1{ left | right } [outer]join表名2 join_condition | 表名1 natural [ {right |left} [outer] ] join表名2 | 表名1 cross join 表名2 [join_condition] | 表名1 straight_join表名2 [on condition_exp] 其中,join_condition 代表: on 连接条件 | using(column_list) 使用join关键字的连接主要分为三种: a.内连接(指定了inner关键字的连接是内连接)。 内连接是系统默认的,可以省略inner关键字。使用内连接后,from子句中on条件主要用来连接表,其他并不属于连接表的条件可以使用where子句来指定。 作为特例,可以将一个表与它自身进行连接,称为自连接。若要在一个表中查找具有相同列值的行,则可以使用自连接。使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。 例:查找xscj数据库中课程不同、成绩相同的学生的学号、课程号和成绩。 select a.学号,a.课程号,b.课程号,a.成绩 from xs_kc as a join xs_kc as b on a.成绩=b.成绩 and a.学号=b.学号 anda.课程号!=b.课程号; 如果要连接的表中有列名相同,并且连接的条件就是列名相等,那么on条件也可以换成using子句。
using(column_list)子句用于为一系列的列进行命名。这些列必须同时在两个表中存在。其中column_list为两表中相同的列名。 例: 查找kc表中所有学生选过的课程名。 select 课程名 from kc inner join xs_kc using (课程号); 说明:查询的结果为xs_kc表中所有出现的课程号对应的课程名。 b.外连接(指定了outer关键字的连接为外连接。) 外连接包括: ● 左外连接(left outer join):结果表中除了匹配行外,还包括左表有的但右表中不匹配的行,对于这样的行,从右表被选择的列设置为null。 ● 右外连接(right outerjoin):结果表中除了匹配行外,还包括右表有的但左表中不匹配的行,对于这样的行,从左表被选择的列设置为null。 ● 自然连接(natural join):自然连接还有自然左外连接(natural left outer join)和自然右外连接(naturalright outer join)。natural join的语义定义与使用了on条件的inner join相同。 其中的outer关键字均可省略。 例: 查找所有学生情况及他们选修的课程号,若学生未选修任何课,也要包括其情况。 select xs.* , 课程号 from xs left outer join xs_kc on xs.学号 =xs_kc.学号; 说明:若本例不使用left outer join,则结果中不会包含未选任何课程的学生信息。使用了左外连接后,本例结果中返回的行中有未选任何课程的学生信息,相应行的课程号字段值为null。 例: 使用自然连接实现例4.22中相同的结果。 select distinct 课程名, xs_kc.课程号 from kc natural join xs_kc; 说明:select语句中只选取一个用来连接表的列时,可以使用自然连接代替内连接。用这种方法,可以用自然左外连接来替换左外连接,自然右外连接替换右外连接。(用的不多,容易出错,因为是让系统自动找相同的条件,找不到时会报错) 注意:外连接只能对两个表进行。 c.交叉连接(指定了cross join关键字的连接是交叉连接。) 在不包含连接条件,交叉连接实际上是将两个表进行笛卡儿积运算,结果表是由第一个表的每行与第二个表的每一行拼接后形成的表,因此结果表的行数等于两个表行数之积。 在mysql中,cross join从语法上来说与inner join等同,两者可以互换。 例: 列出学生所有可能的选课情况。 select 学号, 姓名, 课程号, 课程名 from xs cross join kc; 另外,straight_join连接用法和innerjoin连接基本相同。不同的是,straight_join后不可以使用using子句替代on条件。 例: 使用straight_join连接实现例4.22中相同的结果。 select distinct 课程名, xs_kc.课程号 from kc straight_join xs_kc on (kc.课程号=xs_kc.课程号); 4.几种连接的举例比较: 要求:查询每个学生的姓名,专业名,课程名,成绩 数据源:xs:姓名,专业名; kc:课程名 ; xs_kc :成绩 连接条件:xs.学号=xs_kc.学号 and kc.课程号=xs_kc.课程号 (1) 全连接(等值连接) 例1: select 姓名,专业名,课程名,成绩 from xs,kc,xs_kc where xs.学号=xs_kc.学号 and kc.课程号=xs_kc.课程号; 例2: select 姓名,专业名,课程名,成绩 fromxs,kc,xs_kc where xs.学号=xs_kc.学号 and kc.课程号=xs_kc.课程号 and 课程名='计算机基础' and 成绩>=80 order by 成绩 desc; (2) 内连接 例1: select xs.学号,姓名,课程号,成绩 from xs inner join xs_kc on xs.学号=xs_kc.学号; 例2: select 姓名,专业名,课程名,成绩 from xs inner join xs_kc on xs.学号=xs_kc.学号 inner join kc on xs_kc.课程号=kc.课程号 where 课程名='计算机基础' and 成绩>=80; 5.连接多表(如果是三张表) 1).join连接: from 表1 inner join 表2 on 条件1 inner join 表3 on 条件2 2).全连接: from 表1,表2,表3 where条件1 and 条件2 3).给表加别名:from 表名 as 别名 注意:如果给表加了别名,以后的使用必须用别名,不能再使用原表名 作者 tianyazaiheruan bitscn.com