.net函数查询_数据分析-SQL-复杂查询
內容簡介:
- 視圖
- 子查詢
- 標量子查詢
- 關聯子查詢
- 各種函數
- 練習題
- 總結
一.視圖
1.1 視圖是什么?
數據庫里面有很多表,表里放的是實際數據,視圖中存放的是SQL查詢語句,當我們用客戶端(例如navicat)連接到數據庫使用視圖的時候,視圖會運行視圖里面的SQL查詢語句從表里面查詢出數據保存到一張臨時表里面,為什么叫臨時表呢?因為當客戶端與數據庫的連接斷開后這張臨時表會被自動刪除掉,所以他不是保存在數據庫里的表,是臨時的,所以叫臨時表,所以,視圖它本身不存放數據,它存放的是SQL查詢語句
create view <視圖名>(列名1,列名2,......)
as
(select 語句)
要注意的是,視圖后面的列名 要于 select 后面的 列名 一一對應
creat view 按性別匯總 (性別,人數) as select 性別,count(*)as 人數 from student group by 性別;
如何創建視圖:
- 刪除視圖:drop view<視圖名>
- 視圖的限制: 不能用order by 語句定義視圖,沒有經過聚合匯總,未使用distinct 的視圖才 能進行刷新
1.2視圖如何使用用?
select 性別,人數 from 按性別匯總; (用視圖名稱代替表名稱)刪除視圖:客戶端--視圖---按性別匯總-刪除(右鍵)
1.3 視圖有什么用?
如果工作中要頻繁使用某些查詢 那就用視圖保存數據 可以節省存放空間 尤其要運行復雜和運算量大的查詢的時候 有了視圖就能節省不少時間了
1.4 視圖使用要注意什么?
1.避免在視圖的基礎上在創建視圖,多重視圖會降低SQL的性能和效率
2.不能忘視圖里面插入數據,不然會報錯
二.子查詢
2.1 什么是子查詢?
子查詢是一次性的視圖,在一個select 語句中再嵌套一個select查詢語句
子查詢是一次性的臨時表 不像視圖那樣保存在硬盤里所以當SQL查詢語句運行結束以后它就被清除掉了
當SQL查詢語句里面有子查詢的時候第一步會先運行子查詢語句得到一張臨時表,第二步將第一步運行到的結果將用于外部的查詢語句中
2.2 如何使用自查詢?
1.可以出現在from子句中,作為一個臨時表使用
Select (列名) From (Select 列名From 表名)
舉例:從該表中篩選出 總成績大于240分的學生,成績
思路:我們首先要匯總成每個學生sid的總成績做為基礎表(子查詢),在從這個基礎表里篩選出總成績>240的記錄; 代碼如下:
select sid ,score_2 from (select sid ,sum(score) as score_2 from sc group by sid) t where score_2 >240 ;- 2.子查詢可以出現在Where子句中,作為過濾條件;(in ,any ,all)
where in (子查詢)
舉例 1:成績在60分以上的學生ID 的 總成績 ,
思路:我們要先選出成績在60分以上的學生ID,在對這些ID的學生的成績 進行匯總
select sid ,sum(score ) from sc where sid in (select sidfrom sc where score >60) group by sid;where any(子查詢),別擔心,練習題里有案例
any和all :必須與比較運算符一起使用;
any (子查詢) sum(子查詢) 相同,滿足子查詢里面的人一個元素就可以
select 列名1 from 表名1 where 列名1>any (子查詢);
where any(子查詢),別擔心,練習題里有案例
where all all跟 any相反 要滿足所有子查詢里的條件
3.能夠出現在select list中,作為一個字段值來返回
Select 列名, (Select 列名From 表名) From 表名 Where 列操作符
舉例:學生的'01'課程成績,總體成績, 以及其占總體成績的比例
select sid,cid ,score ,(select sum(score) from sc ) as total_score, score /(select sum(score) from sc ) as rate from sc where cid ='01' ;2.3子查詢有什么用?
根據你的使用母的,頻繁使用的查詢可以用視圖,偶爾使用的查詢可以用子查詢
2.4 子查詢要注意什么?
盡量避免多層嵌套子查詢
三.標量子查詢
- 3.1 標量子查詢是什么?
返回單一值且只能是但一值的子查詢叫標量子查詢
例如:我們會常常遇到這樣的問題,求出平均成績大于(60分)及格線的學生,看上去題面很簡單啊,只需要 select sid from sc where avg(score)>60,你會發現報錯; 因為where 語句不能做匯總查詢,怎么辦呢?這個時候就可以用到 標量子查詢了
- 3.2 標量子查詢怎么使用?
where+標量子查詢:
上述例子中只需要把代碼調成成:
select distinct sid ,avg(score) from sc where score >(select avg(score) from sc ) group by sid;select +標量子查詢:
例子2.求每個學生的平均成績、整體平均成績成績
select sid ,avg(score) ,(select avg(score) from sc ) as avg_2 from sc t1 group by sid;- 3.3 標量子查詢有什么用?
普通的子查詢返回的是多行值或者單一值,標量子查詢是但一直且只能是但一直,
因為返回的是單一的值,所以可以跟運算符一起使用(in ,any, all,between )實現復雜的查詢。
- 3.4 標量子查詢應注意什么?
標量子查詢不能求多行值,
圖中的例子 子查詢錯誤原因是,用group by 后 其結果會查詢出多行值;
四.關聯子查詢
- 4.1關聯子查詢是什么?
我們會遇到組內查詢的情況:查詢出 每個課程中大于該課程平均成績的學生
各科平均成績各科學生成績解題思路:
- 我們要在01課程這個組里篩選出成績大于 變量1(01課程的平均成績64.5 )的學生;
- 我們要在02課程這個組里篩選出成績大于 變量2(02課程的平均成績72.66)的學生;
- 我們要在03課程這個組里篩選出成績大于 變量3(03課程的平均成績68.5)的學生;
這種情況下就要用到關聯子查詢了。
- 4.2 關聯子查詢怎么使用?
每個課程中 高于課程平均成績的 學生sid 、cid、score
select cid,sid,score from sc t1 where score> (select avg(score) from sc t2where t1.cid=t2.cidgroup by cid) group by cid ,sid ;- 4.3 關聯子查詢有什么用?
在每個組里進行組內行比較
五.各種函數
函數的用處不言而喻,我們先簡單了解下函數,以后的應用中慢慢涉及
常用的函數有:匯總函數,算術函數,字符串函數,日期函數
六.練習題
網址:https://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial;
1.列出每個國家的名字name,當中人口population是高於俄羅斯'Russia'的人口。
SELECT name FROM worldWHERE population >(SELECT population FROM worldWHERE name='Russia')2.列出歐州每國家的人均GDP,當中人均GDP要高於英國'United Kingdom'的數值。
用到了標量子查詢,先找出英國'United Kingdom'的人均GDP(單一值): (select gdp/population from world where name='United Kingdom') ;在用這個GDP的值做為篩選條件進行查詢
select name from world where continent = 'Europe' and gdp/population > (select gdp/population from world where name='United Kingdom');3.在阿根廷Argentina及 澳大利亞Australia所在的洲份中,列出當中的國家名字name及洲分continent。按國字名字順序排序
select name , continent from world where continent in (select continent from world where name in ('Argentina','Australia')) order by name;4.哪一個國家的人口比加拿大Canada的多,但比波蘭Poland的少?列出國家名字name和人口population 。
select name ,population from world where population >(select population from world where name = 'Canada') and population <(select population from world where name = 'Poland');5.Germany德國(人口8000萬),在Europe歐洲國家的人口最多。Austria奧地利(人口850萬)擁有德國總人口的11%。
顯示歐洲的國家名稱name和每個國家的人口population。以德國的人口的百分比作人口顯示。
select name ,concat(round(population/(select population from world where name = 'Germany')*100,0),'%')as rate from world where continent = 'Europe';6.哪些國家的GDP比Europe歐洲的全部國家都要高呢? [只需列出name。] (有些國家的記錄中,GDP是NULL,沒有填入資料的。)
SELECT nameFROM worldWHERE GDP > ALL(SELECT GDPFROM worldWHERE continent = 'Europe' AND GDP >0)7.在每一個州中找出最大面積的國家,列出洲份continent, 國家名字name及面積area。 (有些國家的記錄中,AREA是NULL,沒有填入資料的。) -
SELECT continent ,name, area FROM world xWHERE area >= ALL(SELECT area FROM world yWHERE y.continent=x.continentAND area>0)8.列出洲份名稱,和每個洲份中國家名字按子母順序是排首位的國家名。(即每洲只有列一國)
字符串排序用A-Z的順序 做為大小排序
select continent,name from world s1 where name <= all(select name from world s2 where s1.continent=s2.continent)9.找出洲份,當中全部國家都有少於或等於 25000000 人口. 在這些洲份中,列出國家名字name,continent洲份和population人口。
select name, continent, population from world as A where 25000000 >= all (select population from world as B where A.continent=B.continent);10.有些國家的人口是同洲份的所有其他國的3倍或以上。列出 國家名字name 和 洲份 continent。
SELECT name ,continent from world A where population >=all (select 3*population from world Bwhere A.continent=B.continent and A.name <> B.name);七.總結:
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的.net函数查询_数据分析-SQL-复杂查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql update 多个字段_My
- 下一篇: 木瓜奶冻怎么做?