Các ngôn ngữ thao tác dữ liệu
Ngän ngỉỵ SQL Chỉång 3: CẠC NGÄN NGỈỴ THAO TẠC DỈỴ LIÃÛU 3.1 Ngän ngỉỵ truy váún dỉỵ liãûu SQL Trong mủc ny trçnh by ngän ngỉỵ dỉỵ liãûu (Structered Query Language), SQL l ngän ngỉỵ con dỉỵ liãûu âỉc xạc nháûn l ráút mảnh , phäø dủng v lải dãù sỉí dủng . SQL l ngän ngỉỵ phi th tủc, chøn mỉûc v âiãøn hçnh. Do váûy hiãûn nay ráút nhiãưu sn pháøm pháưn mãưm âãưu âỉåüc ci âàût SQL nhỉ : Oracle, DB2, . Trong pháưn ny s trçnh by cạc kh nàng ca ngän ngỉỵ SQL. Phẹp toạn cå bn trong SQL l phẹp ạnh xả âỉåüc miãu t bàòng khäúi lãûnh SELECT - FROM - WHERE. Cạc mãûnh âãư ca ngän ngỉỵ SQL s âỉåüc trçnh by chi tiãút bàòng vê dủ. Cạc thût ngỉỵ trong Cå Såí Dỉỵ Liãûu quan hãû nhỉ quan hãû , thüc tênh , bäü, âỉåüc thay thãú bàòng cạc thût ngỉỵ nhỉ : Bng( Table), cäüt(colum), bn ghi(Record) hồûc hng(Row) trong SQL. Chụng ta s xem cạc chỉïc nàng cå bn ca mäüt hãû qun trë Cå Såí Dỉỵ Liãûu nhỉ cung cáúp ngän ngỉỵ âënh nghéa dỉỵ liãûu (DDM), Ngän ngỉỵ thao tạc dỉỵ liãûu(DML) , tçm kiãúm v bo vãû dỉỵ liãûu âỉåüc thãø hiãûn trong ngän ngỉỵ SQL nhỉ thãú no. 1. Âënh nghéa dỉỵ liãûu Trong SQL cho phẹp ngỉåìi sỉí dủng tảo cạc dỉỵ liãûu nhỉ Bng(table), Khung nhçn(View), v cạc táûp chè säú(Index) * Lãûnh tảo bng Cụ phạp: CREAT TABLE Ten_Bang(Atr1 Type [NOT NULL], Atr2 Type [NOT NULL], .) Trong âọ Ten_Bang: tãn ca table tảo ra; tãn bng l xáu k tỉû báút k khäng cọ k hiãûu träúng v khäng trng våïi tỉì khọa Atr1, Atr2 : Tãn cạc thüc tênh (Cạc cäüt ca bng) Type: Kiãøu dỉỵ liãûu cho thüc tênh. Mäüt säú loải dỉỵ liãûu thỉåìng dng nhỉ: integer: säú ngun tỉì -2 174 483 648 âãún 2 174 483 648 Smallinteger: säú ngun tỉì - 32 768 âãún 32 767 decimal(n,p) säú tháûp phán våïi âäü di täúi âa n kãø c p chỉỵ säú tháûp phán ( khäng tênh dáúu cháúm tháûp phán). Tỉì khọa number trong SQL âỉc dng trong dảng dỉỵ liãûu ny. float: säú dáúu pháøy âäüng char(n): xáu k tỉû cọ âäü di cäú âënh n, n≤ 255 varchar(n) xáu k tỉû cọ âäü di biãún âäøi, âäü di xáu cọ thãø tỉì 0 âãún n v âỉåüc xạc âënh tải thåìi âiãøm âỉa dỉỵ liãûu vo lỉu trỉỵ date: dỉỵ liãûu dảng ngy thạng chè thë NOT NULL âãø bạo ràòng giạ trë ca thüc tênh âọ khäng âỉåüc thiãúu trong cạc bäü ca quan hãû Ngän ngỉỵ SQL Vê Dủ: Tảo Cå Såí Dỉỵ Liãûu gäưm 3 bng S(nh cung cáúp SUPPLIERS), P ( Sn pháøm PRODUCTS) v bng SP (Cung cáúp) nhỉ sau: - Tảo bng S: CREATE TABLE S ( S# INTEGER NOT NULL,SNAME VARCHAR(8) NOT NULL,AGES INTEGER NOT NULL, CITY VARCHAR(30) NOT NULL) Chụ : NULL l giạ trë ngáưm âënh - Tảo bng P:(Bng sn pháøm) CREATE TABLE P (P# INTEGER NOT NULL, PNAME VARCHAR(10) NOT NULL, WEIGHT INTEGER NOT NULL, COLOR VARCHAR(10) NOT NULL, CITY VARCHAR(30) NOTNULL) - Tảo bng SP: CREATE TABLE SP (S# INTEGER NOT NULL, P# INTEGER NOT NULL, QTY INTEGER,SDATE DATE NOT NULL, PRICE DECIMAL(8,2)). Vo dỉỵ liãûu : Cọ ba cạch âãø vo dỉỵ liãûu cho bng nhỉ sau INSERT INTO S(S#,SNAME,AGES,CITY) VALUE(1,’Thanh Huong’, 30,’ TP Ho Chi Minh’) Nãúu vë trê ca cạc cäüt trong bng cäú âënh, ta cọ thãø viãút INSERT INTO S VALUE(1,’Thanh Huong’, 30,’ TP Ho Chi Minh’) Ngỉåìi vo dỉỵ liãûu cọ thãø qn vë trê cạc cäüt, khi âọ ta cọ thãø biãøu diãùn nhỉ sau: INSERT INTO S(S#,AGES,CITY, SNAME) VALUE(1, 30, ’ TP Ho Chi Minh’, ’Thanh Huong’) 2. Tçm Kiãúm dỉỵ liãûu Trong SQL Âáy l chỉïc nàng cå bn nháút ca SQL, cho phẹp ngỉåìi sỉí dủng tçm kiãúm cạc thäng tin trãn Cå Såí Dỉỵ Liãûu våïi Cáu lãûnh SELECT .FROM WHERE Cụ phạp: SELECT [*| DISTINCT] Danh sạch cạc cäüt âỉa ra FROM Tãn_Bng/Tãn_View [WHERE biãøu thỉïc âiãưu kiãûn] [GROUP BY Danh sạch cạc cäüt] [HAVING biãøu thỉïc âiãưu kiãûn] [ORDER BY Tãn_cäüt [ASC/DESC] Gii thêch cạc tham säú bàòng cạc vê dủ Ngän ngỉỵ SQL 2.1 Tçm kiãúm theo cáu hi âån gin Tçm kiãúm khäng âiãưu kiãûn: i. Cho biãút danh sạch cạc nh cung cáúp: SELECT * FROM S Dáúu ‘*’ cọ nghéa l chn ton bäü cạc cäüt trong bng. Âãø bng kãút qu sau khi thỉûc hiãûn mäüt mãûnh âãư SQL âụng l mäüt quan hãû (Cọ nghéa l khäng cọ cạc bäü trng nhau) thç phi cọ tỉì khọa DISTINCT. SELECT DISTINCT PNAME FROM SP Tçm kiãúm våïi âiãưu kiãûn âån gin Tçm m säú ca nhỉỵng nh cung cáúp â cung cáúp màût hng P2 SELECT S# FROM SP WHERE P#=’P2’ Tçm kiãúm cọ xỉí l xáu k tỉû Xỉí l xáu k tỉû gáưn âụng cn gi l phẹp tênh “thäng minh” trong trỉåìng håüp ngỉåìi sỉí dủng khäng nhåï r tãn ngỉåìi hồûc âëa danh . vê dủ l Hoa hay Hoan khi âọ ta cọ thãø viãút SELECT * FROM S WHERE SNAME LIKE ‘HOA%” Trong SQL sỉí dủng k hiãûu ‘%’ l thay thãú cho mäüt xáu con báút k, dáúu phán cạch ‘_’ âãø thay thãú cho mäüt k tỉû. A%B : Xáu k tỉû bàõt âáưu bàòng chỉỵ A v kãút thục bàòng chỉỵ B %A Xáu k tỉû báút k kãút thục bàòng chỉỵ A A_B : Xáu bao gäưm 3 k tỉû , k tỉû thỉï 2 l báút k A_ : Xáu cọ hai k tỉû, k tỉû âáưu l A Xỉí l ngy thạng Tçm nhỉỵng màût hng bạn trỉåïc ngy 94-04-24 10 ngy SELECT P# FROM SP WHERE ‘94-04-24’ - SDATE =10 Tçm kiãúm sỉí dủng IN v BETWEEN Tçm nhỉỵng màût hng â cung cáúp cọ giạ tỉì 1000 âãún 2000 SELECT P# FROM SP WHERE PRICE BETWEEN 1000 AND 2000 Tçm m säú nhỉỵng nh cung cáúp â cung cáúp êt nháút mäüt trong cạc màût hng P1,P2,P3 Ngän ngỉỵ SQL SELECT S# FROM SP WHERE P# IN (‘P1’,’P2’,’P3’) CẠC HM THỈ VIÃÛN Cng giäúng nhỉ cạc ngän ngỉỵ Cå Såí Dỉỵ Liãûu khạc, Trong SQL cọ cạc hm máùu gäưm COUNT, MAX, MIN, SUM, AVG. Riãng hm COUNT khi cọ âäúi säú l ‘*’ cọ nghéa l âãúm säú bng ghi tha mn u cáưu tçm kiãúm m khäng quan tám âãún báút k cäüt no. Vê du Cho biãút säú láưn màût hng P2 â âỉåüc cung cáúp SELECT COUNT(*) FROM SP WHERE P#=’P2’ Tçm hiãûu säú màût hng P1 bạn mäüt láưn nhiãưu nháút v mäüt láưn êt nháút ca hng S1 SELECT MAX(QTY) - MIN(QTY) FROM SP WHERE S#=’S1’ AND P#=’P1’ Tçm kiãúm nhåì mãûnh âãư GROUPE BY Tçm m säú nhỉỵng màût hng m mäùi nh cung cáúp â cung cáúp cho khạch hng. SELECT S#,P# FROM SP GROUPE BY S# trong mãûnh âãư ny bng dỉỵ liãûu SP âỉåüc láúy ra, sau âọ phán thnh nhọm theo m säú ca ngỉåìi cung cáúp (S#). Cọ nghéa l cạc bäü cọ cng giạ trë S# s âỉåüc xãúp liãn tiãúp nhau, hãút nhọm ny âãún nhọm khạc. Tçm kiãúm nhåì mãûnh âãư HAVING Mãûnh âãư HAVING thỉåìng âỉåüc sỉí dủng cng mãûnh âãư GROUP BY. Sau HAVING la biãøu thỉïc âiãưu kiãûn. Biãøu thỉïc âiãưu kiãûn ny khäng tạc âäüng vo ton bng âỉåüc chè ra åí mãûnh âãư FROM m chè tạc âäünáưnnnn lỉåüt âãún tỉìng nhọm cạc bn ghi â chè ra tải mãûnh âãư GOUP BY. Vê dủ: Tçm m säú nhỉỵng nh cung cáúp â cung cáúp êt nháút hån hai màût hng SELECT S# FROM SP GROUP BY S# HAVING CUONT (DISTINCT P#)>2 Tçm kiãúm cọ sàõp xãúp Tçm tãn cạc màût hng mu â v sàõp xãúp theo thỉï tỉû ca m säú màût hng SELECT PNAME,P# Ngän ngỉỵ SQL FROM P WHERE COLOUR = ‘RED’ ORDER BY P# ASC Mãûnh âãư ORDER BY cho phẹp ta sàõp xãúp cạc cäüt theo thỉï tỉû tàng dáưn (ASC) hồûc gim dáưn (DESC), ngáưm âënh l ASC Mãûnh âãư ORDER BY cọ thãø sàõp xãúp theo nhiãưu cäüt. Nãúu nọ âỉïng sau mãûnh âãư GROUP BY thç miãưn tạc âäüng l tỉìng nhọm ca cäüt âỉåüc chè ra trong mãûnh âãư GROUP BY. Nãúu cäüt sàõp xãúp cọ màût åí mãûnh âãư SELECT thç trong mãûnh âãư ORDER BY cọ thãø chè cáưn chè ra säú thỉï tỉû ca cäüt âọ trong danh sạch tham chiãúu l â. trong vê dủ trãn ta cọ thãø viãút SELECT PNAME,P# FROM P WHERE COLOUR = ‘RED’ ORDER BY 2 ASC Tçm kiãúm våïi cáu hi phỉïc tảp Trong pháưn ny s trçnh by viãûc tçm kiãúm dỉỵ liãûu trãn nhiãưu bng thäng qua phẹp kãút näúi hồûc viãûc sỉí dủng cạc ạnh xả läưng. Kh nàng kãút näúi dỉỵ liãûu Trong phẹp kãút näúi, cạc cäüt tham gia kãút näúi phi cọ miãưn trë l so sạnh âỉåüc våïi nhau. Tãn cäüt ca cạc bng khạc nhau cọ thãø viãút tỉåìng minh qua tãn bng. Vê Dủ: Våïi mäùi màût hng âỉåüc cung cáúp , hy cho biãút m säú ca màût hng v âëa chè ca hng â cung cáúp màût hng âọ. SELECT DISTINCT P#, CITY FROM SP, S WHERE SP.S# =S.S# nh xả läưng Ta cọ thãø sỉí dủng nhỉỵng mãûnh âãư SELECT läưng nhau Vê dủ: Tçm tãn nhỉỵng hng â cung cáúp màût hng P2 SELECT SNAME FROM S WHERE S# IN( SELECT S# FROM SP WHERE P#=’P2’) Ngän ngỉỵ SQL Phẹp läưng nhau cọ thãø läưng nhiãưu mỉïc hồûc sỉí dủng sỉû dáùn tr giỉỵa cạc khäúi mäùi khi hỉåïng tåïi mäüt bng khạc nhau Vê dủ: Tçm tãn cạc hng khäng cung ỉïng màût hng P1 SELECT SNAME FROM S WHERE ‘P1’ NOT IN SELECT P# FROM SP WHERE S#= S.S# Trong SQL cn cho phẹp tçm kiãúm trãn nhiãưu bng nhåì mãûnh â EXISTS (täưn tải) Vê dủ: Tçm kiãúm nhỉỵng nh cung cáúp â cung cáúp êt nháút mäüt màût hng no âọ SELECT * FROM S WHERE EXISTS (SELECT * FROM SP WHERE SP.S#=S.S#) Hồûc cọ thãø biãøu diãùn bàòng cạch khạc SELECT * FROM S WHERE 0< (SELECT COUNT(*) FROM SP WHERE SP.S#=S.S#) Tçm kiãúm cọ sỉí dủng lỉåüng tỉì ANY v ALL Tçm tãn nhỉỵng màût hng cọ m säú màût hng l màût hng no âọ m hng S1 â cung cáúp SELECT PNAME FROM P WHERE P#= ANY SELECT P# FROM SP WHERE S#=’S1’ Tçm tãn nhỉỵng nh cung cáúp cung cáúp êt nháút mäüt màût hng mu â SELECT SNAME Ngän ngỉỵ SQL FROM S WHERE S#= ANY SELECT S# FROM SP,S,P WHERE S.S#=SP.S# AND P.P#=SP.P# AND COLOUR=’RED’ Tçm m säú nhỉỵng nh cung cáúp säú lỉåüng mäyt láưn mäüt màût hng no âọ låïn hån hồûc bàòng säú lỉåüng mäùi láưn cung ỉïng ca hng SELECT S# FROM SP WHERE QTY >= ALL SELECT QTY FROM SP Mãûnh âãư trãn hon ton tỉång âỉång våïi SELECT S# FROM SP WHERE QTY = (SELECT MAX( QTY) FROM SP) Tçm nhỉỵng hng chỉa hoảt âäüng SELECT * FROM S WHERE NOT EXISTS SELECT * FROM SP WHERE SP.S# = S.S# Chụ mãûnh âãư NOT EXISTS cọ giạ trë âụng (True) nãúu kãút qu ca cáu hi sau nọ l mäüt táûp räùng. Tçm kiãúm cọ chỉïa phẹp tênh táûp håüp Tçm m säú nhỉỵng hng hiãûn thåìi chỉa cung cáúp mäüt màût hng no c SELECT S# FROM S MINUS SELECT S# FROM SP Tçm tãn cạc hng cung cáúp, cung cáúp táút c cạc màût hng SELECT SNAME FROM S WHERE ( SELECT P# Ngän ngỉỵ SQL FRPM SP WHERE S#=S.S#) = (SELECT P# FRPM P) 3. Cạc lãûnh cáûp nháût dỉỵ liãûu Thãm mäüt bäü vo trong quan hãû Cụ phạp: INSERT INTO Tãn_Bng(Danh sạch tãn cäüt) VALUES(Danh sạch cạc trë) [cáu hi con] Vê dủ: cọ thãø bäø sung mäüt táûp cạc bn ghi l kãút qu xỉí l ca mäüt cáu hi no âọ, chàón hản: Gi sỉí ta cọ bng W cọ cng lỉåüc âäư nhỉ bng P. khi âọ mãûnh âãư sau âáy s bäø sung vo bng P táút c nỉỵng bäü tỉì bng W nhỉỵng màût hng cọ máưu â INSERT INTO P SELECT * FROM W WHERE COLOUR =’RED’ + Xọa cạc bäü Cụ phạp DELETE FROM tãn_bng [WHERE btâk] Vê dủ: Loải b hng S1 ra khi bng S DELETE FROM S WHERE S#=’S1’ Lai b cạcmàût hng âỉåüc cung cáúp sau ngy 20 -5- 1994 DELETE FROM SP WHERE SDATE >’1994-5-20’ Loải b cạc hng chỉa cung cáúp màût hng no DELETE FROM S WHERE S# NOT IN (SELECT S# FROM SP) + Sỉía âäøi dỉỵ liãûu Ngän ngỉỵ SQL Cụ phạp: UPDATE [Tãn_bng] SET [Tãn_cäüt=Biãøu thỉïc, .] [FROM Tãn_Bng] [WHERE btâk] Vê dủ: Âäøi mu cạc màût hng P2 thnh mu vng UPDATE P SET COLOUR =’ YELLOW’ WHERE P#= ‘ P2’ + Thãm mäüt cäüt vo bng Cụ phạp: ALTER TABLE Tãn_Bng [ADD/MODIFY][(Tãn_cäüt Kiãøu dỉỵ liãûu ] ADD: Thãm cäüt måïi vo MODIFY : Sỉía cäüt d cọ trong quan hãû Vê dủ: thãm cäüt DONGIA ( âån giạ) cho bng SP våïi kiãøu dỉỵ liãûu dảng säú tháûp phán ALTER TABLE SP ADD DONGIA DECIMAL(8.2) + Xọa bng: cụ phạp: DROP TABLE Tãn_bng Xọa VIEW Cụ phạp DROP VIEW Tãn_view Tảo tãûp chè säú Trong SQL khäng cọ cå chãú tỉû âäüng tảo tãûp chè säú cho cạc cäüt ca bng. Viãûc tảo tãûp chè säú do ngỉåìi dng thủc hiãûn. Cụ phạp nhỉ sau: CREATE [UNIQUE] INDEX tãn_tãûp_chè_säú ON tãn_bng (tãn_cäüt [ASC|DESC]) Hy b chè säú thç sỉí dủng mãûnh âãư DROP INDEX tãn_tãûp_chè_säú Vê dủ:tảo tãûp chè säú 13 theo cäüt City tàng dáưn ca bng S CREATE INDEX 13 ON S(CITY ASC) Trong SQL cọ thãø täø chỉïc âa chè säú, tỉïc l täø chỉïc mäüt tãûp chè säú cho nhiãưu cäüt, mäùi cäüt cọ thãø cọ chiãưu tàng gim khạc nhau, thỉï tỉû âỉåüc tênh tỉì trại qua phi Vê dủ tảo tãûp chè säú 14 cho bng SP theo cäüt S# tàng dáưn v theo cäüt P# gim dáưn CREATE INDEX 14 ON SP(S# ASC, P# DESC) 4. Cạc mãûnh âãư an ton dỉỵ liãûu Âáy l úu täú khäng thãø thiãúu âỉåüc âäúi våïi mäüt hãû qun trë Cå Såí Dỉỵ Liãûu âãø bo vãû dỉỵ liãûu v ngàn chàûn nhỉỵng ngỉåìi khäng âỉåüc phẹp truy cáûp. Cạc quưn truy cáûp vo Cå Såí Ngän ngỉỵ SQL Dỉỵ Liãûu gäưm: Read(âc), Write(ghi), Insert(bäø sung), Update(Sỉía âäøi),Select(chn),Delete(xọa)Run(chảy). Viãûc phán phạt quưn truy cáûp vo Cå Såí Dỉỵ Liãûu do ngỉåìi qun trë Cå Såí Dỉỵ Liãûu do ngỉåìi qun trë Cå Såí Dỉỵ Liãûu (database administrator -DBA) thỉûc hiãûn båíi lãûnh sau: Giạn quưn truy cáûp cho ngỉåìi sỉí dủng: Lãûnh GRANT cụ phạp: GRANT Quưn truy cáûp ON Tãn_bng/view TO Tãn_User [ with GRANT option] Tỉì khọa with GRANT option âãø cho ngỉåìi âỉåüc cáúp quưn cọ thãø tiãúp tủc trao quưn cho ngỉåìi khạc. Nãúu tãn_User l Public hồûc Word thç cọ nghéa l cho mi ngỉåìi sỉí dủng. Vê dủ: trao quưn sỉí dủng bng S cho cä Häưng GRANT READ ON S TO HONG with GRANT option Lãûnh ny cä Häưng cọ thãø trao quưn âc bng S cho ngỉåìi dng khạc Hy b quưn truy cáûp: REVOKE Tãn_quưn ON tãn_bng FROM Tãn_User vê dủ:Rụt lải quưn âc bng S ca User Häưng REVOKE READ ON S FROM HONG . Ngän ngỉỵ SQL Chỉång 3: CẠC NGÄN NGỈỴ THAO TẠC DỈỴ LIÃÛU 3.1 Ngän ngỉỵ truy váún dỉỵ liãûu SQL Trong mủc ny trçnh. Såí Dỉỵ Liãûu nhỉ cung cáúp ngän ngỉỵ âënh nghéa dỉỵ liãûu (DDM), Ngän ngỉỵ thao tạc dỉỵ liãûu(DML) , tçm kiãúm v bo vãû dỉỵ liãûu âỉåüc thãø hiãûn trong