關聯查詢.

Slides:



Advertisements
Similar presentations
第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
Advertisements

作業一 : USING DBMS ( 使用 DB2 及 SQL 基本練習 ) 報告人:學生楊群期 學號: 課程 : 高等資料庫 講師 : 楊維邦教授.
Data type P64 ‘’ 转义字符 P67 P68 EXE,选出某个教师的学生中最新的一 个,要姓名, ID (,LIMIT ) EXISTS,NOT EXISTS P409 Q,EXISTS 和 in 的区别( 1000 ,查询结果)
第八单元 数据库MySQL应用基础 MySQL数据库应用基础 MySQ数据库操作使用 Mysql管理工具 第25章 数据库的增加/删除操作
目 录 第 1 章 数据库技术基础 第 2 章 SQL Server基础 第 3 章 数据库管理 第 4 章 查询和视图
SQL的简单查询.
第5章 关系数据库标准语言SQL 主讲:张丽芳.
第2章 SQL语言初步 2.1 SQL的基本概念 2.2 基本表、索引的创建、删除和修改操作 2.3 SQL的查询语句——SELECT
第2讲 Transact-SQL语言.
第5章 索引及视图操作 数据库原理应用与实践 SQL SERver2014(第2版) 主编 贾铁军 科学出版社 编著 陈国秦 万程 邢一鸣
高等院校计算机教材系列 数据库原理与应用(第2版) 任课教师:刘雅莉
Chap 11 SQL基本查詢指令.
第8章 SELECT敘述的基本查詢 8-1 SELECT查詢指令 8-2 SELECT子句 8-3 FROM子句 8-4 WHERE子句
第四章 数据库对象.
数据库原理及应用 《数据库原理及应用》课程组 荆楚理工学院.
第14章 預存程序 14-1 預存程序的基礎 14-2 建立與執行預存程序 14-3 預存程序的參數傳遞 14-4 預存程序的傳回值
第4章 关系数据库标准语言SQL 4.1 SQL语言概述 4.2 SQL数据查询功能 4.3 SQL数据操作功能 4.4 SQL数据定义功能.
資料庫 (Database) SQL Server 2008實作
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
数据库原理及设计 --作业.
第一讲 数据查询优化.
第6章 数据展示和输出功能 创建和使用报表 报表(Report)是以打印格式展示数据的一种有效方式。在报表中,可以展示图形、文字标题、字段数据或汇总数据等形式的信息,并可以控制各种数据的大小和外观。 利用报表,还可以按照数据之间的逻辑关系和所需的方式来组织数据之间的排版布局,对数据进行多级汇总和统计,或以图形方式展示数据。
计算机应用基础 上海大学计算中心.
第3章 数据查询与SQL命令.
資料庫管理 資管二 賴柏融.
查询数据.
第五讲 利用视图进行查询优化.
關聯式資料庫.
第六章 學習SQL語言.
9 SELECT敘述的進階查詢 9-1 SQL的多資料表查詢 9-2 合併查詢 9-3 集合運算查詢 9-4 子查詢
資料庫系統 Database Systems
第 8 章 資料的 新增、修改與刪除.
課程名稱:資料庫系統 授課老師:李春雄 博士
課程名稱:資料庫系統 授課老師:李春雄 博士
实验二 交互式SQL 邓云.
Chap 10 SQL定義、操作與控制指令.
資料庫安全 (Database Security)
彰化縣政府補助辦理網頁設計資料庫應用班 ASP與資料庫介紹 建國技術學院資管系 饒瑞佶.
SQL Server 2000 数据库入门.
阿里巴巴分布式数据库 ——原理、实现和应用 集团共享技术平台 分布式数据库 邱硕
課程名稱:資料庫系統 授課老師:李春雄 博士
第 10 章 PHP 存取 MySQL 資料庫.
第3章 MySQL教學範本 主從式資料庫系統 - CH3.
MySQL数据库基础与实例教程 之 MySQL表结构的管理 郭水泉.
第九章 進階的查詢技巧.
SQL SERVER 一些经典语句 1.
MySQL 結構化查詢語言 MySQL.
第十七章 資料庫SQL 17-1 SELECT 17-2 INSERT 17-3 UPDATE 17-4 DELETE.
实验二讲评 … 张榆….
数据库应用技术 SQL Server 2005.
第20章 MySQL数据库.
数据库技术与应用.
MySQL开发规范 DB组-张浩.
数据库技术.
第18章 SQL結構化查詢語言 18-1 SQL語言的基礎 18-2 SQL的查詢指令 18-3 SQL子查詢與合併查詢.
3.2 Mysql 命令行 1 查看数据库 SHOW DATABASES; 2 创建一个数据库test1 CREATE DATABASE test1; 3 选择你所创建的数据库 USE test1; (按回车键出现Database changed 时说明操作成功!) 4 查看现在的数据库中存在什么表.
3. SQL语言的应用 3.1 SQL历史和优点 3.2 数据查询 3.3 数据操纵.
学习目标 1、什么是表连接 2、表连接类型 3、表连接区别.
查询与视图 蔡海洋.
第14章 SQL数据查询与操纵 内容提要 本章知识点
SQL查询语句 蔡海洋.
本讲内容 SQL 概述 SQL 的查询功能 SQL 的操作功能 SQL 的定义功能.
第三章 SQL Server数据管理.
第六類 資料庫備份與回復.
8 SELECT敘述的基本查詢 8-1 SELECT查詢指令 8-2 SELECT子句 8-3 FROM子句 8-4 WHERE子句
資料庫系統  Database System 施莉萍 2017/12/28.
11 檢視表的建立 11-1 檢視表的基礎 11-2 建立檢視表 11-3 修改與刪除檢視表 11-4 編輯檢視表的內容.
MySQL执行计划解读 胡中泉.
第4章 数据查询.
第 9 章 查詢資料- 善用 SELECT 敘述.
Presentation transcript:

