跟我一起學Oracle 11g【7】----SQL 基礎學習


前言

數據的作業不僅僅是存放數據,它的更重要的作用是根據用戶的需求(也就是條件)來顯示用戶所需要的數據。

本章詳細介紹select語句、DMT語句、事物控制等等知識。

一。SQL語言概述

SQL(Structured Query Language,結構化查詢語言),用來實現關系運算中的查詢、選擇等操作,是一個綜合的、功能極強同時也是一種簡單易學的語音。

1.1 SQL 語言的特點

  • SQL語言采用集合操作方式,對數據的處理是成組進行的
  • 執行SQL語句時,每次只能發送並處理一條語句
  • 執行SQL語句時,用戶只需要知道邏輯含義,無需關心SQL的具體執行

1.2 SQL語言分類

①查詢語言

比如select

②數據操縱語言(Data Manipulation Lanuage,DMT)

  • Insert
  • Update
  • Delete
  • Merge(合並 插入 修改)

③數據定義語言(Data Definition Language,DDL)

  • Create
  • Drop
  • Rename
  • Truncate(刪除表的全部內容)

④事物控制(Transaction Control ,TC)語句

  • Commit 永久性的保存對行所做的修改
  • Rollback 取消對行所做的修改
  • Savepoint 設置一個“保存點”,可以將對行的修改回滾到此處

⑤數據控制語言(Data Control Language,DCL)

  • Grant 授予其他用戶對數據庫結構的訪問權限
  • Revoke 收回用戶數據庫結構的權限

1.3 SQL語句的編寫規則

  • SQL關鍵字不區分大小寫,也就是大小寫不敏感
  • 對象名和列名不區分大小寫
  • 字符值和日期值區分大小寫

具體一些 看后記中的參考文獻

二。數據查詢語法

Select [All|Distinct] <列名> [,<列名> ]...

from <表名或試圖名>

[where <條件表達式>]

[Group by <列名1> [Having <條件表達式>]]

[Order by <列名2> [ASC|DESC]]

OK,上面就是查詢語句的語法。這個怎么看呢?很簡單。。貌似以前也說過。就是方括號([])中的內容是可選的,尖括號(<>)是一定要選擇的。

測試數據

我新建了3個表,如下

學生表:Student(Sno,Sname,Ssex,Sage,Ddept)

課程表:Course(Cno,Cname,Cpno(先行課),Ccredit(學分))

這里需要解釋一下,什么叫先行課:就是比如你要學C#,那么你需要一定的計算機基礎的知識,那么這個計算機知識就是先行課。

學生選課表:SC(Sno,Cno,Grade)

三。數據查詢-----單表查詢

顧名思義就是在一個表中查詢。這個是最簡單的查詢咯!

3.1選擇表中的若干列

①查詢指定列

【例子1】從student表中查出所有學生姓名和學號

②查詢所有的列值

【例子2】從course表中查出所有的課程信息

③查詢經過計算的值

【例子3】從student表中查出學生的姓名和生日日期

<列名>不僅可以是算數表達式,還可以是字符串常量、函數等。

【例子4】我現在要找出全體學生的姓名、出生年份以及院系,但要求院系都要小寫!如下:

用戶可以通過指定別名來改變查詢結果的列標題,例子如下:

3.2選擇表中的若干元組

①消除取值重復的行

需要記住的關鍵字是:distinct

【例子5】使用distinct

②查詢滿足條件的元組

我們都知道查詢滿足指定條件是可以通過Where字句來實現的,where字句常用的查詢條件如下:

查詢條件 謂詞
比較大小 =,<,>>=,<=,!=,<>....
確定范圍 between and,not between and
確定集合 In,not in
字符匹配 Like,not like
空值 is null, is not null
多重條件(邏輯運算) and ,or ,not

 

(1)比較大小

【例子6】查詢計算機系全體學生的名單

【例子7】查詢年齡在20歲以下的學生

(2)確定范圍

【例子8】查詢年齡在20~25(包括20 和25)歲之間的學生名字、系別和年齡。

同理,如果不在這個范圍,則使用not between關鍵字。

(3)確定集合

謂詞in可以用來查找屬性屬於指定集合的元組

【例子9】查找計算機系(CS)、數學系(MA)的學生姓名和性別。

與in相對應的謂詞是not in,用於查找不在這個范圍的值。

(4)字符匹配

用like可以進行字符串的匹配,語法如下:

