當前位置:首頁 » 編程語言 » sql中where從句
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql中where從句

發布時間: 2022-08-20 09:50:28

sql語句的作用是什麼

資料庫對話

SQL介紹:

本書假設你是在SQL操作Microsoft SQL Sever 的資料庫。你也可以用SQL操作許多其它類型的資料庫。SQL是操作資料庫的標准語言。(事實上,關於SQL語言有一個專門的ANSI標准〕

注意:

不要在你的站點上試圖用Microsoft Access代替Microsoft SQL Sever。SQL Sever可以同時服務於許多用戶,如果你希望你的站點有較高的訪問率,MS Access是不能勝任的。

在學習SQL的細節之前,你需要理解它的兩大特點。一個特點容易掌握,另一個掌握起來有點困難。

第一個特點是所有SQL資料庫中的數據都存儲在表中。一個表由行和列組成。例如,下面這個簡單的表包括name 和e-mail address:

Name Email Address

................................................................

Bill Gates [email protected]

president Clinton [email protected]

Stephen Walther [email protected]

這個表有兩列(列也稱為欄位,域〕:Name和Email Address。有三行,每一行包含一組數據。一行中的數據組合在一起稱為一條記錄。

無論何時你向表中添加新數據,你就添加了一條新記錄。一個數據表可以有幾十個記錄,也可以有幾千甚至幾十億個記錄。雖然你也許永遠不需要存儲十億個Email地址,但知道你能這樣做總是好的,也許有一天你會有這樣的需要。

你的資料庫很有可能包含幾十個表,所有存儲在你資料庫中的信息都被存儲在這些表中。當你考慮怎樣把信息存儲在資料庫中時,你應該考慮怎樣把它們存儲在表中。

SQL的第二個特點有些難於掌握。這種語言被設計為不允許你按照某種特定的順序來取出記錄,因為這樣做會降低SQL Sever取記錄的效率。使用SQL,你只能按查詢條件來讀取記錄。

當考慮如何從表中取出記錄時,自然會想到按記錄的位置讀取它們。例如,也許你會嘗試通過一個循環,逐個記錄地掃描,來選出特定的記錄。在使用SQL時,你必須訓練自己,不要有這種思路。

假如你想選出所有的名字是「Bill Gates」的記錄,如果使用傳統的編程語言,你也許會構造一個循環,逐個查看錶中的記錄,看名字域是否是「Bill Gates」。

這種選擇記錄的方法是可行的,但是效率不高。使用SQL,你只要說,「選擇所有名字域等於Bill Gates的記錄」,SQL就會為你選出所有符合條件的記錄。SQL會確定實現查詢的最佳方法。

建設你想取出表中的前十個記錄。使用傳統的編程語言,你可以做一個循環,取出前十個記錄後結束循環。但使用標準的SQL查詢,這是不可能實現的。從SQL的角度來說,在一個表中不存在前十個記錄這種概念。

開始時,當你知道你不能用SQL實現某些你感覺應該能實現的功能,你會受到挫折。你也許會以頭撞牆甚至想寫惡毒的信件給SQL的設計者們。但後來你會認識到,SQL的這個特點不僅不是個限制,反而是其長處。因為SQL不根據位置來讀取記錄,它讀取記錄可以很快。

㈡ db2中sql語句的where從句 不等於怎麼寫

sql中有兩種方式表示不等於,一種是"<>"(不含引號),另一種是"!="(不含引號),用法是一樣的。操作方法如下:

1、首先,向資料庫表中插入數據。

㈢ impala怎麼解析sql語句

Impala的SQL解析與執行計劃生成部分是由impala-frontend(Java)實現的,監聽埠是21000。用戶通過Beeswax介面BeeswaxService.query()提交一個請求,在impalad端的處理邏輯是由void ImpalaServer::query(QueryHandle& query_handle, const Query& query)這個函數(在impala-beeswax-server.cc中實現)完成的。
在impala中一條SQL語句先後經歷BeeswaxService.Query->TClientRequest->TExecRequest,最後把TExecRequest交由impala-coordinator分發給多個backend處理。本文主要講一條SQL語句是怎麼一步一步變成TExecRequest的。
本文以下內容都以這樣的一個SQL為例說明:
select jobinfo.dt,user,
max(taskinfo.finish_time-taskinfo.start_time),
max(jobinfo.finish_time-jobinfo.submit_time)
from taskinfo join jobinfo on jobinfo.jobid=taskinfo.jobid
where jobinfo.job_status='SUCCESS' and taskinfo.task_status='SUCCESS'
group by jobinfo.dt,user

通過調用Status ImpalaServer::GetExecRequest(const TClientRequest& request, TExecRequest* result) 函數把TClientRequest轉化成TExecRequest
在這個函數里通過JNI介面調用frontend.createExecRequest()生成TExecRequest。首先調用AnalysisContext.analyze(String stmt)分析提交的SQL語句。
注釋:Analyzer對象是個存放這個SQL所涉及到的所有信息(包含Table, conjunct, slot,slotRefMap, eqJoinConjuncts等)的知識庫,所有跟這個SQL有關的東西都會存到Analyzer對象裡面。
1,SQL的詞法分析,語法分析
AnalysisContext.analyze(String stmt)會調用SelectStmt.analyze()函數,這個函數就是對SQL的analyze和向中央知識庫Analyzer register各種信息。
(1)處理這個SQL所涉及到的Table(即TableRefs),這些Table是在from從句中提取出來的(包含關鍵字from, join, on/using)。注意JOIN操作以及on/using條件是存儲在參與JOIN操作的右邊的表的TableRef中並分析的。依次analyze()每個TableRef,向Analyzer注冊registerBaseTableRef(填充TupleDescriptor)。如果對應的TableRef涉及到JOIN操作,還要analyzeJoin()。在analyzeJoin()時會向Analyzer registerConjunct()填充Analyzer的一些成員變數:conjuncts,tuplePredicates(TupleId與conjunct的映射),slotPredicates(SlotId與conjunct的映射),eqJoinConjuncts。本例中on從句是一種BinaryPredicate,然後onClause.analyze(analyzer)會遞歸analyze這個on從句里的各種組件。
(2)處理select從句(包含關鍵字select, MAX(), AVG()等聚集函數):分析這個SQL都select了哪幾項,每一項都是個Expr類型的子類對象,把這幾項填入resultExprs數組和colLabels。然後把resultExprs裡面的Expr都遞歸analyze一下,要分析到樹的最底層,向Analyzer注冊SlotRef等。
(3)分析where從句(關鍵字where),首先遞歸Analyze從句中Expr組成的樹,然後向Analyzer registerConjunct()填充Analyzer的一些成員變數(同1,此外還要填充whereClauseConjuncts) 。
(4)處理sort相關信息(關鍵字order by)。先是解析aliases和ordinals,然後從order by後面的從句中提取Expr填入orderingExprs,接著遞歸Analyze從句中Expr組成的樹,最後創建SortInfo對象。
(5)處理aggregation相關信息(關鍵字group by, having, avg, max等)。首先遞歸分析group by從句里的Expr,然後如果有having從句就像where從句一樣,先是analyze having從句中Expr組成的樹,然後向Analyzer registerConjunct()等。
(6)處理InlineView。
關於SQL解析中所涉及到的各種數據結構表示如下:

至此詞法分析,語法分析結束,有點像一個小的編譯器。我們現在回到frontend.createExecRequest()函數中。調用完AnalysisContext.analyze()之後,就開始填充TExecRequest內的成員變數。
(1)如果是DDL命令(use, show tables, show databases, describe),那麼調用createDdlExecRequest();
(2)另外一種情況就是Query或者DML命令,那麼就得創建和填充TQueryExecRequest了。
2,根據SQL語法樹生成執行計劃(PlanNode和PlanFragment的生成)
下面就是用Planner把SQL解析出的語法樹轉換成Plan fragments,後者能在各個backend被執行。
Planner planner = new Planner();
ArrayListfragments =
planner.createPlanFragments(analysisResult, request.queryOptions);
這個createPlanFragments()函數是frontend最重要的函數:根據SQL解析的結果和client傳入的query options,生成執行計劃。執行計劃是用PlanFragment的數組表示的,最後會序列化到TQueryExecRequest.fragments然後傳給backend的coordinator去調度執行。
下面進入Planner.createPlanFragments()函數看看執行計劃是怎麼生成的:
首先要搞清楚兩個概念:PlanNode和PlanFragment。
PlanNode是SQL解析出來的邏輯功能節點;PlanFragment是真正的執行計劃節點。
2.1,創建PlanNode
PlanNode singleNodePlan =
createQueryPlan(queryStmt, analyzer, queryOptions.getDefault_order_by_limit());
(1)這個函數首先根據from從句中的第一個TableRef創建一個PlanNode,一般為ScanNode(HdfsScanNode或者HBaseScanNode)。這個ScanNode關聯一個ValueRange的數組(由多個cluster column取值區間組成)表示要讀取的Table的范圍,還關聯一個conjunct(where從句)。
(2)這個SQL語句中TableRef中剩下的其他Table就需要建立HashJoinNode了。進入Planner.createHashJoinNode()函數:首先為這個Table建立ScanNode(同上),然後調用getHashLookupJoinConjuncts()獲取兩表或者多表JOIN的eqJoinConjuncts和eqJoinPredicates,利用這兩個條件創建HashJoinNode。每個HashJoinNode也是樹狀的,會有孩子節點,對於我們舉例的兩表JOIN,孩子節點分別是兩個表對應的ScanNode。(注意目前impala只支持一大一小兩個表的JOIN,默認是左大右小,是通過把右邊的小表分發到每個節點的內存中分別於左邊大表的一個區間進行JOIN過濾實現的。)
(3)如果有group by從句,創建AggregationNode,並把剛才的HashJoinNode設為它的孩子。這里暫時不考慮DISTINCT aggregation function。
(4)如果有order by… limit從句,創建SortNode。
這樣createQueryPlan()函數執行完畢,PlanNode組成的execution tree形成如下:

2.2,創建PlanFragment
接下來就看impala backend節點數目有多少,如果只有一個節點,那麼整棵執行樹都在同一個impalad上執行;否則調用createPlanFragments(singleNodePlan, isPartitioned, false, fragments)把PlanNode組成的執行樹轉換成PlanFragment組成的執行計劃。
下面進入createPlanFragments()這個函數:
這是一個遞歸函數,沿著PlanNode組成的執行樹遞歸下去,分別創建對應的Fragment。
(1)如果是ScanNode,創建一個PlanFragment(這個PlanFragment的root node是這個ScanNode,而且這個PlanFragment只包含一個PlanNode)。
(2)如果是HashJoinNode,並不是創建一個新的PlanFragment,而是修改leftChildFragment(是一個ScanNode)為以HashJoinNode作為root node的PlanFragment。因為對於HashJoinNode一般有兩個ScanNode孩子,在處理HashJoinNode之前已經把這兩個ScanNode變成了對應的PlanFragment。那麼此時要得到HashJoinNode作為root node的PlanFragment是通過Planner.createHashJoinFragment()函數完成的:首先把當前HashJoinNode作為HashJoinFragment的root node;然後把leftChildFragment中的root PlanNode(也就是參與JOIN的兩個表中左邊的那個表對應的ScanNode)作為HashJoinNode的左孩子;通過調用Planner.connectChildFragment()函數把HashJoinNode的右孩子設置為一個ExchangeNode(這個ExchangeNode表示一個1:n的數據流的receiver);同時把rightChildFragment(ScanNode作為root node)的destination設置為這個ExchangeNode。
(3)如果是AggregationNode,聚集操作很復雜了。以我們的例子來說明:如果這個AggregationNode不是DISTINCT aggregation的2nd phase(因為本例中的AggregationNode的孩子是HashJoinNode而不是另外一個AggregationNode),首先把剛才生成的HashJoinNode作為root node對應的PlanFragment的root node設置為該AggregationNode,並把原來的root node(即HashJoinNode)設為新root node的孩子。然後通過Planner.createParentFragment()創建一個包含ExchangeNode作為root node的新的PlanFragment。並把孩子PlanFragment的destination設置為這個ExchangeNode。然後在這個新的PlanFragment中創建一個新的AggregationNode作為新的root node並把剛才的ExchangeNode作為其孩子節點。
至此,createPlanFragments()調用完成,生成的三個PlanFragment如下:

通過createPlanFragments(singleNodePlan, isPartitioned, false, fragments)獲取了所以執行計劃PlanFragment組成的數組fragments,這個數組的最後一個元素就是根節點PlanFragment。然後就是調用PlanFragment.finalize()把這個執行計劃finalize(遞歸finalize每個PlanNode)同時為每個PlanFragment指定 DataStreamSink。
然後回到frontend.createExecRequest()函數中。執行完Planner.createPlanFragments()返回的ArrayList就是完整的執行計劃了。然後就是一次調用PlanFragment.toThrift()把它序列化到TQueryExecRequest。填充TQueryExecRequest的相關變數:dest_fragment_idx,per_node_scan_ranges,query_globals,result_set_metadata等。最後返回TExecRequest型的對象給backend執行。

㈣ where的用法

where用作連接副詞,where用作關系副詞,引導定語從句
where用於引申意義,where引導名詞性從句,相當於the place (point),

where 的用法
【用法1】 where用作疑問副詞, 在(往、從)哪裡, 在什麼地方:
Where are you? 你在哪兒?
Where did you get the computer (form)? 你從哪兒弄到這台電腦的?
Where did you study medicine? 你從哪兒學的醫?
【用法2】where用作連接副詞, 引導下列從句:
Where bees are, there is honey. 〔狀語從句〕哪兒有蜜蜂哪兒就有蜜。
I』m going to do what I like and go where I like. 〔狀語從句〕我要做我想做的事,去我想去的地方。
I wonder where she lives. 〔賓語從句〕我想知道她住在哪裡。
It』s really no business of yours where I spend my summer. 〔主語從句〕
我真不知道她去哪兒了。
I really have no idea where she has gone.〔同位語從句〕我真不知道她去哪兒了。
The problem is where we should put the vase. 〔表語從句〕問題是我們把花瓶放在哪裡呢。
【用法3】where用作關系副詞,引導定語從句:
England is one of the few countries where (=in which) people drive on the left. 英國是少數沿左側開車的國家之一。
We then moved to Paris, where we lived for six years. 我們後來搬到巴黎,在那裡住了六年。
【用法4】where用於引申意義:
Where will all this trouble lead? ( =What result will it have? ) 這件麻煩的事會惹出什麼結果?
The crisis has reached a point where the receiver will have to be called in.危機已經到達非把破產管理人叫來不可的地步。
Where others are weak, he is strong. 別人的弱點正是他的優勢。
Where the money is, there』s the power. 有錢就有勢。
Can you succeed where others failed? 別人干砸的事情, 你能幹成嗎?
【用法5】where引導名詞性從句,相當於the place (point)where:
A bird had settled on a tree close to where I was standing. 鳥兒棲息在離我站的地方很近的一棵樹上。
That』s where the battle took place. 那兒就是那場戰役發生的地方。
The car is where you parked it. 車子還在你停放的地方。
That』s where we differ. 這就是我們的分歧所在。
That』s just where we basically disagree with him. 這就是我們同他的根本分歧點。
This is where we help each other. 我們就在這方面互相幫助。
That』s where you are wrong. 你錯就錯在這兒。

㈤ 在資料庫查詢中,我要用SQL語句查詢「字元數大於N」,用where從句該怎麼寫比如我要查詢身份證

15-18之間

select*from表名wherelen(身份證號)between15and18

15以下

select*from表名wherelen(身份證號)<15

18以上

select*from表名wherelen(身份證號)>18

㈥ 這段SQL語句有什麼問題

在Oracle的SQL中,create [unique] Index 語句是沒有where從句的。而且,你這里的where從句完全沒有必要。建索引的目的是為了提高查詢速度,不能因為欄位有空值就不建。如果空值影響了索引,就先把空值消去再建好了。

㈦ sql注入問題

通過程序代碼拼接的sql是動態構造的,由一個不變的基查詢字元串和一個用戶輸入字元串連接而成。例如一個攻擊者在前端文本框中輸入字元串「name' OR 'a'='a」,那麼構造的查詢就會變成:SELECT * FROM XXX WHERE _file = 'name' OR 'a'='a';
可以見得附加條件 OR 'a'='a' 會使 where 從句永遠評估為 true,因此該查詢在邏輯上將等同於一個更為簡化的查詢:SELECT * FROM items;
你說的1、2、3步驟總結到最後就是輸入上述的那種字元串

㈧ SQL語言的問題

SQL語言快速入門之一
SQL是英文Structured Query Language的縮寫,意思為結構化查詢語言。SQL語言的主要功能就是同各種資料庫建立聯系,進行溝通。按照ANSI(美國國家標准協會)的規定,SQL被作為關系型資料庫管理系統的標准語言。SQL語句可以用來執行各種各樣的操作,例如更新資料庫中的數據,從資料庫中提取數據等。目前,絕大多數流行的關系型資料庫管理系統,如Oracle, Sybase, Microsoft SQL Server, ACCESS等都採用了SQL語言標准。雖然很多資料庫都對SQL語句進行了再開發和擴展,但是包括Select, Insert, Update, Delete, Create, 以及Drop在內的標準的SQL命令仍然可以被用來完成幾乎所有的資料庫操作。下面,我們就來詳細介紹一下SQL語言的基本知識。

資料庫表格

一個典型的關系型資料庫通常由一個或多個被稱作表格的對象組成。資料庫中的所有數據或信息都被保存在這些資料庫表格中。資料庫中的每一個表格都具有自己唯一的表格名稱,都是由行和列組成,其中每一列包括了該列名稱,數據類型,以及列的其它屬性等信息,而行則具體包含某一列的記錄或數據。以下,是一個名為天氣的資料庫表格的實例。

城市 最高氣溫 最低氣溫
北京 10 5
上海 15 8
天津 8 2
重慶 20 13

該表格中「城市」, 「最高氣溫」和「最低氣溫」就是三個不同的列,而表格中的每一行則包含了具體的表格數據。

數據查詢

在眾多的SQL命令中,select語句應該算是使用最頻繁的。Select語句主要被用來對資料庫進行查詢並返回符合用戶查詢標準的結果數據。Select語句的語法格式如下:
select column1 [, column2,etc] from tablename
[where condition];
([] 表示可選項)
select語句中位於select關鍵詞之後的列名用來決定那些列將作為查詢結果返回。用戶可以按照自己的需要選擇任意列,還可以使用通配符「*」來設定返回表格中的所有列。
select語句中位於from關鍵詞之後的表格名稱用來決定將要進行查詢操作的目標表格。
Select語句中的where可選從句用來規定哪些數據值或哪些行將被作為查詢結果返回或顯示。
在where條件從句中可以使用以下一些運算符來設定查詢標准:
= 等於
> 大於
< 小於
>= 大於等於
<= 小於等於
<> 不等於
除了上面所提到的運算符外,LIKE運算符在where條件從句中也非常重要。LIKE運算符的功能非常強大,通過使用LIKE運算符可以設定只選擇與用戶規定格式相同的記錄。此外,我們還可以使用通配符「%」用來代替任何字元串。舉例如下:
select firstname, lastname, city
from employee
where firstname LIKE 『E%』;
(注意,字元串必須被包含在單括弧內)
上述SQL語句將會查詢所有名稱以E開頭的姓名。或者,通過如下語句:
select * from employee
where firstname = 『May』;
查詢所有名稱為May的行。

SQL語言快速入門之二
創建表格
SQL語言中的create table語句被用來建立新的資料庫表格。Create table語句的使用格式如下:
create table tablename
(column1 data type,
column2 data type,
column3 data type);
如果用戶希望在建立新表格時規定列的限制條件,可以使用可選的條件選項:
create table tablename
(column1 data type [constraint],
column2 data type [constraint],
column3 data type [constraint]);
舉例如下:
create table employee
(firstname varchar(15),
lastname varchar(20),
age number(3),
address varchar(30),
city varchar(20));
簡單來說,創建新表格時,在關鍵詞create table後面加入所要建立的表格的名稱,然後在括弧內順次設定各列的名稱,數據類型,以及可選的限制條件等。注意,所有的SQL語句在結尾處都要使用「;」符號。
使用SQL語句創建的資料庫表格和表格中列的名稱必須以字母開頭,後面可以使用字母,數字或下劃線,名稱的長度不能超過30個字元。注意,用戶在選擇表格名稱時不要使用SQL語言中的保留關鍵詞,如select, create, insert等,作為表格或列的名稱。
數據類型用來設定某一個具體列中數據的類型。例如,在姓名列中只能採用varchar或char的數據類型,而不能使用number的數據類型。
SQL語言中較為常用的數據類型為:
char(size):固定長度字元串,其中括弧中的size用來設定字元串的最大長度。Char類型的最大長度為255位元組。
varchar(size):可變長度字元串,最大長度由size設定。
number(size):數字類型,其中數字的最大位數由size設定。
Date:日期類型。
number(size,d):數字類型,size決定該數字總的最大位數,而d則用於設定該數字在小數點後的位數。
最後,在創建新表格時需要注意的一點就是表格中列的限制條件。所謂限制條件就是當向特定列輸入數據時所必須遵守的規則。例如,unique這一限制條件要求某一列中不能存在兩個值相同的記錄,所有記錄的值都必須是唯一的。除unique之外,較為常用的列的限制條件還包括not null和primary key等。Not null用來規定表格中某一列的值不能為空。Primary key則為表格中的所有記錄規定了唯一的標識符。
向表格中插入數據SQL語言使用insert語句向資料庫表格中插入或添加新的數據行。Insert語句的使用格式如下:
insert into tablename
(first_column,...last_column)
values (first_value,...last_value);
例如:
insert into employee
(firstname, lastname, age, address, city)
values (『Li』, 『Ming』, 45, 『No.77 Changan Road』, 『Beijing」);
簡單來說,當向資料庫表格中添加新記錄時,在關鍵詞insert into後面輸入所要添加的表格名稱,然後在括弧中列出將要添加新值的列的名稱。最後,在關鍵詞values的後面按照前面輸入的列的順序對應的輸入所有要添加的記錄值。

更新記錄
SQL語言使用update語句更新或修改滿足規定條件的現有記錄。Update語句的格式為:
update tablename
set columnname = newvalue [, nextcolumn = newvalue2...]
where columnname OPERATOR value [and|or column OPERATOR value];
例如:
update employee
set age = age+1
where first_name= 『Mary』and last_name= 『Williams』;
使用update語句時,關鍵一點就是要設定好用於進行判斷的where條件從句。

刪除記錄
SQL語言使用delete語句刪除資料庫表格中的行或記錄。Delete語句的格式為:
delete from tablename
where columnname OPERATOR value [and|or column OPERATOR value];
例如:
delete from employee
where lastname = May;
簡單來說,當需要刪除某一行或某個記錄時,在delete from關鍵詞之後輸入表格名稱,然後在where從句中設定刪除記錄的判斷條件。注意,如果用戶在使用delete語句時不設定where從句,則表格中的所有記錄將全部被刪除。

刪除資料庫表格

在SQL語言中使用drop table命令刪除某個表格以及該表格中的所有記錄。Drop table命令的使用格式為:
drop table tablename;
例如:
drop table employee;
如果用戶希望將某個資料庫表格完全刪除,只需要在drop table命令後輸入希望刪除的表格名稱即可。Drop table命令的作用與刪除表格中的所有記錄不同。刪除表格中的全部記錄之後,該表格仍然存在,而且表格中列的信息不會改變。而使用drop table命令則會將整個資料庫表格的所有信息全部刪除。

以上,我們對SQL語言主要的命令和語句進行了較為詳細的介紹。應該說SQL語句的語法結構和風格還是相當簡單和直觀的,只要用戶結合實踐多加練習,一定會在短期內迅速掌握。

SQL語言快速入門之三
我們日常使用SQL語言的工作過程中,使用最多的還是從已經建立好的資料庫中查詢信息。下面,我們就來詳細介紹一下如何使用SQL語言實現各種資料庫查詢操作。

SELECT…FROM

為方便講解,我們在資料庫中創建名為Store_Information的如下數據表。

Store_Information

Store_Name
Sales
Date

Los Angeles
$1500
Jan-10-2000

San Diego
$250
Jan-11-2000

Los Angeles
$300
Jan-12-2000

Boston
$700
Jan-12-2000

SQL語言中用於資料庫查詢的最簡單的命令就是SELECT…FROM,語法格式為:
SELECT "column_name" FROM "table_name"
例如,如果我們希望查詢Store_Information數據表中所有的商店名稱時,可以使用如下命令:
SELECT store_name FROM Store_Information
查詢結果顯示為:
Store_Name
Los Angeles
San Diego
Los Angeles
Boston
如果用戶希望一次查詢多個欄位,可以將所要查詢的欄位名稱依次加入SELECT關鍵字之後,中間用「,」隔開即可。

DISTINCT

SELECT關鍵字支持用戶查詢數據表中指定欄位的所有數據,但是這樣有時就會不可避免的出現重復信息。如果用戶希望只查詢那些具有不同記錄值的信息的話,可以使用SQL語言的DISTINCT關鍵字。語法格式如下:
SELECT DISTINCT "column_name"
FROM "table_name"
例如,我們可以使用以下命令查詢Store_Information數據表具有不同記錄值的所有記錄。
SELECT DISTINCT Store_Name FROM Store_Information
查詢結果如下:
Store_Name
Los Angeles
San Diego
Boston

WHERE

除了選擇具有不同記錄值的記錄之外,有時我們可能還會需要根據某些條件對資料庫中的數據進行查詢。例如,我們可能需要查詢Store_Information數據表中銷售額超過1000美圓的商店。為此,我們可以使用SQL語言的WHERE關鍵字設定查詢條件。語法格式如下:
SELECT "column_name"
FROM "table_name"
WHERE "condition"
由此,我們可以使用如下命令查詢銷售額超過1000美圓的商店信息:
SELECT store_name FROM Store_Information WHERE Sales > 1000
查詢結果顯示為:
store_name
Los Angeles
運算函數

現在,我們已經了解到在使用SQL語言進行資料庫查詢操作時可以通過對數值的判斷設定靈活的查詢條件。為了增強對運算的支持能力,SQL提供了眾多實用的運算函數供廣大用戶使用。例如,我們可以直接在SQL命令中調用SUM或AVG這兩個分別用於計算總數和平均數的函數。語法格式如下:
SELECT "function type"("column_name")
FROM "table_name"
如果我們希望查詢Store_Information數據表中所有商店的總銷售額的話,可以使用如下命令:
SELECT SUM(Sales) FROM Store_Information
查詢結果顯示為:
SUM(Sales)
$2750

COUNT

除了SUM和AVG函數之外,COUNT函數是SQL語言中另一個較為常用的運算函數。COUNT函數可以用來計算數據表中指定欄位所包含的記錄數目。語法格式為:
SELECT COUNT("column_name")
FROM "table_name"
例如,如果我們希望查詢Store_Information數據表中的有關商店的記錄條數時,可以使用如下命令:
SELECT COUNT(store_name)
FROM Store_Information
查詢結果顯示為:
Count(store_name)
4
COUNT函數可以和DISTINCT關鍵字一起使用從而可以查詢數據表中指定欄位中所有具有不同記錄值的記錄數目。例如,如果我們希望查詢Store_Information數據表中不同商店的數目時,可以使用如下命令:
SELECT COUNT(DISTINCT store_name)
FROM Store_Information
查詢結果顯示為:
Count(DISTINCT store_name)
3

GROUP BY

下面我們來進一步看一下SQL語言中的集合函數。上文中,我們曾使用SUM函數計算所有商店的銷售總額,如果我們希望計算每一家商店各自的總銷售額時該怎麼辦呢?要實現這一目的我們需要做兩件事:首先,我們需要查詢商店名稱和銷售額兩個欄位;然後,我們使用SQL語言的GROUP BY命令將銷售額按照不同的商店進行分組,從而計算出不同商店的銷售總額。GROUP BY命令的語法格式為:
SELECT "column_name1", SUM("column_name2")
FROM "table_name"
GROUP BY "column_name1"
我們可以使用如下命令實現上述查詢目的:
SELECT store_name, SUM(Sales)
FROM Store_Information
GROUP BY store_name
查詢結果顯示為:
store_name SUM(Sales)
Los Angeles $1800
San Diego $250
Boston $700
小註:
GROUP BY關鍵字一般應用於同時查詢多個欄位並對欄位進行算術運算的SQL命令中。
HAVING

用戶在使用SQL語言的過程中可能希望解決的另一個問題就是對由sum或其它集合函數運算結果的輸出進行限制。例如,我們可能只希望看到Store_Information數據表中銷售總額超過1500美圓的商店的信息,這時我們就需要使用HAVING從句。語法格式為:
SELECT "column_name1", SUM("column_name2")
FROM "table_name"
GROUP BY "column_name1"
HAVING (arithematic function condition)
(GROUP BY從句可選)
由此,我們可以使用如下命令實現上述查詢目的:
SELECT store_name, SUM(sales)
FROM Store_Information
GROUP BY store_name
HAVING SUM(sales) > 1500
查詢結果顯示為:
store_name SUM(Sales)
Los Angeles $1800
小註:
SQL語言中設定集合函數的查詢條件時使用HAVING從句而不是WHERE從句。通常情況下,HAVING從句被放置在SQL命令的結尾處。下面,我們重點介紹一下如何在SQL命令中設定別名。SQL語言中一般使用兩種類型的別名,分別為欄位別名和數據表別名。
簡單的說,使用欄位別名可以幫助我們有效的組織查詢的輸出結果。例如,上文所列舉的多個實例中,當我們計算商店銷售總額時,顯示結果中就會出現SUM(sales)。雖然SUM(sales)並不會對我們理解查詢結果帶來不便,但是如果我們需要在查詢中使用多項復雜運算時,顯示結果就不會這么直觀了。如果這時我們使用欄位別名就會極大的提高查詢結果的可讀性。
對於數據表別名,我們可以通過將別名直接放置在FROM從句中數據表名稱的後面設定。數據表別名在我們下面將要講述的連接多個數據表進行查詢的操作中極為有用。
欄位和數據表別名的語法格式如下:
SELECT "table_alias"."column_name1" "column_alias"
FROM "table_name" "table_alias"
即別名都直接放置在各自對應名稱的後面,中間用空格分開。
以Store_Information數據表為例,我們可以在GROUP BY一節中所使用的SQL命令中設置如下欄位和數據表別名:
SELECT A1.store_name Store, SUM(Sales) "Total Sales"
FROM Store_Information A1
GROUP BY A1.store_name
查詢結果顯示為:
Store Total Sales
Los Angeles $1800
San Diego $250
Boston $700

連接多個數據表

最後,我們來看一下如果使用SQL語言連接多個數據表,實現對多個數據表的查詢。為方便講解,我們在資料庫中分別創建了兩個名為Store_Information和Region的數據表。

Store_Information

Store_Name
Sales
Date

Los Angeles
$1500
Jan-10-2000

San Diego
$250
Jan-11-2000

Los Angeles
$300
Jan-12-2000

Boston
$700
Jan-12-2000

Region

Region_Name
Store_Name

East
Boston

East
New York

West
Los Angeles

West
San Diego

下面,我們就來看一下通過數據表的連接實現按不同區域查詢銷售額。
我們注意到在名為Region的數據表中包含區域和商店兩個欄位信息,而在名為Store_Information的數據表中則包含每一家商店的銷售信息。因此,為了得到按區域劃分的銷售信息,我們需要將兩個不同數據表的信息結合在一起進行查詢。通過對上述兩個數據表的分析,我們發現每個數據表中都包含一個名為Store_Name的欄位,因此,我們可以使用如下命令實現查詢目的:
SELECT A1.region_name REGION, SUM(A2.Sales) SALES
FROM Geography A1, Store_Information A2
WHERE A1.store_name = A2.store_name
GROUP BY A1.region_name
查詢結果顯示為:
REGION SALES
East $700
West $2050
說明:
上述查詢命令的前兩行用於指定所要查詢的目標欄位,分別為Region數據表中的Region_Name欄位和Store_Information數據表中Sales欄位的記錄值總數。這里,我們設定兩個欄位的別名分別為REGION和SALES,兩個數據表的別名分別為A1和A2。如果我們只使用欄位別名而不設定數據表別名的話,上述SQL命令的第一行就變成 如下形式:
SELECT Region.Region_Name REGION, SUM(Store_Information.Sales) SALES
由此我們可以看出有效的使用數據表別名,可以極大的簡化對多個數據表進行操作的SQL命令。
上述查詢命令的第3行為WHERE從句,正是該從句設定了兩個數據表的連接條件。因為我們希望確保Region數據表中的Store_Name欄位能夠與Store_Information數據表中的同名欄位相對應,所以我們規定兩個欄位的記錄值應當相等。在連接多個數據表時,一定要准確設定數據表的連接條件,如果WHERE從句設定不正確,則可能導致查詢結果中出現眾多不相關的數據

㈨ sql語句中偽列用於where從句。

這個涉及到執行順序題。
select from where group by having order by 中,
首先執行的是from後的語句,說明數據的來源;
-->執行where後的語句,對記錄進行初步篩選;
-->執行group by後的語句,對初步篩選後剩下的欄位進行分組;
-->執行having後的語句,對分組後的記錄進行二次篩選;
-->執行select後的語句,在二次篩選後的欄位中進行選擇並顯示出來;
-->執行order by後的語句,對select 後的欄位進行排序。
就用你的這個sql語句來說吧,當你用num篩選記錄的時候,table表裡面還沒有num這個欄位,所以會提示num 不在table集合裡面。可以有以下方式供參考:
1、select t1.num from (select 1 as num ,t.* from table t) t1 where t1.num>0
2、select * from table where rownum>0