關聯查詢

JOIN語法 MySQL支持以下JOIN語法, 這些語法用於SELECT語句的table_references部分和多表DELETE和UPDATE語句: table_references: table_reference [, table_reference] … table_reference: table_factor | join_table

table_factor: tbl_name [[AS] alias] [{USE|IGNORE|FORCE} INDEX (key_list)] | ( table_references ) | { OJ table_reference LEFT OUTER JOIN table_reference ON conditional_expr }

join_table: table_reference [INNER | CROSS] JOIN table_factor [join_condition] | table_reference STRAIGHT_JOIN table_factor | table_reference STRAIGHT_JOIN table_factor ON condition | table_reference LEFT [OUTER] JOIN table_reference join_condition | table_reference NATURAL [LEFT [OUTER]] JOIN table_factor | table_reference RIGHT [OUTER] JOIN table_reference join_condition | table_reference NATURAL [RIGHT [OUTER]] JOIN table_factor

join_condition: ON conditional_expr | USING (column_list) 與SQL標準相比,table_factor的語法被擴展了。SQL標準只接受table_reference,而不是圓括号内的一系列項目。

CROSS JOIN/INNER JOIN 在MySQL中,CROSS JOIN与INNER JOIN等同, 兩者可以互相替换。 在標準SQL中,两者是不等同的。INNER JOIN與ON子句同時使用,CROSS JOIN以其它方式使用。

SELECT. FROM t1 LEFT JOIN (t2, t3, t4) ON (t2. a=t1. a AND t3. b=t1 SELECT * FROM t1 LEFT JOIN (t2, t3, t4)   ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c) 相當於: SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)  ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c) …此為正規之 Join指令

SELECT t1. name, t2. salary FROM employee AS t1, info AS t2 WHERE t1 SELECT t1.name, t2.salary FROM employee AS t1, info AS t2  WHERE t1.name = t2.name;·  SELECT t1.name, t2.salary FROM employee t1, info t2  WHERE t1.name = t2.name; ON條件句是可以被用於WHERE子句的格式的任何條件。 A table reference can be aliased using tbl_name AS alias_name or tbl_name alias_name:      