[not] like '<匹配串>' [escape '<換碼字符>']

其含義是找出指定的屬性列值與匹配串的結果。匹配串可以是字符串,也可以是通配符%和_,含義如下:

%(百分號):代表任意長度。比如a%b,則表示aeweb,或者ab

_(下划線):代表任意個字符。比如a_b則代表,a開頭,b結尾的3個字符串。

【例子10】找出名字中以 Hong結尾的名字

很明顯,找出不在字符串中的匹配是not like。

【例子11】找出學生名字xiao后面只有2個字符的名字:

得到的結果是XiaoLi,因為上面圖的緣故,所以只能看到一條下划線,其實有2個。

NOTE:如果用戶要查詢的字符串本身就包含通配符%或_中,那怎么辦呢?在上面的語法中,我們提到。這個時候,我們就需要使用escape ‘換碼字符’ 這個知識了,對通配符進行轉義了。

啥意思呢?就是在escape ‘換碼字符’后面的字符串是正常的字符串。

【例子12】找出課程名DB_開頭,並且倒數第三個字符為i的課程的詳細信息。

這個怎么看呢?escape '\' 表示 '\'為換碼字符。這樣匹配串中緊跟在“\”后面的字符串“_”不在具有匹配符的含義,和普通字符一樣。所以,第一個“_”被轉義為普通字符,第二和第三個的前面沒有換嗎碼字符,所以依然是匹配符。

(5)涉及空值的查詢

【例子13】查詢缺少成績的學生號和課程號,因為有些學生沒有參加課也很正常。

OK,可能有些園子的朋友會覺得 這里的is 用“=”代替,可以嗎?結果如下:

得出的結果是不可以的,所以在判斷為空的時候用is,而不是“=”

(6)多重條件查詢

邏輯運算符 and和or可以用來連接多個查詢條件。and的優先級高於or的哦。親。

【例子14】查詢年齡在20歲以下且是計算機系的學生

 

【例子15】在例子9中,我們使用了in,其實,我們也可以用or來代替找出在學生的系在CS和MA的學生。

 3.3Order by 字句

用戶可以使用order by語句來進行對查詢結構的列進行升序(ASC)或者降序(DESC)

【例子16】從course表中,查找出課程號2及其的學生成績,結果按分數降序 排列。

對於空值,若按升序排列,含空值的元組會最后顯示。若降序排列,空值的元組會最先顯示。

3.4 集合函數(Aggregate function)

SQL 提供了許多的集合函數,主要有:

Count([Distinct|All]*) 統計元組個數

Count([Distinct|All]* <列名>) 統計一列中值的個數

Sum([Distinct|All]* <列名>)計算一列值的綜合

Avg([Distinct|All]* <列名>) 計算一列值的平均值

Max([Distinct|All]* <列名>) 求一列值中最大值

Min([Distinct|All]* <列名>) 求一列值最小值

【例子17】求student表中的學生數

【例子18】計算選擇1號課程的平均成績

在聚集函數遇到空值的時候,除了count(*),都跳過空值而只是處理非空值。注意where字句中是不能聚集函數作為條件表達式的。

【例子19】求學號為4選修課的總學分數:

3.5 Group by

group by字句將查詢結果按某一列或多列的值分組,值相等的為一組。對查詢結果分組是為了細化聚集函數的作用。

【例子20】求每個課程號及相應的的選課人數

該語句對查詢結果按Cno的值分組,所以具有相同Cno值的元組都為一組,然后對每一組進行統計個數。

如果分組后還需要按照一定的條件對這些組進行刷選,則可以使用having短語指定刷選條件。

【例子21】

這里選用group by字句按照sno進行分組,在用聚合函數count對每一組進行統計,having給出了條件,只有滿足條件的組才會顯示出來。因為Sno=3的課程人數只有1人,所以沒有顯示出來。

where和having的區別是:where字句作用於基本表或視圖;而having作於元組中(就像我們這里一樣)。

3.6 Order By 排序

Order By主要是對一列或多列進行排序。

語法格式如下:

Order by 列名1 [,列名2 。。] [ASC | DESC]

ASC:升序排列(默認方式)

DESC:降序排列

【例22】找出sc表中的所有成績按照降序排列

當然,你的排列不緊可以是一列,也可以是多列。比如上面,我們先按grade降序排列,然后 接着在按sno降序排列,如下:

OK.

后記

SQL語句的編寫規范


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM