数据库----数据库语言

SQL概述

SQL特点

结构化查询语言(StructuredQueryLanguage)简称SQL,是一种特殊目的的***编程语言***,是一种***数据库查询***和***程序设计语言***,用于***存取数据***以及***查询***、更新***和***管理关系数据库系统

结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

SQL有五个特点:
综合统一;
高度非过程化;
面向集合的操作方式;
两种使用方式;
语言简洁、易学易用。

SQL基本组成

◎SQL由以下几个部分组成:

数据定义语言DDL:用于定义、删除、修改关系模式及视图;

数据操作语言DML:用于查询、插入和修改等。

事务控制:控制事务的开始及结束的命令。

完整性:限制数据库中的数据必须满足的完整性约束条件的命令。

权限管理:对关系和视图访问权限的命令。

数据定义

定义基本表

◎SQL语言使用动词CREATE定义基本表,其具体语法格式如下:
CREATE TABLE <表名>
(<列名><数据类型>[列级完整性约束条件][<列名><数据类型>[列级完整性约束条件][<表级完整性约束条件>])

修改删除基本表

◎修改基本表的命令格式如下:

ALTER TABLE <表名>
[ADD <新列名><数据类型>[完整性约束]]
[DROP <完整性约束名>]
[MODIFY <列名><数据类型>];
例如,向Student表增加"入学时间"列,其数据类型为日期型。SQL 命为:ALTER TABL E Student Add Scome Date;

◎DROP TABLE <表名>
例如,要删除Student表的命令为:DROP TABLE Student;注意:基本表一旦删除,表中的数据、表上建立的索引和视图都将自动被删除。

例题:

◎在SQL语言中,删除基本表的命令是(1)修改表中数据的命令是(2)。

(1)A.DESTROY TABLE
B.REMOVE TABLE
C.DELETE TABLE
D.DROP TABLE

(2)A.REVOKE
B.CHANGE
C.UPDATE
D.MODIFY
试题分析:在SQL语言中,对表的操作命令有:建表CREATE TABLE、修改表ALTER TABLE(与MODIFY配合可修改列的数据类型)、删除表DROP TABLE。要修改表的数据(元组)则用UPDATE,要删除表中元组则用DELETE

建立、删除视图

◎建立视图的命令格式如下:

CREATE VIEW <视图名>[<列名>[<列名>]…)]
AS 子查询 [With Check Option]
其中With Check Option表示对视图进行Update Insert和Delete操作时,要保证更新、插入或删除的行要满足视图定义中的谓词条件。

例如,建立信息系学生的视图:

CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage
FROM Student WHERE Sdept= ‘IS’ With Check Option;

◎删除视图的命令格式为:DROP 视图名
例如,要删除视图 IS_S1:DROP VIEW IS_S1;

◎建立、删除索引

◎建立索引的命令格式如下:CREATE[Unique][Cluster]INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[次序]…);

其中<次序>可以为ASC(升序,默认)、DESC(降序)。

Unique:每个索引值只对应惟一的数据记录。

Cluster:聚簇索引,即索引项的顺序与表中记录的物理顺序一致。

例如,要在Student表的Sname列上建立一个聚簇索引,并按升序排 列的命令为:CREATE Cluster INDEX Stuname ON Student(Sname);

◎删除索引的SQL命令格式为:DROP INDEX <索引名>
例如,要删除Student表的索引Stuname的命令为:DROP INDEX Stuname;

数据查询

◎SELECT基本结构

◎在SQL语言中,只提供了一个动词SELECT用来进行数据查询操作,但这个动词的参数十分复杂,且能嵌套使用,所以,考试时往往就考这个功能。其通用格式如下:
SELECT[AII | Distinct]<目标列表达式>[<目标列表达式…

FROM <表名或视图名>[<表名或视图名>]…

[WHERE <条件表达式>]

[GROUP BY <列名1>[HAVING <条件表达式>]

[ORDER BY <列名2>[ASC I DESC];
注意:若没有指定Distinct,则缺省的是AlI,即保留结果表中重复的行;ASC表示升序,是缺省值。

单表查询

假设有上述的student表,还有课程表course(cno,cname,credit,cpno)和选修表sc(sno,cno,grade)。其中cno为课程号,cname为课程名称,cpno为先修课程号,credit为学分,grade为成绩。例如

(1)查询全体学生的学号与姓名的命令格式为:
SELECT Sno,Sname FROM student;

(2)查询全体男学生的详细记录的命令为:
SELECT * FROM student WHERE Ssex='男;

(3)查询所有年龄大于21岁的学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。其格式如下:
SELECT Sname,'Year of Birth:2004一Sage,lower(Sdept)
FROM student WHERE Sage>21;
(4)查询IS系、MA系和CS系学生的姓名和性别的命令格式为:
SELECT Sname,sec FROM student WHERE Sdept In(‘IS’,MA:CS);

字符匹配、结果排序

◎(1)查询名字中第2个字为阳的学生的姓名、学号的命令格式为:
SELECT Sname Sno FROM student
WHERE Sname LIKE’_ 阳%’;
其中的"
“代表一个字符,而”%"代表0到若干个字符。一个汉字占两个字符。

(2)查询DB Design课程的课程号和学分的命令格式为:
SELECT Cno,credit FROM Course
WHERE Cname LIKE ‘DBI_ Design’ Escape ‘’;

(3)查询选修了3号课程的学生的学号及成绩,查询结果按分数的降序排列所有有成绩的学生学号和课程号。
SELECT Sno,Grade FROM SC WHERE Cno=‘3’ ORDER BY Grade DESC;

聚集函数

◎在SQL语言中,也可以使用集函数:
Count([Distint|AlI] ): 统计兄组个数;
Count([Distint|AIl]<列名>):统计一列中值的个数:
Sum([Ditint|All]<列名>):计算一列值的总和;
Avg([Distint|All]<列名>):计算一列值的平均值;
max([Distint|AIl]<列名>):求一列值中的最大值:
Min([DistinctAll]<列名>):求一列值中的最小值。
注意,ALL是缺省值。如:
(1)查询学生总人数:SELECT COUNT (*)FROM student;
(2)查询选修了课程的学生人数:SELECT COUNT(DISTINCT Sno)
FROM SC;

◎连接查询

◎若查询同时涉及两个以上的表,则称为连接查询。例如:
(1)查询每个学生及其选修课程的情况。
SELECT Student.*,SC.*FROM Student,SC WHERE Student.Sno= SC.Sno;

(2)查询每一课程的间接选修课。
SELECT F.Cno,S.Cpno FROM Course F,Gourse S WHERE F.Cpno = S.Cno;
其中的F和S称为cour se的别名。

(3)查询每个学生的学号、姓名、选修的课程名称及成绩。
SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Gourse
WHERE Student.Sno SC.Sno And SC.Cno=Cour se.Cho;

◎嵌套查寻

◎(1)查询与"刘晨”在同一系学习的学生。
SELECT Sno,Sname FROM Student WHERE Sdept IN(SELECT Sdept FROM Student WHERE Sname=‘刘晨’);

(2)查询选修了课程名为信息系统(MIS)的学生学号和姓名。
SELECT Sno,Sname FROM Student WHERE Sno IN
(Select Sno FROM SC WHERE Cno IN (SEL ECT Cno FROM Course WHERE Cname=‘MIS’));

(3)查询其他系中比信息系某-个学生年龄小的学生姓名和年龄。
SELECT Sname,SageFROM Student WHERE Sage <(SEL ECT Max(Sage)FROM Student WHERE Sdept=‘IS’)
AND Sdept <>‘IS’;

◎带Exists谓词的查询

◎查询没有选修1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE Not Exists
(SELECT*
FROM SC
WHERE Sno= Student Sno And Cno='1);

◎带Exists谓词的子查询不返回任何数据,只产生逻辑真值或逻辑假值。

◎视图查询

◎因为视图没有真实数据,所以,对视图的查询要转换为对相应表的查询,这个这程叫视图消解,视图消解过程由DBMS自动完成。

例如,在信息系学生的视图中找出年龄小于20岁的学生:
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
以上语句等价于:
SELECT Sno,Sage
FROM Student
WHERE Sage<20 And Sdept="IS’;

数据更新

插入、删除数据

◎插入单个元组的命令格式为:
INSERT INTO <表名>[(<属性列1>[<属性列2>…])
VALUES(<常量1>[<常量2>]…)

例如,将一个新学生记录(95020,陈冬,男,IS,18)插入到Student表中。
INSERT INTO Student VALUES(95020,‘陈冬,男’,‘IS’,18);

◎删除表中数据的命令格式为:
DEL ETE FROM <表名>
WHERE <条件>]
例如,删除学号为95019的学生记录为:DELETE FROM Student WHERE Sno=‘95019’;

修改数据

◎修改数据的命令格式为:
UPDATE <表名>
SET <列名1>=<表达式1>[<列名2>=<表达式.>…
WHERE <条件>]

例如,将学生95001的年龄改为22岁。
UPDATE Student
SET Sage=22
WHERE Sno= 95001;

更新视图

◎更新视图就是对相应表的更新。
例如,将信息系学生视图IS_Student中学 号为95002的学生姓名改为刘辰:
UPDATE IS Student SET Sname=刘辰
WHERE Sno= 95002;
以上语句等价于:
UPDATE Student
SET Sname=‘刘辰’
WHERE Sno= ‘95002’ And Sdept=‘IS’;

数据控制

授权

◎授权的命令格式如下:GRANT <权限>[<权限>]…
[ON <对象类型><对象名>]
TO <用户>,<用户>]…[With Grant Option]

例如,把对Student表和Course表 的全部操作权授子用户U2和U3:
GRANT All Privileges ON Table Student,Course TOU2,U3;
又如,把对表SC的Insert权限授予U5用户,并允许U5将此权限再授予其他用户:
GRANT Insert ON Table SC TO U5 With Grant Option;

◎收回权限

◎收回授权的命令格式如下:
REVOKE <权限>[<权限]…
[ON <对象类型><对象名>]
FROM <用户>[<用户>]…

例如,把用户U4修改学生学号的权限收回:
REVOKE Update(Sno),Select
ON Table Student
FROM U4;

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值