數據庫Mysql基本語句總結

目錄

1、查詢所有的數據庫

2、指明使用哪個數據庫

3、新建表( create table) 

4、插入數值 insert

5、刪除表

6、修改屬性 alter

7、更新:使得不改變整個元組的情況下改變其部分屬性的值 update

8、更名運算----重命名 as

9、字符串運算 

10、排列元組的顯示次序

11、集合運算

12、空值:SQL將涉及空值的任何比較運算的結果視爲unknown

13、查詢

14、自然連接:只考慮那些在兩個關係模式中都出現的屬性上取值相同的元組對 natural join、join...using

15、聚集函數:以值的一個集合(集或多重集)爲輸入、返回單個值的函數

16、分組聚集 group by:該子句中所有屬性上取值相同的元組將被分在一個組中

17、having子句:用group by形成分組後,對分組進行限定

18、對空值和布爾值的聚集

19、集合成員資格

20、集合的比較

21、空關係測試

22、重複元組存在性測試

23、from子句中的子查詢

24、with子句:定義臨時關係,這個定義只對包含with子句的查詢有效

25、標量子查詢:子查詢只返回包含單個屬性的單個元組


1、查詢所有的數據庫

show databases;

2、指明使用哪個數據庫

不指名的話,可能無法進行下面的種種操作

use database_name; -- database_name爲數據庫名

3、新建表( create table) 

create table 表名1(
屬性A1  類型D1,
屬性A2  類型D2,
…………
屬性An  類型Dn,
主鍵(Ax1,Ax2,……,Axn)
外鍵(Ak1,Ak2,……,Akn) references 表名2(Ak1,Ak2,……,Akn));

有外鍵就寫,沒有就可以省略。其中使用外鍵時要注意

  • 參照表的字段是否存在
  • 外鍵字段在其他表上是主鍵
  • 字段類型一定要一樣
create table department   
(dept_name varchar(20),   
building varchar(15),     
budget numeric(12,2),     
primary key(dept_name));  
create table course
(course_id varchar(7),
title varchar(50),
dept_name varchar(20),
credits numeric(2,0),
primary key(course_id),
foreign key(dept_name) references department(dept_name));

4、插入數值 insert

插入數值時,如果插入的表有外鍵的話,要保證插入的外鍵值在以該外鍵爲主鍵的表中存在,否則會出現以下類似錯誤,無法正確的插入

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`t`, CONSTRAINT `t_ibfk_1` FOREIGN KEY (`dept_name`) REFERENCES `department` (`dept_name`))

insert into table_name values(數據1,數據2,……,數據n); -- 對單個元組的插入請求
insert into table_name(A1,A2,...,An) values(數據1,數據2,...,數據n); -- 指定屬性進行插入
insert into table_name select A1,... from tb1 where P; -- 在查詢結果的基礎上插入元組

沒被插入的值用null表示,賦予空值 

insert into department values('Comp.Sci.','Taylor',65000);
-- -------------------------------------------------------
insert into course(course_id,title,det_name,credits)
    values('CS-437','Database Systems','Comp.Sci.',4);
-- -------------------------------------------------------
insert into instructor
    select ID,name,dept_name,18000
    from student
    where dept_name = 'Music' and tot_cred > 144;

5、刪除表

  • delete時,保留表中的關係,刪除表中的所有元組
delete from table_name; -- table_name爲表名 刪除表中所有元組
delete from table_name where P; -- 找出使P爲真的元組
  • drop時,不僅刪除表中所有元組,還刪除表中的關係。一旦使用了該語句,除非用create table重新建該表,否則沒有元組可以插入到該表中。
drop table table_name; -- table_name爲表名

6、修改屬性 alter

(1)爲已有關係的表增加屬性

alter table tb1 add A D; -- tb1爲表名 A爲添加的屬性 D爲添加屬性的類型

(2)爲已有關係的表去掉屬性

alter table tb1 drop A; -- tb1爲表名 A爲要刪除的屬性

