SQL數據庫基本操做,mysql爲測試環境。

SQL功能極強,因爲其巧妙的設計,完成核心功能只須要9個動詞。sql

SQL功能 動詞
數據查詢 select
數據定義 create(建立,)drop(刪除),alter(改變)
數據操縱 insert(插入 )update(更新) delete(刪除)
數據控制 grant(受權)revoke(取消受權)

關係數據庫系統支持三級模式結構,其模式、外模式和內模式中的基本對象有模式,表,視圖和索引等,所以SQL的數據定義功能包括模式定義、表定義、視圖和索引定義.SQL數據定義語句以下表:數據庫

操做對象/操做方式 建立 刪除 修改
模式 create schema drop schema
create table drop table alter table
視圖 create view drop view
索引 create index drop index alter index

咱們定義三個表 學生表:Student(Sno,Sname,Ssex,Sage,Sdept) 課程表:Course(Cno,Cname,Cpno,Ccredit)函數

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

學生表:Student設計

CREATE TABLE Student
  (Sno CHAR(9) PRIMARY KEY,/*列級完整性約束條件,Sno是主碼*/
  Sname CHAR(20)UNIQUE,    /*Sname 取惟一的值*/
  Ssex CHAR(20),
 Sage SMALLINT,
 Sdept CHAR(20)
 );

課程表:Coursecode

CREATE TABLE Course
 (Cno CHAR(4) PRIMARY KEY,
 Cname CHAR(40) NOT NULL,
 Cpno CHAR(4),
 Ccredit SMALLINT,
 FOREIGN KEY(Cpno) REFERENCES Course(Cno)
 /*表級完整性約束條件,Cpno是外碼,被參照表是Course,被參照表是Cno*/
);

選課表SC對象

CREATE TABLE SC
 (Sno CHAR(9),
 Cno CHAR(4),
 Grade SMALLINT,
 PRIMARY KEY(Sno,Cno),
 FOREIGN KEY(Sno)REFERENCES Student(Sno),
 FOREIGN KEY(Cno)REFERENCES Course(Cno)
);

而後會創建三個表 :以下排序

接下來插入數據:索引

 insert
into Student(Sno,Sname,Ssex,Sage,Sdept)
values('201215121','李勇','男',20,'CS');

按上述方式插入全部的數據:以下:數學

數據的查詢:

查詢條件 謂詞
比較 =,>,<,<=,!=,!>,<>,NOT+上述比較運算符
肯定範圍 beetween and ,not between (上限)and(下線)
肯定集合 IN, NOT IN
字符匹配 like,not like
空值 IS NULL,IS NOT NULL
多重條件(邏輯運算) AND,OR,NOT

列如:查詢既不是計算機,數學系,也不是信息系的學生的姓名和性別。

select Sname,Ssex
from Student
where Sdept NOT IN('CS','MA','IS');

order by子句對查詢結果按照一個或者多個屬性列升序(ASC)降序(DESC)排列,默認爲升序。

查詢全體學生,查詢結果在同一系號升序,同一系按年齡降序。

select *
from student
order by Sdept,Sage DESC;

彙集函數

COUNT(*) 統計元組個數
COUNT([DISTINCT|ALL]<列明>) 統計一列中值的個數
SUM([DISTINCT|ALL]<列明>) 計算一列中的和(必須爲數值型)
AVG([DISTINCT|ALL]<列明>) 計算平均值(數值型)
MAX([DISTINCT|ALL]<列明>) 最大
MIN([DISTINCT|ALL]<列明>) 最小

GROUP BY(group by)將查詢結果分組。分組後的彙集函數(只能用於select子句或者group by中的having)做用於每一個組,每組由一個函數值。

查詢成績大於90分的學號和平均成績:

select Sno,AVG(Grade)
from SC
group by Sno
having AVG(Grade)>=90;

鏈接查詢:

查詢每門課的間接先修課。要對Course表取兩個別名。

select FIRST.Cno,SECOND.Cpno
from Course FIRST,Course SECOND
where First.Cpno=SECOND.Cno;

嵌套查詢:

列如:

select Sname
from Student
where Sno IN
    (select Sno
    from SC
    where Cno='2');

子查詢select中不能使用order by子句,order by只對最終結果排序。

若是子查詢的查詢條件依賴於父查詢,這類查詢稱爲相關子查詢。

找出每一個學生中比他選修課平均成績高的課程號:

select Sno
from SC x
where Grade>=(select AVG(Grade)
               from SC y
               where y.Sno=x.Sno
                );

從外層查詢中取出一個元組x,將元組x的Sno值傳送給內層查詢,執行內層查詢獲得成績的平均值,用該值代替內層查詢獲得外層查詢。

列題:查詢非計算機科學系中比計算機科學系中任意一個學生小的學生姓名和Sage。

select Sname,Sage
from student
where Sage<any(select Sage
                        from Student
                        where Sdept='CS')
AND Sdept!='CS';
any 大於查詢結果中的某個值  >= <= != 等均可以。
all 大於查詢結果中的全部值  >= <= != 等均可以。

本查詢也能夠用聚焦函數實現。首先用子查詢查出CS中最大年齡(20),而後在父類查詢中查詢非CS系小於20的學生。

select Sname,Sage
from Student
where Sage<
            (select MAX(Sage)
            from Student
            where Sdeot='CS')
AND Sdept!='CS';

帶有EXISTS謂詞的子查詢不返回任何數據,只產生邏輯真值true或者假false。

列如:選修了一號課程的學生姓名。

select Sname
from Student
where EXISTS
            (select *
            from SC
            where Sno=Student.Sno AND Cno='1');

集合運算:

並操做UNION 交操做INTERSECT 差操做EXCEPT

列如查詢計算機科學系的學生及年齡不大於19歲的學生。

select *
from Student
where Sdept='CS'
UNION
select *
from Student
where Sage<10;

查詢計算機科學系的學生與年齡不大於19歲學生的交集。(也就是查詢計算機科學系中年齡不大於19歲的學生。)

select *
from Student
where Sdept='CS'
INTERSERT
select*
FROM Student
where Sage<=19;

 參考書籍:數據庫系統概論

相關文章
相關標籤/搜索