如果對於在LEFT JOIN中的ON或USING部分中的右表没有匹配的紀錄,则對應該欄之所有列被设置为NULL再套用於右表。 如果一个表在其它表中没有对应部分,您可以使用这种方法在这种表中查找紀錄: SELECT table1.* FROM table1   LEFT JOIN table2 ON table1.id = table2.id  WHERE table2.id IS NULL;

USING(column_list)子句 用於為一系列的列進行命名。若這些列必同時在两个表中存在。 EX: 如果表a和表b都包含列c1, c2和c3,则以下联合会对比来自两个表的对应的列:     a LEFT JOIN b USING (c1,c2,c3)

Some join examples SELECT * FROM table1, table2; SELECT * FROM table1 INNER JOIN table2 ON table1.id=table2.id; SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; SELECT * FROM table1 LEFT JOIN table2 USING (id); SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id;

INNER JOIN和,(逗号)在無联合條件下是語意相同的:两者都可以对指定的表计算出笛卡儿乘積(也就是说,第一个表中的每一行被联合到第二个表中的每一行)。   RIGHT JOIN的作用与LEFT JOIN的作用類似。要使指令可以在資料庫内移植,建議使用LEFT JOIN代替RIGHT JOIN。 STRAIGHT_JOIN与JOIN相同。除了有一点不一樣,左表会在右表之前被讀取。STRAIGH_JOIN可以被用於這樣的情况,即联合优化符合以錯誤的顺序排列表。

USE INDEX(key_list) 指定USE INDEX(key_list)[索引名稱],可以告知MySQL只使用一个索引来查找表中的行。 另一种语法IGNORE INDEX(key_list)可以被用于告知MySQL不要使用某些特定的索引。 如果EXPLAIN顯示MySQL正在使用来自索引清单中的錯誤索引时,這些提示会有用处。 您也可以使用FORCE INDEX,其作用接近USE INDEX(key_list),不过增加了一项作用,一次表掃描被假设为代价很高。换句话说,只有当無法使用一个给定的索引来查找表中的行時,才使用表掃描。 USE KEY、IGNORE KEY和FORCE KEY是USE INDEX、IGNORE INDEX和FORCE INDEX的同义词。

下列SQL等效 a LEFT JOIN b USING (c1,c2,c3) a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3

常用範例 SELECT * FROM table1,table2 WHERE table1.id = table2.id; SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; SELECT * FROM table1 LEFT JOIN table2 USING (id); SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id  LEFT JOIN table3 ON table2.id = table3.id; SELECT * FROM table1 USE INDEX (key1,key2)  WHERE key1=1 AND key2=2 AND key3=3; SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;

SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3); 在舊版本中,SELECT是合法的,因为t1, t2被隱含地歸為(t1,t2)。新版之JOIN取得了优先权,因此用於ON子句的操作方式是t2和t3。因为t1.i1不是任何一个操作数中的列,所以结果是出现在‘on clause’中有未知列‘t1.i1’的錯誤。 要使联合可以被正常處理,使用圆括号把前两个表明確地歸為一组,這樣用于ON子句的操作則改為(t1,t2)和t3: SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3); 本变更也适用于INNER JOIN,CROSS JOIN,LEFT JOIN和RIGHT JOIN。

Subquery語法 例子: SELECT * FROM t1 WHERE column1 = (SELECT c olumn1 FROM t2); 限制條件: 一个子查询的外部语句必须是以下语句之一: SELECT, INSERT, UPDATE, DELETE, SET或DO。 另一限制條件: 您不能在一个子查询中修改一个表,又在同一个表中选择。此點也適用于DELETE, INSERT, REPLACE和UPDATE语句。