7、更新:使得不改變整個元組的情況下改變其部分屬性的值 update

update tb1 set P;
update tb1 set P where P1;
update instructor set salary = salary * 1.05 where salary < 7000;

case語句:可以利用它在一條update語句中執行多種更新,並避免更新次序引發的問題

case
    when pred1 then result1
    when pred2 then result2
    ......
    when predn then resultn
    else result0
end
update instructor
set salaty = case
                when salary <= 10000 then salary * 1.05
                else salary * 1.03
             end

 8、更名運算----重命名 as

old-name as new-name

(1)把一個長的關係名換成短的,在查詢其他地方使用起來更加方便

(2)適用於需要比較同一個關係中的元組的情況

select T.name, S.course_id
from instructor as T, teaches as S
where T.ID = S.ID;
-- 由於執行順序爲from---where---select,因此可以在更名後使用T和S
-- ----------------------------------------------------------
select distinct T.name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept_name = 'Biology';

9、字符串運算 

  • SQL使用一對單引號來標示字符串,若單引號是字符串的組成部分,則用兩個單引號字符來標示 eg:'it''s right'
  • 字符串上的相等運算是大小寫敏感的 eg:'Comp.Sci.'不等於'comp.sci.'

模式匹配

(1)like

  • 百分號(%):匹配任意子串
  • 下劃線(_):匹配任意一個字符

(2)escape——使得模式中能夠包含特殊模式(%和_)的字符,使用反斜線(\)作爲轉義字符

(3)使用not like搜尋不匹配項

select dept_name from department where building like '%Watson%';
-- 匹配包含子串'Watson'的所有系名
-- -------------------------------------------------------------
like 'ab\%cd%' escape '\'; -- 匹配所有以“ab%cd”開頭的字符串
-- -------------------------------------------------------------
like 'ab\\cd%' escape '\'; -- 匹配所有以“ab\cd”開頭的字符串

10、排列元組的顯示次序

(1)升序(默認):order byasc

(2)降序:desc

select name from instructor where dept_name = 'Physics' order by name;
select * from instructor order by salary desc, name asc;

11、集合運算

union(或)intersect(並)except(除去、差)使用時均自動去除重複項

若想保留重複項,則用union all、intersect all、except all

(select course_id
from section
where semester = 'Fall' and year = 2009)
union
(select course_id
from section
where semester = 'Spring' and year = 2010);

把上面代碼的union(並運算)換成intersect或except,就可變爲交運算或差運算

12、空值:SQL將涉及空值的任何比較運算的結果視爲unknown

unknown是獨立於true和false的第三種表達結果方式

where子句的謂語中可以對比較結果使用and、or和not的布爾運算

  • 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允許使用子句is unknown和is not unknown來測試一個表達式的結果是否爲unknown
  • 當比較兩個元組對應的屬性值時,如果這兩個值都是非空且值相等,或者都是空,那麼它們是相同的。如:{('A', null), ('A', null)}這樣的兩個元組拷貝被認爲是相同的,即使在某些屬性上存在空值。注意:上述對待空值的方式與謂詞中對待空值的方式是不同的,在謂詞中“null = null”會返回unknown,而不是true。

13、查詢

執行順序:from --- where --- group by ---having --- select

select A from tb1 where r;-- A爲所要查詢屬性 tb1爲表明 r爲所要滿足關係
select * from tb1; -- 全表的所有元組都會列出
select distinct A from tb1; -- distinct可強行刪除重複
select all A from tb1; -- all可顯示指明不去除重複,這是默認的,可不寫
  • distinct可強行刪除重複;all可顯示指明不去除重複,這是默認的,可不寫
  • where子句允許只選出那些在from子句的結果關係中滿足特定謂語的元組,有需要才寫。
  • 可以在select子句中用 * 表示“所有的屬性”

14、自然連接:只考慮那些在兩個關係模式中都出現的屬性上取值相同的元組對 natural joinjoin...using

