mysql连接与嵌套查询_数据库之嵌套查询与连接查询
嵌套查詢
單值嵌套查詢
值返回結果是一個值的嵌套查詢稱為單值嵌套查詢
對Sales數據庫,列出市場部的所有員工的編號
USE Sale
GO
SELECT employee_id FROM employee
WHERE department_id=(?SELECT department_id
FROM?department
WHERE?department_name='市場部'
)
語句的執行過程分兩個過程,首先在部門表(department)中找出“市場部”的編號(例如為D002)然后再在員工表中找出部門號等于D002的記錄,列出這些記錄的員工編號。
多值嵌套查詢
子查詢的返回結果是一列值的嵌套查詢稱為多值嵌套查詢。若某個查詢的返回值不止一個,則必須指明在WHERE子句中應怎樣使用這些返回值。通常使用條件運算ANY(或SOME),ALL和IN
1,ANY運算符的用法
對Sales數據庫,列出D001號部門中工資比D002號部門的員工最低工資高的員工編號和工資。
ANY 用法: ANY()
用法說明:滿足子查詢中任意一個值的記錄
SELECT employee_id,wages FROM employee
WHERE department_id='D001' AND wages>ANY
(?SELECT wages
FROM?employee
WHERE?department_id='D002'
)
2,ALL運算符的用法
ALL用法: ALL()
用法說明:滿足子查詢中所有值的記錄
對Sales數據庫,列出部門編號為D001的員工,這些員工的工資比部門為D002的員工的最高工資還要高的員工的編號和工資
SELECT employee_id,wages FROM employee
WHERE department_id='D001' AND wages>ALL
(?SELECT wages
FROM?employee
WHERE?department_id='D002'
)
3,IN運算符的用法
IN用法:IN< 結果集合>或者IN()
用法說明:字段內容是結果集合或者子查詢中的內容
對Sales數據庫,列出部門為市場部或銷售部的所有員工的編號
SELECT employee_id FROM employee
WHERE department_id?IN
(?SELECT department_id FROM department
WHERE?department_name='市場部'?OR
department_name='銷售部'
)
IN是屬于的意思等價于“=ANY”,即等于子查詢中任何一個值。
連接查詢
通過連接運算符可以實現多個表查詢,連接可以在SELECT語句的WHERE子句中建立
對Sales數據庫輸出所有員工的銷售單,要求給出員工編號,姓名,商品編號,商品名和銷售數量。
SELECT
employee.employee_id,employee.employee_name,goods.goods_id,goods.goods_name,sell_order.order_num
FROM?employee,sell_order,goods
WHERE employee.employee_id=sell_order.employee_id and
sell_order.goods_id=goods.goods_id
以上語句中,由于員工編號,商品編號等字段名在兩個表出現,為防止二義性,在使用時在其字段前加上表明以示區別(如果字段名唯一,可以不加表名),但表明一般輸入時比較麻煩,所以在語句中,可在FROM子句中給相關表定義別名,以利于在查詢其他部分中是使用。
連接也可以在FROM子句中建立,而且在FROM子句中指出連接時有助于將連接操作與WHERE子句中的搜索條件區分開來。所以,在Transact-SQL中推薦使用這種方法。FROM子句建立連接的語法格式如下:
FROM join_table [join_type] JOIN join_table ON join_condition
各選項含義如下:
join_table:指出參與連接操作的表名,連接可以對同一個表操作,也可以對多表操作,對同一個表的鏈接又稱為自連接。
join_type:指出連接類型,可分為3類:內連接,外連接和交叉連接
內連接:使用比較運算符進行表間某(些)列數據的比較操作,并列出這些表中與連接條件相匹配的數據行,根據所使用的比較方式不同,內連接又可以分為等值連接,不等值連接,自然連接3種
外連接:分為左外連接,右外連接和全外連接3種,與內連接不同的是,外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時),右表(右外連接時)或兩個表(全外連接時)中所有符合搜索的數據行。
交叉連接沒有WHERE子句,他返回外連接表中所有數據行的笛卡爾積,其結果集合中的數據行數等于第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
ON join_condition:指出連接條件,它由被連接表中的列和比較運算符,邏輯運算符等構成
上例用FROM子句建立如下:
SELECT
a.employee_id,a.employee_name,c.goods_id,c.goods_name,b.order_num
FROM?employee a INNER JOIN
sell_order b ON a.employee_id=b.employee_id INNER JOIN
goods c ON b.goods_id=c.goods_id
內連接
1,等值連接
在連接條件中使用等號運算符比較被連接列的值,按對應列的共同值講一個表中的記錄與另一個表中記錄相連接,包括其中的重復列。
Sales數據庫中部門表department和員工表employee的等值連接
SELECT *
FROM department INNER JOIN
employee ON employee.department_id=department.department_id
2,不等值連接
在連接條件中使用除等于運算符以外的其他比較運算符比較背連接的列的列值。這些運算符包括>,>=,<=,,!
對Sales數據庫,列出銷售G00001產品的員工中,銷售數量大于編號為E001的員工銷售該類產品銷售數量的那些員工的編號和銷售數量。
SELECT a.employee_id,a.order_num
FROM sell_order a INNER JOIN
sell_order b ON a.order_num>b.order_num AND
a.goods_id=b.goods_id
WHERE (b.goods_id='G00001') AND (b.employee_id='E001')
在語句中,將sell_order看作a和b兩個獨立的表,b表中選出的編號為E001員工銷售G00001產品的記錄,a.order_num>b.order_num反映的是不等值聯接。
3,自然連接
在連接條件中使用等于(=)運算符比較被連接列的列值,它使用選擇列表方式來指出查詢結果集合中所包括的列,并刪除連接表中的重復列。
Sales數據庫中部門表department和員工表employee的自然連接
SELECT a.department_name,b.*
FROM?department a INNER JOIN
employee b ON b.department_id=a.department_id
外連接
1,使用左外連接
左外連接通過左向外連接引用左表的所用行
員工表左外連接銷售表sell_order
SELECT
a.employee_id,a.employee_name,b.goods_id,b.order_num,b.send_date
FROM employee a LEFT OUTER JOIN
sell_order b ON a.employee_id=b.employee_id
左外連接用于兩個表中,它限制表sell_order中的行,而不限制表employee中的行,也就是說,在左外連接中,表employee中不滿足條件的行也顯示出來。在返回結果中,所有不符合連接條件的數據行中的列值均為NULL。
2,使用右外連接
右外連接通過右向外連接引用右表的所有行
員工表employee右外連接銷售表sell_order
為了說明方便,現在sell_order表中插入一條銷售信息。
INSERT INTO
sell_order(order_id,goods_id,employee_id,customer_id,transporter_id,order_num,discount,order_date,send_date,arrival_date,cost)
VALUES('S00006','G00005','','C0006','T002',21,0.5,GETDATE(),GETDATE(),GETDATE(),100)
SELECT
a.employee_id,a.employee_name,b.goods_id,b.order_num,b.send_date,b.order_id
FROM employee a RIGHT OUTER
JOIN
sell_order b ON a.employee_id=b.employee_id
右外連接用于兩個表中,它不限制表sell_order中的行,而限制表employee中的行,也就是說,在右外連接中,表sell_order中不滿足條件的行也顯示出來。運行語句的輸出結果是銷售表sell_order中的所有記錄,員工表employee中符合和不符合連接條件的記錄以NULL替代。
3,使用全外連接
全外連接返回兩個表的所有行。不管兩個表的行是否滿足連接條件,均返回查詢結果集,對不滿足連接條件的記錄,另一個變胖相對應字段用NULL代替。
員工表employee全外連接銷售表sell_order
SELECT
a.employee_id,a.employee_name,b.goods_id,b.order_num,b.send_date,b.order_id
FROM employee a FULL OUTER JOIN
sell_order b ON a.employee_id=b.employee_id
交叉連接
交叉連接不帶WHERE子句,他返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等于第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。例如部門表department中有4個部門,而員工表employee中有7名員工,則下列交叉連接檢索到的記錄數將等于4*7=28行
SELECT
a.department_id,a.department_name,b.employee_id,b.employee_name
FROM department a CROSS JOIN
employee b
總結
以上是生活随笔為你收集整理的mysql连接与嵌套查询_数据库之嵌套查询与连接查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔兽世界 MPQ(MoPaQ) 文件相关
- 下一篇: cad插件_CAD插件坐标标注安装教程