1. 程式人生 > >圖解SQL子查詢例項

圖解SQL子查詢例項

1 建立示例表

先建立示例表;

-------------------------
-- Create Customers table
-------------------------
CREATE TABLE Customers
(
  cust_id      char(10)  NOT NULL ,
  cust_name    char(50)  NOT NULL ,
  cust_address char(50)  NULL ,
  cust_city    char(50)  NULL ,
  cust_state   char(5)   NULL ,
  cust_zip     char(10)  NULL ,
  cust_country char(50)  NULL ,
  cust_contact char(50)  NULL ,
  cust_email   char(255) NULL 
);

--------------------------
-- Create OrderItems table
--------------------------
CREATE TABLE OrderItems
(
  order_num  int          NOT NULL ,
  order_item int          NOT NULL ,
  prod_id    char(10)     NOT NULL ,
  quantity   int          NOT NULL ,
  item_price decimal(8,2) NOT NULL 
);

----------------------
-- Create Orders table
----------------------
CREATE TABLE Orders
(
  order_num  int      NOT NULL ,
  order_date datetime NOT NULL ,
  cust_id    char(10) NOT NULL 
);

------------------------
-- Create Products table
------------------------
CREATE TABLE Products
(
  prod_id    char(10)      NOT NULL ,
  vend_id    char(10)      NOT NULL ,
  prod_name  char(255)     NOT NULL ,
  prod_price decimal(8,2)  NOT NULL ,
  prod_desc  varchar(1000) NULL 
);

-----------------------
-- Create Vendors table
-----------------------
CREATE TABLE Vendors
(
  vend_id      char(10) NOT NULL ,
  vend_name    char(50) NOT NULL ,
  vend_address char(50) NULL ,
  vend_city    char(50) NULL ,
  vend_state   char(5)  NULL ,
  vend_zip     char(10) NULL ,
  vend_country char(50) NULL 
);

----------------------
-- Define primary keys
----------------------
ALTER TABLE Customers WITH NOCHECK ADD CONSTRAINT PK_Customers PRIMARY KEY CLUSTERED (cust_id);
ALTER TABLE OrderItems WITH NOCHECK ADD CONSTRAINT PK_OrderItems PRIMARY KEY CLUSTERED (order_num, order_item);
ALTER TABLE Orders WITH NOCHECK ADD CONSTRAINT PK_Orders PRIMARY KEY CLUSTERED (order_num);
ALTER TABLE Products WITH NOCHECK ADD CONSTRAINT PK_Products PRIMARY KEY CLUSTERED (prod_id);
ALTER TABLE Vendors WITH NOCHECK ADD CONSTRAINT PK_Vendors PRIMARY KEY CLUSTERED (vend_id);

----------------------
-- Define foreign keys
----------------------
ALTER TABLE OrderItems ADD
CONSTRAINT FK_OrderItems_Orders FOREIGN KEY (order_num) REFERENCES Orders (order_num),
CONSTRAINT FK_OrderItems_Products FOREIGN KEY (prod_id) REFERENCES Products (prod_id);
ALTER TABLE Orders ADD 
CONSTRAINT FK_Orders_Customers FOREIGN KEY (cust_id) REFERENCES Customers (cust_id);
ALTER TABLE Products ADD
CONSTRAINT FK_Products_Vendors FOREIGN KEY (vend_id) REFERENCES Vendors (vend_id);

---------------------------
-- Populate Customers table
---------------------------
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES('1000000001', 'Village Toys', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'John Smith', '
[email protected]
'); INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact) VALUES('1000000002', 'Kids Place', '333 South Lake Drive', 'Columbus', 'OH', '43333', 'USA', 'Michelle Green'); INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email) VALUES('1000000003', 'Fun4All', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', '
[email protected]
'); INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email) VALUES('1000000004', 'Fun4All', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'USA', 'Denise L. Stephens', '[email protected]'); INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact) VALUES('1000000005', 'The Toy Store', '4545 53rd Street', 'Chicago', 'IL', '54545', 'USA', 'Kim Howard'); ------------------------- -- Populate Vendors table ------------------------- INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country) VALUES('BRS01','Bears R Us','123 Main Street','Bear Town','MI','44444', 'USA'); INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country) VALUES('BRE02','Bear Emporium','500 Park Street','Anytown','OH','44333', 'USA'); INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country) VALUES('DLL01','Doll House Inc.','555 High Street','Dollsville','CA','99999', 'USA'); INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country) VALUES('FRB01','Furball Inc.','1000 5th Avenue','New York','NY','11111', 'USA'); INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country) VALUES('FNG01','Fun and Games','42 Galaxy Road','London', NULL,'N16 6PS', 'England'); INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country) VALUES('JTS01','Jouets et ours','1 Rue Amusement','Paris', NULL,'45678', 'France'); -------------------------- -- Populate Products table -------------------------- INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc) VALUES('BR01', 'BRS01', '8 inch teddy bear', 5.99, '8 inch teddy bear, comes with cap and jacket'); INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc) VALUES('BR02', 'BRS01', '12 inch teddy bear', 8.99, '12 inch teddy bear, comes with cap and jacket'); INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc) VALUES('BR03', 'BRS01', '18 inch teddy bear', 11.99, '18 inch teddy bear, comes with cap and jacket'); INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc) VALUES('BNBG01', 'DLL01', 'Fish bean bag toy', 3.49, 'Fish bean bag toy, complete with bean bag worms with which to feed it'); INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc) VALUES('BNBG02', 'DLL01', 'Bird bean bag toy', 3.49, 'Bird bean bag toy, eggs are not included'); INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc) VALUES('BNBG03', 'DLL01', 'Rabbit bean bag toy', 3.49, 'Rabbit bean bag toy, comes with bean bag carrots'); INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc) VALUES('RGAN01', 'DLL01', 'Raggedy Ann', 4.99, '18 inch Raggedy Ann doll'); INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc) VALUES('RYL01', 'FNG01', 'King doll', 9.49, '12 inch king doll with royal garments and crown'); INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc) VALUES('RYL02', 'FNG01', 'Queen doll', 9.49, '12 inch queen doll with royal garments and crown'); ------------------------ -- Populate Orders table ------------------------ INSERT INTO Orders(order_num, order_date, cust_id) VALUES(20005, '2012-05-01', '1000000001'); INSERT INTO Orders(order_num, order_date, cust_id) VALUES(20006, '2012-01-12', '1000000003'); INSERT INTO Orders(order_num, order_date, cust_id) VALUES(20007, '2012-01-30', '1000000004'); INSERT INTO Orders(order_num, order_date, cust_id) VALUES(20008, '2012-02-03', '1000000005'); INSERT INTO Orders(order_num, order_date, cust_id) VALUES(20009, '2012-02-08', '1000000001'); ---------------------------- -- Populate OrderItems table ---------------------------- INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20005, 1, 'BR01', 100, 5.49); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20005, 2, 'BR03', 100, 10.99); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20006, 1, 'BR01', 20, 5.99); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20006, 2, 'BR02', 10, 8.99); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20006, 3, 'BR03', 10, 11.99); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20007, 1, 'BR03', 50, 11.49); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20007, 2, 'BNBG01', 100, 2.99); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20007, 3, 'BNBG02', 100, 2.99); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20007, 4, 'BNBG03', 100, 2.99); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20007, 5, 'RGAN01', 50, 4.49); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20008, 1, 'RGAN01', 5, 4.99); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20008, 2, 'BR03', 5, 11.99); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20008, 3, 'BNBG01', 10, 3.49); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20008, 4, 'BNBG02', 10, 3.49); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20008, 5, 'BNBG03', 10, 3.49); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20009, 1, 'BNBG01', 250, 2.49); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20009, 2, 'BNBG02', 250, 2.49); INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20009, 3, 'BNBG03', 250, 2.49);


示例表的建立和插入資料指令碼可從此頁底部下載;

http://www.forta.com/books/0672336073/

以下是Customers和Orders表的情況;

2 獨立單值子查詢(獨立標量子查詢)

         子查詢返回的是單個值,而不是資料集

select * 
  from customers as C
  where C.cust_id=(
  select O.cust_id from Orders as O where O.order_num = 20008
 );


注:使用單值獨立子查詢時,一定要保證子查詢返回的是單個值,而不是資料集;
       若返回的是資料集,則會出現如下狀況:

3 獨立多值子查詢

         子查詢返回的是資料集

select * 
 from customers as C
 where C.cust_id IN(
  select O.cust_id from Orders as O where O.order_num between 20005 and 20007
 ); 

4 相關子查詢

      相關子查詢最基本的執行邏輯是:將外部表中的 “每一行” 逐行代入到子查詢中   (理解相關子查詢的關鍵)

select * 
  from Customers as C
  where exists (
     select * from  Orders as O
     where O.cust_id=C.cust_id and (O.order_num between 20005 and 20008)
 ); 

5 作為計算欄位使用子查詢

統計顧客名字,顧客所在的州,顧客的訂單數;

select cust_name,cust_state,
(select COUNT(*) from Orders where Orders.cust_id=Customers.cust_id) as Orders
from Customers
order by cust_name;

第三列是子查詢,統計每個顧客的訂單數;

第三列的子查詢單獨執行情況如下;

select COUNT(*) from Orders where cust_id='1000000001';

相關推薦

圖解SQL查詢例項

1 建立示例表 先建立示例表; ------------------------- -- Create Customers table ------------------------- CREATE TABLE Customers ( cust_id cha

mysql 複雜sql查詢例項

在我們的實際專案中,有時候需要寫一下資料彙總和查詢,哪麼子查詢就必不可少。 比如我現在有三張表: lch_resource_attribute,idx_lch_resource_category,lch_resource_games 那麼我現在要查詢某個應用的子分類的話,用

sql查詢

編寫 min style side lower any 編號 示例 操作 子查詢就是指的在一個完整的查詢語句之中,嵌套若幹個不同功能的小查詢,從而一起完成復雜查詢的一種編寫形式,為了讓讀者更加清楚子查詢的概念。子查詢返回結果子查詢可以返回的數據類型一共分為四種:單行單列:返

SQL 查詢

單個 調用 不依賴 相關子查詢 date 1.2 like p s tid SQL支持在查詢中編寫查詢,或者嵌套其他查詢。最外層查詢的結果集會返回給調用者,稱為外部查詢。內部查詢的結果是提供給外部查詢使用的,也成為子查詢。 子查詢可以分為獨立子查詢和相關子查詢兩類。獨立子

【沫沫金】Sql查詢Not In 無結果原因

空值 blog mar 執行 sel ges 期望 ima 數值 背景源碼 select * from ITEM where item_id not in (select parent_item_id from ITEM ) 查詢效果 無任何匹配值。。。 原因 not in

sql查詢 嵌套SELECT實用語句

exp ring union res pda als 老師 效果 存在 嵌套SELECT語句也叫子查詢,一個 SELECT 語句的查詢結果能夠作為另一個語句的輸入值。子查詢不但能夠出現在Where子句中,也能夠出現在from子句中,作為一個臨時表使用,也能夠出現在selec

sql查詢 order by失效問題

一、問題描述  三表聯合查詢  按主表的時間倒敘並分頁   下面sql語句 ORDER BY失效 ,如果把 ORDER BY  放在最後 比如有20條資料 第一頁會是10 -1 第二頁是20-11  分頁不正確   查詢資料發現:在my

SQL查詢、相關子查詢

子查詢 子查詢是巢狀在其他查詢中的查詢。子查詢總是從內向外處理。 注意: 1、在使用子查詢時儘量把子查詢分解為多行並且適當進行縮排,能極大的簡化子查詢的使用。 2、不能巢狀太多的子查詢,這樣會降低效能。 3、在WHERE子句中使用子查詢,應該保證SELECT語句具有

mysql buglist上關於SQL查詢注入的郵件列表

[11 Aug 2016 15:38] Sinisa Milivojevic Hi! You are using rand() in both a select list and in the group list. That can create huge runtime

sql 查詢(mysql)

子查詢:一個查詢巢狀在另一個查詢當中;又叫內部查詢。 子查詢 可以分為: 單行單列(就是一個值) 單行多列(就是有一行,這一行有很多不同列資料) 多行單列(同一列不同的資料) 多行多列(可以說就是一張表了吧) 我們先來看單行單列的子查詢: SE

My SQL 查詢

 1.使用IN關鍵字的子查詢 例:查詢遊戲型別是“棋牌類”的遊戲的分數資訊     1.1過濾掉遊戲分數表中未包含遊戲型別的玩家     1.2思路一:採用連線查詢     1.3思路二:分兩步進行,

sql查詢中引用無效物件名

select AA.GoodsID from (  select A.GoodsID,A.SerNum from  (select * from VStock where SerNum is not null) A   left join InStorage_Record 

sql查詢用法

 在資料庫的查詢過程中,可能經常要用到子查詢的情況,用得較多的可能是巢狀子查詢,最近查資料時發現還有另外一種方法,就是在from子句中使用子查詢,也可以實現相同的效果,下面通過一個例項來講講這兩種方法的使用。 問題:查

SQL 特殊查詢例項 分組、編號、排序、行號

在資料庫查詢操作的時候,經常會遇到一些特殊的資料提取,比如按某些條件分組後,在組內排序附加租序號等等。 不多說直接上SQL: 表 TableName{A,B,C,D} TableName A   B   C   D a   1   a1  b1 b   1  

sql 查詢及基本語句 挺全的收錄

一、SQL子查詢語句      1、單行子查詢        select ename,deptno,sal        from emp        where deptno=(select deptno from dept where loc='NEW YORK');

SQL查詢總結

在一個SQL語句中巢狀另一個SQL語句成為子查詢。 當一個問題無法通過一部解決時可考慮使用子查詢,一個出現在SELECT語句的FROM子句中的子查詢被稱為"內嵌檢視";一個出現在SELECT語句的WHERE子句中的子查詢被稱為"內嵌子查詢",一個子查詢能夠包含另一個子查詢,

sql 查詢 踩坑

mil user 題解 數據 等等 單獨 語句 事情 acc   某個月黑風高的夜,手機的嗡嗡聲提示收到一條短信,半睡半醒間打開手機查看,一條日誌告警的信息使我睡意全無。   掀被、起床、喚醒電腦,開始了一個程序員的填坑日常。   有一個sql: selec

SQL Server溫故系列(3):SQL 查詢 & 公用表表達式 CTE

1、子查詢 Subqueries 1.1、單行子查詢 1.2、多行子查詢 1.3、相關子查詢 1.4、巢狀子查詢 1.5、子查詢小結及效能問題 2、公用表表達式 CTE 2.1、普通公用表表達式 2.2、遞迴公用表表達式 3、本文小結 1、子查詢 Subqueries 子查詢是一個巢狀在 SELE

SQL實戰:查詢的應用例項

本例項設計到的SQL語法包括: select , delete, distict, not exists, not in, group by, having, min, max 建立成績表:

關於T-SQL中exists或者not exists查詢的“偽優化”的做法

png tro ges width 9.png 當前 color 盡心 alt 問題起源 在使用t-sql中的exists(或者not exists)子查詢的時候,不知道什麽時候開始,發現一小部分人存在一種“偽優化”的一些做法,並且向不明真相