select A1,A2,...,An
from r1 natural join r2 natural join ... natural join rn
where P;
select name1, course_id
from instructor, teaches
where instructor.ID = teaches.ID;

等價於

select name1, course_id
from instructor natural join teaches;

### 但以下的一個例子卻不等價 ###

前提:已知instructor和teaches自然連接包括屬性(ID, name, dept_name, salary, course_id, sec_id)

           而course關係包含的屬性是(course_id, title, dept_name, credits)

select name,title
from instructor natural join teaches, course
where teaches.course_id = course.course_id;
-- 列出教師的名字以及他們所講授課程的名稱

不等價於

select name1,title
from instructor natural join teaches natural join course;

原因:instructor、teaches和course三者自然連接包括屬性(course_id, dept_name)

而instructor和teaches自然連接後,再讓teaches與course根據屬性course_id相同選出元組的結果,會忽略掉所有(course_id, dept_name)這樣的對,因此兩種查詢結果不同

因此,爲了發揚自然連接的優點,同時避免不必要的相等的屬性帶來的危險,引入了下面的構造形式 

select A1,A2
from r1 join r2 using (A1,A3); -- r1、r2爲表名

join...using與自然連接相似,但可以指定用哪些屬性進行匹配連接,在t1.A1 = t2.A1並且t1.A2 = t2.A2成立的前提下(t1、t2爲元組),來自r1的元組t1和來自r2的元組t2就能匹配,即使r1和r2都具有名爲A3的屬性,也不需要t1.A3 = t2.A3成立

15、聚集函數:以值的一個集合(集或多重集)爲輸入、返回單個值的函數

  • 平均值:avg
  • 最小值:min
  • 最大值:max
  • 總和:sum
  • 計數:count

sum和avg的輸入必須是數字集,其他運算符還可以作用在非數字集數據類型的集合上,如字符串

select count(distinct ID)
from teaches
where semester = 'Spring' and year = 2010;
-- 找出在2010年春季學期講授一門課程的教師總數
-- ---------------------------------------
select count(*)
from course; -- 計算一個關係中元組的個數

SQL不允許在用count(*)時使用distinct,但在用max和min時使用distinct是合法的,可用all保留重複元組,這是默認的

16、分組聚集 group by:該子句中所有屬性上取值相同的元組將被分在一個組中

出現在select語句中但沒有被聚集的屬性只能是出現在group by子句中的那些屬性,即任何沒有出現在group by子句中的屬性如果出現在select子句中的話,它只能出現在聚集函數內部,否則查詢錯誤。

省略掉group by意味着整個關係被當作是一個分組

正確例子:

select dept_name, count(ID) as instr_count
from instructor natural join teaches
where semester = 'Spring' and year = 2010;
group by dept_name;
-- 找出每個系在2010年春季學期講授一門課程的教師人數

錯誤例子:

select dept_name, ID, avg(salary)
from instructor
group by dept_name;

錯誤原因:ID沒有出現在group by子句中,但它出現在了select子句中。(每個老師都有一個ID,既然每個分組只輸出一個元組,那就無法確定選哪個ID值作爲輸出)

17、having子句:用group by形成分組後,對分組進行限定

任何出現在havaing子句中,但沒有被聚集的屬性必須出現在group by子句中,否則查詢錯誤

select dept_name, avg(salary) as avg_salary
from instructor
group by dept_name
having avg(salary) > 42000;
-- 找出教師平均工資超過42000元的系

18、對空值和布爾值的聚集

除了count(*)外所有的聚集函數都忽略輸入集合中的空值。由於空值被忽略,有可能造成參加函數運算的輸入值集合爲空集,規定空集的count運算值爲0,其他所有聚集運算在輸入爲空集的情況下返回一個空值。

select sum(salary) from instructor;

由於一些元組在salary上取空值,上述查詢待求和的值中就包含了空值,SQL標準並不認爲總和本身爲null,而是認爲sum運算符應忽略輸入中的null值。

19、集合成員資格

  • in:測試元組是否是集合中的成員
  • not in:測試元組是否不是集合中的成員
