第三章 SQL
??? SQL最早版本是由IBM開發的,最初叫做Sequel。20世紀70年代早期是作為System R項目的一部分。
3.1 SQL查詢語言概覽
- 數據定義語言
- 數據操縱語言
- 完整性
- 視圖定義
- 事務控制
- 嵌入式SQL和動態SQL
- 授權
3.2 SQL數據定義
??? 3.2.1 基本類型
- char(n):固定長度
- varchar(n):可變長度
- int:整數
- smallint:小整數
- numeric(p, d):定點數,共有p位數字,d位在右邊,如numeric(3,1)可存儲44.5
- real,double precision:浮點數與雙精度浮點數
- float(n):精度至少n位的浮點數
3.2.2 基本模式定義
??? create table命令定義SQL關系。
create table(A1, D1,A2, D2,...,An, Dn,<完整性約束>,...,<完整性約束>);- primary key:主碼屬性必須非空且唯一
- foreign key(A1, A2, .....An)references s:聲明表示關系中任意元組在屬性(A1, A2, .....An)上的取值必須對應于關系s中某元組在主碼屬性上的取值。
- noy null:表示不允許空值
??? SQL禁止破壞完整性約束的任何數據庫更新。
??? 3.3 SQL查詢的基本結構
??????? SQL查詢的基本結構由三個子句構成:select、from和where。from->where->select
??? 3.3.1 關系查詢
??????? 在關系模型的形式化數學定義中,關系是一個集合。
??????? 如:
select distinct name from instructor where dept_name = 'Comp.Sci.' and salary > 7000;??????? distinct強行刪除重復,select子句中還可以含+、-、*、/運算符的算術表達式。
??? 3.3.2 自然連接
??????? 自然連接(natural join)運算作用于兩個關系,并產生一個關系作為結果。它只考慮那些在兩個關系模式中都出現的屬性上取值相同的元組對。
select name, title from instructor natural join teaches, course where teaches.course_id = course.course_id
??????? SQL還提供了一種自然連接的構造形式, join...using。
3.4 附加的基本運算
??? 3.4.1 更名運算
??????? as子句既可以出現在select子句中,也可以出現在from子句中。
select distinct T.name from instructor as T, instructor as S where T.salary > S.salary and S.dept_name = 'Biology';??? 3.4.2 字符串運算
??????? SQL使用一對單引號來標示字符串,如‘Computer’。在字符串中表示單引號時用兩個單引號。如‘it‘’s right’。
??????? SQL在字符串比較大小上是大小寫敏感的,但如MySQL和SQL Server,在匹配字符串時并不區分大小寫。
??????? SQL允許字符串函數操作,如lower(s), upper(s), trim(s)去掉字符串后面的空格。
??????? 在字符串上可以使用like操作符來實現模式匹配。兩個特殊字符來描述模式:%:匹配任意子串; _:匹配任意一個字符。
??????? 在like比較運算符中使用escape關鍵詞來定義轉義字符。如:like 'ab\%cd%' eacape '\' 匹配所有“ab%cd”開頭的字符串。
??????? SQL允許使用not like比較運算符搜素不匹配項。在SQL1999中海提供similar to操作,具備比like運算更強大的模式匹配能力。
??? 3.4.3 select子句中的屬性說明
??????? select*的select子句表示from子句結果關系的所有屬性都被選中,‘*’表示所有屬性。
??? 3.4.4 排列元組的顯示次序
??????? order by子句默認升序??梢杂?strong>desc表示降序,asc表示降序。
select* from instructor order by salary desc, name asc;??? 3.4.5 where子句謂詞
??????? between...and比較運算符來說明一個值是小于或等于某個值,同時大于或等于另一個值的。
select name from instructor where salary between 90000 and 100000;??????? 還可以使用not between比較運算符。
3.5 集合運算
??? union:U? intersect:∩? except:-。三個集合運算都會自動去除重復,它們的對象都是select-from-where。
??? except中,如果我們想保留重復,可以用except all代替except。
3.6 空值
??? SQL將1涉及空值的任何比較運算的結果視為unknown,and、or和not也被擴展到可以處理unknown值。
??? and:true and unknown為unknown,false and unknown為false,unknown and unknown為unknown。
??? or:true or unknown為true,false or unknown為unknown,unknown or unknown為unknown。
??? not:not unknown為unknown。
??? 如果where子句謂詞對一個元組計算出false或unknown,那么該元組不能被加入到結果集中。
??? SQL在謂詞中使用特殊的關鍵詞null測試空值。也有謂詞is not null。null = null會返回unknown,而不是true。
3.7 聚集函數
??? 聚集函數是以值得一個集合(集或多重集)為輸入、返回單個值的函數。
??? 五個固有的聚集函數:平均值:avg。最小值:min。最大值:max??偤?#xff1a;sum。計數:count。
??? count中使用distinct時,表示為:count(distinct ID)。
??? 分組聚集可以使用group by。在group by子句中的所以屬性上取值相同的元組將被分在一個組中。
??? 當SQL查詢使用分組時,保證出現在select語句中但沒有被聚集的屬性只能是出現在group by子句中的那些屬性。
/*error*/ select dept_name, ID, avg(salary) from instructor group by dept_name;??? 有時候,對分組限定條件比元組限定條件更有用。having并不針對單個元組,而是針對group by子句構成的分組。having子句中的謂詞在形成分組后才起作用,因此可以使用聚集函數。與select類似,任何出現在having中,但沒有被聚集的屬性必須出現在group by子句中。
??? from->where->group by->having->select;
3.8 嵌套子查詢
??? 3.8.1 集合成員資格
??????? in測試元組是否是集合中的成員,集合是由select子句產生的一組構成的。連接詞not in則測試元組是否不是集合中的成員。
select distinct course_id from section where semester = 'Fall' and year = 2009 andcourse_id in (select course_idfrom sectionwhere semester = 'Spring' and year = 2010);??? 3.8.2 集合的比較
??????? “至少比某一個要大”在SQL中用>some。=some等價于in,然而<>some并不等價于not in。
??????? >all對應于詞組“比所有的都大”。<>all等價于not in,但=all并不等價于in。
select dept_name from instructor group by dept_name having avg(salary) >= all(select avg(salary)from instructorgroup by dept_name)??? 3.8.3 空關系測試
??????? exists結構在作為參數的子查詢非空時返回true值。
??? ? ? not exists結構測試子查詢結果集中是否不存在元組。“關系A包含關系B”寫成“not exists(B except A)”。
select S.ID, S.name from student as S where not exists((select course_idfrom coursewhere dept_name = 'Biology')except(select T.course_idfrom takes as Twhere S.ID = T.ID));??? 3.8.4 重復元組存在性測試
??????? 如果作為參數的子查詢結果中沒有重復的元組,unique結構將返回true值。
??? ? ? not unique結構測試在一個子查詢結果中是否存在重復元組。。
select T.course_id from course as T where not unique(select R.course_idfrom section as Rwhere T.course_id = R.course_id andR.year = 2009);??? 3.8.5 from子句中的子查詢
???? ? ?from子句中嵌套一個select-from-where結構等。
??????? SQL2003允許from子句中的子查詢用關鍵詞lateral作為前綴,以便訪問from子句中在它前面的表或者子查詢中的屬性。
select name, salary, arg_salary from instructor I1, lateral(select avg(salary) as avg_salaryfrom instructor I2where I2, dept_name = I1.dept_name);??? 3.8.6 with子句
??????? with子句提供定義臨時關系的方法。實在SQL1999中引入的。
with max_budget (value) as(select max(budget)from department) select budget from department. max_budget where department, budget = max_budget.value;??? 3.8.7 標量子查詢
??????? SQL允許子查詢出現在返回單個值的表達式能夠出現的任何地方(select、where、having),只要該子查詢只返回包含單個屬性的單個元組。該子查詢稱為標量子查詢。
3.9 數據庫的修改
??? 刪除:delete語句首先從r中找出所以是P(t)為真的元組,然后把他們從r中刪除。
delete from r where P;??? 插入:考慮到可能不知道關系屬性的排列順序,SQL允許insert語句中指定屬性。
insert into course(course_id, title, dept_name, credits)values('CS-437', 'Database System', 'Comp.Sci', 4);??? 更新:SQL提供case結構,可以利用它在一條update語句中防止某些問題發生。
update instructor set aslary = casewhen salary <= 100000 then salary * 1.05else salary * 1.03end? ??set:不支持同時對多個變量同時復制,當表達式返回多個值時將出錯,當表達式未返回值時,變量將被賦為null。
??? select:支持同時對多個變量同時復制,當表達式返回多個值時將返回的最后一個值賦給變量,當表達式未返回值時,變量保持原值。
轉載于:https://www.cnblogs.com/clairvoyant/p/5465778.html
總結
- 上一篇: C++反汇编书
- 下一篇: Python全栈开发之3、数据类型set