應用範例 SELECT column1 FROM t1WHERE column1 = (SELECT MAX(column2) FROM t2); SELECT * FROM t1 AS tWHERE 2 = (SELECT COUNT(*) FROM t1 WHERE t1.id = t.id);

A table_subquery is also known as a subquery in the FROM clause A table_subquery is also known as a subquery in the FROM clause. Such subqueries must include an alias to give the subquery result a table name SELECT * FROM (SELECT 1, 2, 3) AS t1;

使用ANY, IN和SOME比較 SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2); 不过,NOT IN不是<> ANY的别名,但是是<> ALL的别名。

SELECT s1 FROM t1 WHERE s1 <> ANY  (SELECT s1 FROM t2);SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2); 使用詞語SOME的机会很少,但是本例顯示了为什么SOME是有用的。 对于多数人来说,英語短語“a is not equal to any b”的意思是“没有一个b与a相等”,但是在SQL語法中則是“有部分b与a不相等”。使用<> SOME有助于確認每个人都理解該查询的真正含义。

使用ALL進行子查询 SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2); 假设表1中有一行包含(10)。如果表t2包含(-5,0,+5),则表达式为TRUE,因为10比t2中的所有三个值都大。 如果表t2包含(12,6,NULL,-100),则表達式为FALSE,因为表t2中有一个值12大于10。 如果表t2包含(0,NULL,1),则表達式为unknown。

行子查询 SELECT * FROM t1 WHERE (1,2) = (SELECT column1, column2 FROM t2); SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2); SELECT * FROM t1 WHERE (column1,column2) = (1,1);  SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;ELECT column1, column2 FROM t2);(此敘述可被優化)

SELECT column1,column2,column3FROM t1 WHERE (column1,column2,column3) IN(SELECT column1,column2,column3 FROM t2);

EXISTS和NOT EXISTS SELECT DISTINCT store_type FROM stores  WHERE EXISTS (SELECT * FROM cities_stores WHERE cities_stores.store_type = stores.store_type); SELECT DISTINCT store_type FROM stores WHERE NOT EXISTS (SELECT * FROM cities_stores  WHERE cities_stores.store_type = stores.store_type);

資料轉檔應用 使用專案巨集指令 轉檔前養成備份資料之好習慣

檢查異動檔與主控檔鍵值是否不吻合 若須檢查異動檔與主控檔鍵值是否有不吻合之情形者,可加入下述指令範例來檢查兩造鍵值。 Insert Into 主控檔 (鍵值欄) Select 鍵值欄 From updTable Where (鍵值欄) Not In (Select 鍵值欄 From 主控檔 As objTable); 其中updTable為異動檔,後半之子查詢資料來源若與前半之資料表相同,則必須取別名(例如objTable) 。

出貨轉銷貨訂單檔範例 (1) 建立暫存檔, 將出貨檔依訂單編號及產品編號小計 Create Temporary Table updTable Select spbill.OD_Blno, splist.PD_No, Sum(splist.SP_Qty) As SP_Qty From spbill Join splist Where spbill.SP_Blno=splist.SP_Blno And splist.CL_Note<>"T“ Group By spbill.OD_Blno, splist.PD_No;

出貨轉銷貨訂單檔範例(2) 將相關檔案上鎖 Lock Table updTable Read, spodlst Write, splist Write;

出貨轉銷貨訂單檔範例(3) 更新訂貨明細表之已出貨數量 Update spodlst join updTable On spodlst.OD_Blno = updTable.OD_Blno And spodlst.PD_No= updTable.PD_No Set spodlst.sp_qty = spodlst.sp_qty + updTable.sp_qty;

出貨轉銷貨訂單檔範例(4) 更新出貨明細表: CL_Note 欄位加註 “T” 資料表解鎖 刪除暫存表 Update splist Set splist.CL_Note ="T" Where splist.CL_Note<>"T"; 資料表解鎖 Unlock Tables; 刪除暫存表 Drop Temporary Table updTable;