select distinct course_id
from section
where semester = 'Fall' and year = 2009 and
    course_id in(select course_id
                 from section
                 where semester = 'Spring' and year = 2010);
-- 找出在2009年秋季學期和2010年春季學期同時開課的所有課程

in和not in操作符也能用於枚舉集合

select distinct name
from instructor
where name not in('Mozart', 'Einstein');
-- 查詢既不叫“Mozart”,也不叫“Einstein”的教師姓名

20、集合的比較

  • > some:“至少比某一個要大”
  • 還可使用 < some<= some>=some= some<> some,其中 = some等價於in,但<> some不等價於not in
  • > all:“比所有的都大”
  • 還可使用 < all<= all>=all= all<> all,其中 = all等價於not in,但<> all不等價於in
select name
from instructor
where salary > some(select salary
                    from instructor
                    where dept_name = 'Biology');
-- 找出工資至少比Biology系某一個教師的工資要高的所有教師姓名
select dept_name
from instructor
group by dept_name
having avg(salary) >= all(select avg(salary)
                          from instructor
                          group by dept_name);
-- 找出平均工資最高的系

21、空關係測試

  • exists:測試一個子查詢的結果中是否存在元祖
  • not exists:測試一個子查詢的結果中是否不存在元祖
select course_id
from section as S
where semester = 'Fall' and year = 2009 and
    exists(select * 
           from section as T
           where semester = 'Spring' and year = 2010 and
                S.course_id = T.course_id);
-- 找出在2009年秋季學期和2010年春季學期同時開課的所有課程
select S.ID, S.name
from student as S
where not exits((select course_id
                 from course
                 where dept_name = 'Biology')
                 except
                (select T.course_id
                 from takes as T
                 where S.ID = T.ID));
-- 找出選修了Biology系開設的所有課程的學生

22、重複元組存在性測試

  • unique:測試子查詢的結果中是否存在重複元組,沒有重複返回true,假的定義:當且僅當關係中存在兩個元組t1和t2,且t1 = t2。由於在t1或t2的某個域爲空時,判斷t1 = t2爲假。
  • not unique:測試子查詢的結果中是否存在重複元組
select T.course_id
from course as T
where unique(select R.course_id
             from section as R
             where T.course_id = R.course_id and R.year = 2009);
-- 找出所有在2009年最多開設一次的課程

23、from子句中的子查詢

  • 某些SQL實現要求對每個子查詢結果關係都給一個名字,即使該名字從不被引用
  • Oracle允許對子查詢結果關係命名(省略關鍵字as),但是不允許對關係中的屬性重命名
select max(tot_salary)
from(select dept_name, sum(salary)
     from instructor
     group by dept_name) as dept_total(dept_name, tot_salary);
-- 找出所有系中工資總額最大的系
  • 在from子句中的子查詢用關鍵字lateral作爲前綴,以便訪問from子句中在它前面的表或子查詢中的屬性。
select name, salary,avg_salary
from instructor I1, lateral(select avg(salary) as avg_salary
                            from instructor I2
                            where I2.dept_name = I1.dept_name);
-- 打印每位教師的姓名,以及他們的工資和所在系的平均工資

24、with子句:定義臨時關係,這個定義只對包含with子句的查詢有效

with子句定義了臨時關係,此關係在隨後的查詢中馬上被使用了

with max_budget(value) as
     (select max(budget)
      from department)
select budget
from department, max_budget
where department.budget = max_budget.value;
-- 找出具有最大預算值的系

25、標量子查詢:子查詢只返回包含單個屬性的單個元組

  • 從技術上講標量子查詢的結果類型仍然是關係,儘管其中只包含單個元組
  • 標量子查詢出現的位置是單個值出現的地方,SQL就從該關係中包含單屬性的單元組中取出相應的值
select dept_name,
    (select count(*)
     from instructor
     where department.dept_name = instructor.dept_name)
     as num_instructors
from department;
-- 列出所有的系以及它們擁有的教師數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章