天天看點

SQL筆記(三) SQL中附加的基本運算附加的基本運算

附加的基本運算

  • 附加的基本運算
    • 更名運算
      • 使用更名運算的理由:
      • 使用as 語句進行重命名運算
          • 查詢1. 一個普通的查詢
          • 查詢2. 用名字instructor_name代替屬性名name
          • 查詢3. 簡化名稱
          • 查詢4. 同關系查詢
    • 字元串運算
      • like操作符
          • 查詢5.like表達式
        • 使用escape關鍵字定義轉義字元
        • 可以使用not like 比較運算符搜尋不比對項
    • select子句中的屬性說明
          • 查詢6. 星号表示所有的屬性
    • 排列元組的顯示次序
        • 使用order by子句
          • 查詢7. order by 查詢
          • 查詢8. 使用asc和desc
    • where子句謂詞
      • between 謂詞
          • 查詢9. 可以取代查詢10
          • 查詢10.
      • not between
      • (v1,v2,…,vn)n維元組比較
          • 查詢11. 等價于查詢12
          • 查詢12. 等價于查詢11

更名運算

使用更名運算的理由:

  1. from子句中的幾個關系中有同名的屬性;
  2. select子句中使用了算術表達式,該結果屬性沒有名字;
  3. 講一個長的關系名,替換成一個短的,友善操作;
  4. 比較同一個關系中的元組的情況;
  5. 沒有理由,就想給它改個名字!!!

使用as 語句進行重命名運算

SQL中提供了一個重命名結果關系中屬性的方法,使用如下的as子句:

old-name as new-name
           

as子句既可以出現在select子句中,也可以出現在from 子句中。

查詢1. 一個普通的查詢
select name, course_id
from instructor, teaches
where instructor.ID = teaches.ID;
           

結果是一個具有下列屬性的關系:

name,course_id

查詢2. 用名字instructor_name代替屬性名name
select name as instructor_name, course_id
from instructor, teaches
where instructor.ID = teaches.ID;
           

結果是一個具有下列屬性的關系:

instructor_name,course_id

查詢3. 簡化名稱
select T.name,S.course_id
from instructor as T, teaches as S
where T.ID = S.ID;
           
查詢4. 同關系查詢

找出滿足下面條件的所有教師的名字,他們的工資至少比Biology系某一個教師的工資要高。

select distinct T.name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept_name = 'Biology';
           

S和T被認為是instructor的兩個拷貝,更準确的說是被聲明為instructor關系的别名。

S和T這樣的辨別符在SQL标準中被稱作:

相關名稱(correlation name) 或 表别名(table alias) 或 相關變量 (correlation variable) 或 元組變量(tuple variable)

字元串運算

SQL允許在字元串上有多種函數,例如:

upper(s),lower(s),trim(s)等。

不同的資料庫系統提供的字元串函數集不同個,這裡不列舉。

like操作符

使用like操作符可以實作模式比對:

*

%

:比對任意字元串

*

_

: 比對任意一個字元

例如:

* ‘Intro%’:

* ‘%comp%’:

* ‘_ _ _’:

查詢5.like表達式

找出所在建築物名稱中包含子串‘Watson’ 的所有系名。

select dept_name
from department
where building like '%Watson%';
           

使用escape關鍵字定義轉義字元

/*使用反斜杠(\)作為轉義字元, 
比對所有以“ab%cd”開頭的字元串*/
 like 'ab\%cd%' escape '\'

/* 比對所有以“ab\cd”開頭的字元串  */
like 'ab\\cd%' escape '\'
           

可以使用not like 比較運算符搜尋不比對項

select子句中的屬性說明

星号“*” 可以用在select 子句中表示“所有的屬性”。

查詢6. 星号表示所有的屬性

下面的查詢中,instructor中所有的屬性都被選中。

select instructor.*
from instructor, teaches
where instructor.ID = teaches.ID;
           

排列元組的顯示次序

使用order by子句

查詢7. order by 查詢

按字母順序列出在Physics系的所有教師

select name
from instructor
where dept_name = 'Physics'
order by name;
           

order by 預設使用升序(asc)。

我們可以使用desc表示降序。

查詢8. 使用asc和desc

按salary的降序列出整個instructor關系,如果有幾個教師的工資相同,将他們按照名字升序排列。

select * 
from instructor
order by salary desc, name asc;
           

where子句謂詞

between 謂詞

between比較運算符來說明一個值小于或等于某個值,同時大于或等于另一個值

查詢9. 可以取代查詢10

找出工資在90000美元到100000美元之間的教師的姓名

select name
from instructor
where salary between  and ;
           
查詢10.

找出工資在90000美元到100000美元之間的教師的姓名

select name
from instructor
where salary <=  and salary >=;
           

not between

使用方法類似于between

(v1,v2,…,vn)n維元組比較

SQL允許我們使用記号(v1,v2,…,vn)表示一個分量值分别為v1,v2,…,vn的n維元組。

在元組上可以運用比較運算符,按照字典順序進行比較。例如:

(a1,a2) <= (b1,b2)在 a1 <= b1且a2 <= b2時為真。

查詢11. 等價于查詢12

查找Biology系講授了課程的所有教師的姓名和他們所講授的課程。

select name, course_id
from instrucotr,teaches
where instructor.ID = teaches.ID and dept_name = 'Biology';
           
查詢12. 等價于查詢11
select name, course_id
 from instructor, teaches;
 where (instructor.ID, dept_name) = (teaches.ID, 'Biology');