功能概述 DDL,資料庫定義語言,創建,修改,刪除資料庫,表,視圖,索引,約束條件等 DML,資料庫操縱語言,對資料庫中的數據進行增,刪,改,查 DCL,資料庫定義語言,對資料庫總數據的訪問設置許可權 SQL語言是集DDL,DML,DCL為一體的資料庫語言,學好資料庫首先要掌握下麵9個引導詞 DDL語... ...
功能概述
- DDL,資料庫定義語言,創建,修改,刪除資料庫,表,視圖,索引,約束條件等
- DML,資料庫操縱語言,對資料庫中的數據進行增,刪,改,查
- DCL,資料庫定義語言,對資料庫總數據的訪問設置許可權
SQL語言是集DDL,DML,DCL為一體的資料庫語言,學好資料庫首先要掌握下麵9個引導詞
- DDL語言引導詞:CREATE(創建),ALTER(修改),DROP(撤銷)
- DML語言引導詞:INSERT(增),DELETE(刪),UPDATE(改),SELECT(查)
- DCL語言引導詞:GRANT(授權),REVOKE(調用)
創建表
下麵來創建多個表
學生表:學號(sn),姓名(sname),性別(sex),年齡(sage), 所屬系(dn),班級(sclass)
create table student( sn char(8), sname char(10), ssex char(2), sage integer, dn char(2), sclass char(6)) engine=MYISAM character set utf8;
INSERT INTO student (sn, sname, ssex, sage, dn, sclass) VALUES ('98030101', '張三', '男', '20', '03', '980301' ) ;
院系表:系別(dn),系名(dname),系主任(dean)
create table dept(dn char(2), dname char(10), dean char(10)) engine=MYISAM character set utf8;
INSERT INTO dept(dn, dname, dean) VALUES("01", "機電", "李三");
課程表:課程號(cn),課程名(cname),教師編號(tn),學時(chours),學分(credit)
create table course(cn char(3), cname char(12), tn char(3), chours integer, credit float(1)) engine=MYISAM character set utf8;
INSERT INTO course(cn, cname, tn, chours, credit) VALUES("001", "資料庫", "001", 40, 6);
教師表:教師編號(tn),教師名(tname),所屬院系(dn),工資(salary)
create table teacher(tn char(3), tname char(10), dn char(2), salary float(2)) engine=MYISAM character set utf8;
INSERT INTO teacher(tn, tname, dn, salary) VALUES ("001", "趙三", "01", 1200.00);
選課表:學號(sn),課程號(cn),成績(score)
create table sc(sn char(8), cn char(3), score float(1)) engine=MYISAM character set utf8;
INSERT INTO sc(sn, cn, score) VALUES ("980230101", "001", 92);
下麵是創建後完整的表
student
dept
teacher
course
sc
簡單查詢操作
- 檢索學生表中所有年齡小於等於19歲的學生姓名和年齡
SELECT sname, sage FROM student WHERE sage<=19;
- 檢索教師表中所有工資 少於1500元或者工資大於2000元,並且是03系的教師姓名(註意括弧)
SELECT tname
FROM teacher
WHERE (salary<1500 OR salary>2000) AND dn="03";
- 求既學過001課程又學過002課程的同學學號(錯誤版)
SELECT sn
FROM sc
WHERE cn="001" AND cn="002";
上面的語句是錯誤的,因為WHERE條件是對每條記錄進行檢查,在一條記錄中cn不可能同時為001又為002
- 在選課表中查詢成績大於80分的學號(結果重覆版)
SELECT sn
FROM sc
WHERE score>80;
- 在選課表中查詢成績大於80分的學號(結果未重覆)
SELECT DISTINCT sn
FROM sc
WHERE score>80;
- 按學號由小到大的順序顯示出所有學生的學號和姓名
SELECT sn,sname
FROM student
ORDER BY sn ASC;
ORDER是對查詢後的結果進行排序
- 檢索002號課大於80分的所有同學學號並按成績由高到低順序顯示
SELECT sn
FROM sc
WHERE score>80 AND cn="002"
ORDER BY score DESC;
模糊查詢
模糊查詢是當我們不能精確查詢條件時,可以使用的。比如我們想找一個人,但只知道這個人姓張,這時候我們可以通過模糊查詢來找出姓張的,然後做具體分析。
- 檢索所有姓張的同學
SELECT sname
FROM student
WHERE sname LIKE "張%";
%號表示匹配零個或多個字元
- 檢索名為張某某的同學姓名
SELECT sname
FROM student
WHERE sname LIKE "張__";
註意張後面是兩個下劃線,一個下劃線代表一個字元。
- 檢索不姓張的同學姓名
SELECT sname
FROM student
WHERE sname NOT LIKE "張%";
多表聯合查詢
多表聯合查詢涉及到表的連接操作,通過通過將多個表連成一張大表,然後做查詢操作。前面我們在關係代數中提到表的連接可以通過笛卡爾積+選擇來實現,而SQL中也是這樣處理的。
- 按001號課成績由高到低順序顯示所有學生的姓名
SELECT DISTINCT sname
FROM student,sc
WHERE student.sn=sc.sn AND sc.cn="001"
ORDER BY score DESC;
先將student和sc表進行笛卡爾積運算形成一張大表,然後執行WHERE條件判斷進行選擇,接著執行排序操作,最後將需要的屬性值投影出來。
- 按資料庫課成績從高到底顯示同學姓名
SELECT DISTINCT sname
FROM student,sc,course
WHERE student.sn=sc.sn AND sc.cn=course.cn AND course.cname="資料庫"
ORDER BY score DESC;
重名操作
當表自連接時需要對錶進行重名操作,不僅對錶起別名而且需要對投影的列也要進行別名處理。
as是可以省略的
- 查詢薪水有差額的老師姓名
SELECT T1.tname AS teacher1,T2.tname AS teacher2
FROM teacher AS T1,teacher AS T2
WHERE T1.salary > T2.salary;
註意:查詢後列名發生了變化
- 查詢既學過001課程又學過002課程的學生學號
SELECT sc1.sn
FROM sc AS sc1, sc AS sc2
WHERE sc1.cn="001" AND sc2.cn="002" AND sc1.sn=sc2.sn;
我們可以看到上面的操作中未對屬性名進行別名處理,是因為查詢的結果集中屬性名不衝突。
插入操作
簡單的插入操作我們在創建表的時候已經介紹過了,下麵介紹一下更為複雜操作。
下圖中是將從student表中找到的數據直接插入到st(sn,sname)當中去。由此可看出,insert語句後面是可以跟子查詢的。
刪除操作
- 刪除98030101號同學所選的課程
DELETE FROM sc WHERE sn="98030101";
更新操作
語法格式
- 將所有教師工資上調5%
UPDATE teacher SET salary=salary*1.05;