mysql 多表联合查询语句怎么写 |
您所在的位置:网站首页 › mysql多表联合查询语句 › mysql 多表联合查询语句怎么写 |
![]() 一使用SELECT子句进行多表bai查询 SELECT 字段名 FROM 表1,表2 … WHERE 表1.字段 = 表2.字段 AND 其它du查询条件 SELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a.id=b.id 注:在上面的的代码中,以两zhi张表的id字段信息相同作为条件建立两表关联,但在实际开发中不应该这样使用,最好用主外键约束来实现 二使用表的别名进行多表查询 如:SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065 a,tb_demo065_tel b WHERE a.id=b.id AND b.id='$_POST[textid]' SQL语言中,可以通过两种方式为表指定别名 第一种是通过关键字AS指定,如 SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065 AS a,tb_demo065_tel AS b WHERE a.id=b.id 第二种是在表名后直接加表的别名实现 SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065 a,tb_demo065_tel b WHERE a.id=b.id 使用表的别名应注意几下几点 (1)别名通常是一个缩短了的表名,用于在连接中引用表中的特定列,如果连接中的多个表中有相同的名称列存在,必须用表名或表的别名限定列名 (2)如果定义了表的别名就不能再使用表名 三合并多个结果集 SQL语言中,可以通过UNION 或 ALL将多个SELECT语句的查询结果合并输出,这两个关键字的使用说明如下: UNION:利用该关键字可以将多个SELECT 语句的查询结果合并输出,并删除重复行 ALL:利用该关键字可以将多个SELECT 语句的查询结果合并输出,但不会删除重复行 在使用UNION或ALL关键字将多个表合并输出时,查询结果必须具有相同的结构并且数据类型必须兼容,另外使用UNION时两张表的字段数量也必须相同,否则会提示SQL语句有错误。 e.x:SELECT id,name,pwd FROM tb_demo067 UNION SELECT uid,price,date FROM tb_demo067_tel 四简单嵌套查询 子查询:子查询是一个SELECT查询,返回单个值且嵌套在SELECT、INSERT、UPDATE和DELETE语句或其它查询语句中,任何可以使用表达式的地方都可以使用子查询. SELECT id,name,sex,date FROM tb_demo068 WHERE id in(SELECT id FROM tb_demo068 WHERE id='$_POST[test]') 内连接:把查询结果作为WHERE子句的查询条件即称为内连接 五复杂的嵌套查询 多表之间的嵌套查询可以通过谓词IN实现,语法格式如下: test_expression[NOT] IN{ subquery } 参数说明:test_expression指SQL表达式,subquery包含某结果集的子查询 多表嵌套查询的原理:无论是多少张表进行嵌套,表与表之间一定存在某种关联,通过WHERE子句建立此种关联实现查询 六嵌套查询在查询统计中的应用 实现多表查询时,可以同时使用谓词ANY、SOME、ALL,这些谓词被称为定量比较谓词,可以和比较运算符联合使用,判断是否全部返回值都满足搜索条件.SOME和ANY谓词是存在量的,只注重是否有返回值满足搜索条件,这两个谓词的含义相同,可以替换使用;ALL谓词称为通用谓词,它只关心是否有谓词满足搜索要求. SELECT * FROM tb_demo069_people WHERE uid IN(SELECT deptID FROM tb_demo069_dept WHERE deptName='$_POST[select]') SELECT a.id,a.name FROM tb_demo067 AS a WHERE idANY 大于子查询中的某个值 >=ANY 大于等于子查询中的某个值 ALL 大于子查询中的所有值 >=ALL 大于等于子查询中的所有值 '95' =============================== 一使用SELECT子句进行多bai表查询SELECT 字段du名 FROM 表1,表2 … WHERE 表1字段 = 表2字段 AND 其它查询条件zhiSELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a.id=b.id 注:在上面的dao的代码中,以两张表的id字段信息相同作为条件建立两表关联,但在实际开发中不应该这样使用,最好用主外键约束来实现。 1、联合查询可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合到一起,使用谓词为UNION或UNION ALL。联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 2、在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。 3、在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:查询1 UNION (查询2 UNION 查询3)。 ============================= TABLE 语句bai 具体语法:TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]] 其实从语法上看,可以排序,du也可以过滤记录集,不过zhi比较简单,没有 SELECT 那么强大。dao 示例 1 简单的建一张很小的表 y1,记录数为 10 条。表 t1,插入 10 条记录 mysql-(ytt/3305)->create table t1 (r1 int,r2 int); Query OK, 0 rows affected (0.02 sec) mysql-(ytt/3305)->insert into t1 with recursive aa(a,b) as ( select 1,1 union all select a+1,ceil(rand()*20) from aa where a < 10 ) select * from aa; Query OK, 10 rows affected (0.00 sec) Records: 10 Duplicates: 0 Warnings: 0 简单全表扫描mysql-(ytt/3305)->select * from t1;+------+------+| r1 | r2 |+------+------+| 1 | 1 || 2 | 9 || 3 | 9 || 4 | 17 || 5 | 17 || 6 | 16 || 7 | 6 || 8 | 1 || 9 | 10 || 10 | 3 |+------+------+10 rows in set (0.00 sec) TABLE 结果mysql-(ytt/3305)->table t1;+------+------+| r1 | r2 |+------+------+| 1 | 1 || 2 | 9 || 3 | 9 || 4 | 17 || 5 | 17 || 6 | 16 || 7 | 6 || 8 | 1 || 9 | 10 || 10 | 3 |+------+------+10 rows in set (0.00 sec) 看下 table 的执行计划mysql-(ytt/3305)->explain table t1 order by r1 limit 2G*************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ALLpossible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 10 filtered: 100.00 Extra: Using filesort1 row in set, 1 warning (0.00 sec) 其实可以看到 TABLE 内部被 MySQL 转换为 SELECT 了。mysql-(ytt/3305)->show warningsG*************************** 1. row *************************** Level: Note Code: 1003Message: /* select#1 */ select `ytt`.`t1`.`r1` AS `r1`,`ytt`.`t1`.`r2` AS `r2` from `ytt`.`t1` order by `ytt`.`t1`.`r1` limit 21 row in set (0.00 sec) 那其实从上面简单的例子可以看到 TABLE 在内部被转成了普通的 SELECT 来处理。示例 2应用于子查询里的子表。这里要注意,内表的字段数量必须和外表过滤的字段数量一致。克隆表 t1 结构mysql-(ytt/3305)->create table t2 like t1;Query OK, 0 rows affected (0.02 sec) 克隆表 t1 数据mysql-(ytt/3305)->insert into t2 table t1;Query OK, 10 rows affected (0.00 sec)Records: 10 Duplicates: 0 Warnings: 0 table t1 被当做内表,表 t1 有两个字段,必须同时满足 t2 检索时过滤的字段也是两个。mysql-(ytt/3305)->select * from t2 where (r1,r2) in (table t1);+------+------+| r1 | r2 |+------+------+| 1 | 1 || 2 | 9 || 3 | 9 || 4 | 17 || 5 | 17 || 6 | 16 || 7 | 6 || 8 | 1 || 9 | 10 || 10 | 3 |+------+------+10 rows in set (0.00 sec) 注意:这里如果过滤的字段数量和子表数量不一致,则会报错。 =================================================== 前言:(在表中,可能会包含重复值。这并不成问题,不过,有时你也许希望仅仅列出不同(distinct)的值。 关键词 DISTINCT 用于返回唯一不同的值。) 如果不加DISTINCT 的话,主表本来100条的数据,联查出来可能会几万条 语法:SELECT DISTINCT 列名称 FROM 表名称 SELECT DISTINCT A.BinName,B.StorageLocationName,C.WarehouseName,D.PlantName,E.CompanyName //需要的显示列名FROM WMS_Bins A left JOIN WMS_StorageLocation B on A.StorageLocationId=B.StorageLocationIdleft JOIN WMS_Warehouse C on A.WarehouseId=C.WarehouseIdleft JOIN WMS_Plants D on A.PlantId=D.PlantIdleft JOIN WMS_Companys E on A.CompanyId=E.CompanyId |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |