from server sql 拼接统计两个子查询_4复杂查询-SQL
1 視圖
- 什么是視圖
視圖中存放的是SQL語句,客戶端使用視圖時,會運行視圖里的SQL語句創建出一張臨時表。
- 如何創建視圖
語法:
create view 視圖名稱(視圖列名1,視圖列名2) AS select 查詢語句;視圖語句中的視圖列名與select查詢語句中的列名對應;
舉例:
create view 按性別匯總(性別,人數) AS select 性別,count(*)as 人數 from student group by 性別;- 為何使用
l 一些SQL語句頻繁的需要使用,可以以表的形式保存在視圖。免除每次涉及時都需重新運作一遍SQL。尤其對于查詢數據較龐大時,可以幫助我們查詢提高效率。
l 視圖中的數據會根據原表數據更新同步
l 視圖不需要保存真是數據(只有SQL語句),減少數據保存空間。
- 如何使用
經常使用某個SQL語句(eg按性別匯總人數),可將其創建成視圖
每次涉及使用時,可在from子句中使用視圖名稱代替表名稱,直接使用,簡化SQL語句。
舉例:
Select 性別,人數 From 按性別匯總;---------此處為已存放在視圖表中的SQL現成語句的視圖表名稱注意事項:
1. 避免是視圖的基礎上再次創建視圖,會降低SQL的性能和使用效率;
2. 不能往視圖中插入數據,會發生報錯;
2 子查詢
- 什么是子查詢
嵌套在一個select語句中的另一個select語句;
可嵌套于where子句子句中,也可用于from子句中;
相較于視圖,子查詢用于不經常使用的SQL查詢情況下。
在from子句中直接寫定義視圖的sql查詢語句。
舉例: Select 性別,人數 From (select 性別,count(*)as 人數From studentgroupby 性別) as 按性別匯總;SQL運行時先運行子查詢。形成一個臨時表,放在from子句中二次運行,得到最終的查詢結果。
子查詢在where子句中,與 in(子查詢)any/some(子查詢)all(子查詢)結合使用。
與比較運算符一起使用。
in(子查詢)
舉例:找出每個課程里成績最低的學號
any/some(子查詢)
舉例:哪些學生的成績比課程002里全部成績里的任意一個高呢
all(子查詢):
舉例:哪些學生的成績比課程002里全部成績里的都高呢
將any換成all
注意事項:
l a>3*all(b)為錯誤寫法(因為all(b)可能為合集或序列)---a/3>all(b)為正確寫法
l 減少層層嵌套子查詢情況,會降低SQL性能及使用銷量,且容易出錯。
l as子查詢名稱最好避免省略,便于后期理解。
3 標量子查詢
什么是標量子查詢
子查詢的結果返回為單一值(eg:平均成績只有一個)。
可用于select 子句中:
舉例:大于平均成績的學號和成績
/*第一步:計算平均成績(此為第二步的子查詢,只有單一值) select avg(成績) from score; 第二步:計算大于第一步里平均成績的學號和對應成績 select 學號,成績 from score where 成績>(select avg(成績) from score);可用于where子句中:
舉例 計算平均成績并將平均成績字段添加
舉例:計算介于差生平均成績(成績<=60)及優等生平均成績(成績>80,其它學生成績情況
4 關聯子查詢
定義:在子查詢里面有關聯條件,實現組內的比較查詢。
如何使用:
/* 查詢出每個課程中大于對應課程平均成績的學生 第一步:計算每門課程的平均成績 Select avg(成績) from score group by 課程號 第二步:找的大于平均存款的學號 select 學號,課程號,成績 from score where 條件(某行學生成績高于平均成績) */ select 學號,課程號,成績 from score as s1 where 成績>( Select avg(成績) from score as s2 where s1.課程號=s2.課程號 group by 課程號);5 如何使用SQL解決業務問題
三步分析法:
- 將問題翻譯成易懂模式
- 寫出分析思路
- 寫出SQL語句
如何排查SQL報錯信息
可從子查詢由內而外排查,先選中子查詢運行看是否錯誤等;
6 各種函數
匯總函數:count,sum,avg,max,min;
算數函數:
字符串函數:
日期函數:
7 SQLZOO練習
SELECT within SELECT Tutorial/zh?sqlzoo.net世界國家信息表
1.列出符合條件的國家名稱,條件:國家人口大于俄羅斯(Russia)的人口
【知識點】標量子查詢
/*第一步:計算俄羅斯人口作為輸出只有唯一值得標量子查詢 第二步:列出符合條件的國家名稱*/2.列出歐洲每個國家的人均GDP,其中人均GDP要高于英國(United Kingdom)
【知識點】比較運算符(人均GDP=GDP/人口),邏輯運算符(and),標量子查詢
3.在阿根廷(Argentina)和澳大利亞(Australia)所在的洲份中的國家有哪些?查找出國家名稱和洲名稱,并按國家名稱排序
【知識點】在運算符in里使用子查詢
4.查找符合下面條件的國家名稱和人口:國家的人口比加拿大(Canada)的多,但比波蘭(Poland)的少
【知識點】在運算符between里使用標量子查詢,這里用between查找出的范圍邊界值包括了邊界值,所以要+1,和-1去掉邊界值
比如范圍是 1=<x<=10,(其中1是加拿大人口,10是波蘭人口),為了不包括邊界值,需要去掉兩個邊界值,變成 1+1=<x<= (10-1)
5.德國(Germany)在歐洲(Europe)國家的人口最多。奧地利(Austria)擁有德國總人口的11%。(重點理解審題)
查找歐洲的國家名稱和每個國家的人口,其中人口以德國人口的百分比來顯示人口數
【知識點】標量子查詢,字符串連接函數concat,浮點數保留多少位round函數
concat函數:字符串連接函數
round函數:對指定數值進行四舍五入,并保留指定位數
6.哪些國家的GDP比歐洲(Europe)的全部國家都要高呢? (有些國家的記錄中,GDP是空值NULL,沒有填入資料)
【知識點】all的用法,子查詢,條件中gdp>0用來去掉空值的情況
7.在每一個州中找出最大面積的國家,查找出洲, 國家名字,面積。 (有些國家的記錄中,面試是空值NULL,沒有填入資料)
【知識點】all的用法,關聯子查詢
8.列出洲份名稱和國家名稱,其中每個洲只取出一個國家(條件:該國家排序在這個洲的首位)
【知識點】all的用法,關聯子查詢
9.找出符合條件的洲和國家名稱,條件:該洲中的全部國家人口都有少于或等于 25000000 人口)
10.有些國家的人口是同洲份的所有其他國的3倍或以上。列出這些國家的名稱和洲
重點理解審題
/*第一步:計算各州份所有國家三倍人口情況 第二步 計算同洲份大于其他國家人數三倍以上的國家及大洲*/總結
以上是生活随笔為你收集整理的from server sql 拼接统计两个子查询_4复杂查询-SQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++宏定义常量为什么使用移位_干货 |
- 下一篇: autojs怎么post协议_超9成人都