580 likes | 742 Views
SQL 基础. 西å—è´¢ç»å¤§å¦ç»æµŽä¿¡æ¯å·¥ç¨‹å¦é™¢. 西å—è´¢ç»å¤§å¦æ•°æ®åº“技术课程组 2011.02. 课程å¤ä¹ . æ•°æ®åº“基础 E-R 图, E-R è½¬æ¢æˆå…³ç³» 创建表,输入表的记录 软件: SQL DEVELOPER 表的基本结构(列åï¼Œåˆ—å®½ï¼Œå°æ•°ä½æ•°ï¼‰ è¡¨çš„çº¦æŸ å®žä½“å®Œæ•´æ€§çº¦æŸï¼ˆ PRIMARY KEY ) å‚照完整性约æŸï¼ˆ FOREIGN KEY) ON DELETE CASCADE ON DELETE RESTRICT ON DELETE SET NULL 域完整性 是å¦ä¸ºç©º 默认值 CHECK 约æŸ. 主表. 课程å¤ä¹ . 主键.
E N D
SQL基础 西南财经大学经济信息工程学院 西南财经大学数据库技术课程组 2011.02
课程复习 • 数据库基础 • E-R图,E-R转换成关系 • 创建表,输入表的记录 • 软件:SQL DEVELOPER • 表的基本结构(列名,列宽,小数位数) • 表的约束 • 实体完整性约束(PRIMARY KEY) • 参照完整性约束(FOREIGN KEY) • ON DELETE CASCADE • ON DELETE RESTRICT • ON DELETE SET NULL • 域完整性 • 是否为空 • 默认值 • CHECK约束
主表 课程复习 主键 • ON DELETE CASCADE • ON DELETE RESTRICT • ON DELETE SET NULL 外键 子表
上次课外作业 • 创建下列3个表 • C表(cno,cname,ccredit) • Cno是主键 • S表(sno,sname,ssex,sage) • Sno是主键 SC表(sno,cno,grade) • Sno和S中的sno结构一致; cno和c中的cno结构一致 • Sno+cno是主键 • Sno是外码,参照s的主键 • Cno是外码,参照C的主键 • 注意:没有完成的同学请补充完成 • 软件下:http://liming.cai.swufe.edu.cn/sjkjs
SQL基础 • SQL概述 • SELECT查询 • 投影查询 • 条件查询 • 统计查询 • 分组查询 • 排序查询 • 连接查询 • 数据定义 • 创建表 • 修改表 • 删除表 • 数据操纵功能 • 插入记录 • 删除记录 • 修改记录 • 实验练习 • 课外练习
系统注册的基本流程 • 用户填写登陆信息:用户号,姓名,密码(用户号必须唯一) • 000002 刘翔 000002 • 查询staff表中有无相同的用户号 • Select * from staff where staff_id='000002' ; • 如果有,提示错误。 • 如果没有,添加数据到表中。 • insert into staff values('000002','刘翔','000002');
SQL 概述 • SQL是一种公共的关系型数据库数据查询和数据操纵语言 • 可以由人向数据库管理系统发出SQL语言命令 • 也可以由程序向数据库管理系统发出SQL语言命令 • SQL是一种脚本语言 • SQL语言语法非常严格,但又比较接近自然语言(英文)的表述方式
关系数据库标准语言SQL • SQL的数据查询功能 • SQL的数据定义功能 • SQL的数据操纵功能。
SQL的数据查询功能 • 数据查询SELECT是数据库的核心操作。
投影查询 • 投影查询是指从表中查询全部列或部分列。 • 1.查询部分字段 • SELECT之后列出需要查询的字段名,字段名之间以英文逗号“,”分隔。 • 【例1】从表gcustomer中查询customer_id,。 • select customer_id,cust_name from gcustomer
SQL DEVELOPER中输入和执行SQL 1 4 2 3
投影查询 • 2.查询全部字段 • “*”来表示表中所有字段。 • 【例2】查询表gcustomer的全部数据。 • SELECT * FROM gcustomer
投影查询 • 3.取消重复记录 • 在SELECT语句中,可以使用DISTINCT来取消查询结果中重复的记录。 • 【例3】查询表Account中有开户记录的客户代码。 • SELECT DISTINCT customer_id FROM gaccount • 理解:重复
投影查询 • 4.修改 查询的列名 • 在SELECT语句中,可以修改查询的列名。 • 【例4】查询客户信息。 • select customer_id as 客户号,cust_name as 客户姓名 from gcustomer • 说明:AS可以省略。
条件查询 若要在数据表中找出满足某些条件的行时,则需使用WHERE来指定查询条件。
条件查询 • 1.比较大小 • 【例5】从表gcustomer中查询”成都“的客户信息 • select * from gcustomer where cust_city='成都' • 【例6】从表Account中查询2010年的开户记录 • select * from gaccountwhere extract(year from build_date) =2010
条件查询 • 2.多重条件查询 • 符AND和OR将其连接成复合逻辑表达式,AND的运算优先级高于OR。用户可使用括号改变优先级。 • 【例7】从表gcustomer中查询”成都”的“教师”的信息 • select * from gcustomer where cust_city='成都' and cust_job='教师' • 【例8】从表Account中查询Banlance大于100000或小于20000的帐户信息 • select * from gaccountwhere balance<20000 or balance>1000 • 理解:AND 和OR
条件查询 • 3.确定范围 • 确定范围的是: • BETWEEN 下界表达式AND 上界表达式 • 其含义是“在下界表达式和上界表达式之间,且包含上界表达式的值和下界表达式的值”。 • 【例9】从表account中查询balance在10000元到10000元记录。 • select * from gaccount where balance between 20000 and 100000 • 等价于下列SELECT语句: • select * from gaccount where balance>=20000 and balance<= 100000
条件查询 • 4.确定集合 • 利用IN操作可以查询字段值属于指定集合的记录, • 【例10】从表gcustomer中查询cust_job是‘教师’‘工人’‘工程师’的记录。 • select * from gcustomer where cust_job in ('教师','工程师','工人')
条件查询 • 5.部分匹配查询 • LIKE定义的一般格式为:<字段名> LIKE <字符串常量> • %:表示任意长度的字符串。 • _:表示任意一个字符。 • 【例11】从表gcustomer查询cust_job中有’师’的记录 • select * from gcustomer where cust_job like '%师%'
条件查询 • 6.涉及空值查询 • 在SELECT语句中,使用IS NULL和IS NOT NULL来查询某个字段的值是否为空值。这里,IS不能用用等号“=”代替。 • 【例12】从表gcustomer中查询Cust_phone不为空的记录。 • select * from gcustomer where cust_phone is not null
统计查询 • 【例13】计算表Account中所有帐户的最高Balance、最低balance • select max(balance) 最高余额 ,min(balance) 最低余额 from gaccount • 【例14】计算表gcustomer 成都的客户数。 • select count(*) from gcustomer where cust_city='成都' • 【例15】统计Account中有开户记录的客户数。 • selectcount(distinct customer_id) from g account • 思考:这里的DISTINCT为什么不能省略?
分组查询 • 1.分组查询 • 关键:识别分类字段,识别汇总字段,选定汇总函数 • GROUP BY类似于EXCEL中的分类汇总功能。 • 【例16】从Account中查询每个客户的帐户数。 • select customer_id,count(*) as 开户数 from gaccountgroup by customer_id
分组查询 • 【例17】从account中查询每个客户的帐户余额合计。 • select customer_id,sum(balance) as 余额合计 from gaccountgroup by customer_id
查询的排序 • 当用户需要对查询结果排序时,可用ORDER BY对查询结果按一个或多个查询列的升序(ASC)或降序(DESC)排列,默认值为ASC。ORDER BY之后可以是查询列,也可以是查询列的序号。 • 1.单列排序 • 使用ORDER BY可对查询结果按一个查询列进行排序。 • 【例18】gaccount表中查询账户信息,并按照customer_id降序排序。 • select * from gaccountorder by customer_id desc
查询的排序 • 【例19】从account中查询每个customer_id的余额合计,并按照余额合计降序排序。 • select customer_id,sum(balance) as 余额合计 from gaccount group by customer_id order by 余额合计 desc • 说明:这里“ORDER BY 余额合计”可以用“ORDER BY 2”代替(2表示查询列的列序号),也可以用“用ORDER BY sum(balance)”代替。
查询的排序 • 2.多列排序 • ORDER BY 列名1 [ASC|DESC][,列名2 [ASC|DESC]…] • 多列排序的含义是:将查询结果首先按<列名1>排序,在<列名1>的值相同的情况下,按<列名2>排序。 • 【例20】从表gcustomer查询结果按cust_city升序排序,cust_city相同的按照cust_job降序排序。 • select *from gcustomer order by cust_city,cust_job desc
SQL书面作业1 • 创建下列3个表 • C表(cno,cname,ccredit) • S表(sno,sname,ssex,sage) • SC表(sno,cno,grade) • 使用SQL语句实现下列查询 • 在S表中查询学生所有的信息 • 在C表中查询学分在2-4范围内的课程的基本信息 • 查询C表中课程名包含“数据”的课程的编号和名称(提示:使用like) • 在SC中查询被学生选修的CNO(提示:DISTINCT) • 查询编号为“C01”、”C02”、”C03”、”C04”、“C05”,并且学分大于3的课程的基本信息 • 在SC表中查询所有的信息,并按照SNO升序排序,SNO相同的,按照GRADE降序排序 • 在SC表中查询成绩不及格的所有学生的学号、课程 • 在SC中查询“001”课程的课程的平均成绩 • 在SC中查询每门课程的平均成绩(提示:分组查询) • 在SC表中查询成绩为空的记录(IS NULL) • 注意:下周上机之前交
连接查询 • 连接查询是多个表中满足连接条件的记录才出现在结果表中的查询。在Oracle中,实现两个表的连接查询的格式有两种: • ①SELECT 查询列FROM 表1,表2 WHERE 连接条件AND 查询条件 • ②SELECT 查询列FROM 表1 [INNER] JOIN 表2 ON 连接条件WHERE 查询条件 • 说明:INNER可以省略。 • 常用的连接条件是:表1.公共字段=表2.公共字段。
连接查询的执行过程 • DBMS在执行连接查询的过程是:首先在表1中找到第1个记录,然后从表头开始扫描表2,逐一查找满足条件的记录,找到后,就将该记录和表1中的第1个记录进行拼接,形成查询结果中的一个记录;表2中的记录全部查找以后,再找表1中的第2个记录,然后再从头开始扫描表2,逐一查找满足连接条件的记录,找到后,将该记录和表1中的第2个记录进行拼接,形成查询结果中的一个记录。重复上述操作,直到表1中的记录全部处理完毕。
连接查询 • 【例21】从表gcustomer和account中,查询cust_name,account_no,balance 。 • select cust_name,account_no,balance from gcustomer,gaccount where gcustomer.customer_id=gaccount.customer_id • 上述语句也可以写成下面2个语句 • select cust_name,account_no,balance from gcustomer inner join gaccount on gcustomer.customer_id=gaccount.customer_id • select cust_name ,account_no ,balance from gcustomer c ,gaccount a where c.customer_id=a.customer_id • 说明:这里C和A分别是gcustomer和account的别名 • 注意:在连接查询的时候,对于两个表都有的同名字段,必须用别名加以限制(无别名,就用表名)
连接查询 • 【例22】从表gcustomer和account中,查询成都地区的客户的cust_name,account_no,balance 。 • select cust_name,account_no,balance from gcustomer,gaccount where gcustomer.customer_id=gaccount.customer_id and cust_city='成都‘ • select cust_name,account_no,balance from gcustomer inner join gaccounton gcustomer.customer_id=gaccount.customer_id where cust_city='成都';
SQL的数据定义功能 • 关系数据库系统支持三级模式结构,其模式、外模式和内模式中的基本对象有表、视图和索引。因此SQL的数据定义功能包括定义表、定义视图和定义索引
创建表 • 1.创建表的基本的命令 • 在SQL语言中,使用CREATE TABLE命令创建数据表。 • 【命令】CREATE TABLE <表名> (<字段名1> <类型>[(宽度 [,小数点位数])] ; • [,<字段名2> <类型>[(宽度 [,小数点位数] )]) • 【功能】创建一个以<表名>为表的名字、以指定的字段属性定义的数据表。 • 【说明】定义表的各个属性时,需要指明其数据类型及长度。常用数据类型说明见表
创建表 • 【例23】创建新表gcustomerbk ,其结构和表gcustomer相同。 • CREATE TABLE gcustomerbk ( customer_id CHAR(18) , cust_name varCHAR2(20), cust_city varchar2(30) , cust_phone varCHAR2(13), cust_gender CHAR(1) , cust_job varCHAR2(30)); • 执行CREATE TABLE语句后,新建表成为当前打开的表。
创建表 • 2.创建表的同时定义完整性规则 • 对于数据库表,在创建表的时候,可通过以下命令格式对表的完整性规则进行定义。 • 【命令】CREATE TABLE <表名>(<字段名1> <类型>[(宽度 [,小数点位数])] ; [CONSTRAINT 约束名 NOT NULL] [CONSTRAINT 约束名 PRIMARY KEY] [DEFAULT 表达式1] [CONSTRAINT 约束名 CHECK 逻辑表达式1] • 【功能】创建一个表。 • NOT NULL定义字段不能为空 • PRIMARY KEY定义表的主索引。 • DEFAULT定义字段的默认值。 • CHECK定义字段的有效性规则。 • 说明:DEFAULT定义的默认值的类型应和字段的类型相同。CHECK定义的有效性规则必须是一个逻辑表达式。
创建表 • 【例24】创建新表gcustomerbk ,其结构和表gcustomer相同。同时定义约束条件: customer_id为主键、 cust_name 为非空、 cust_gender默认值为‘M’,其取值范围是’F’或’M’ • CREATE TABLE gcustomerbk ( customer_id CHAR(18) CONSTRAINT custbk_pk PRIMARY KEY, cust_name varCHAR2(20) CONSTRAINT cust_name_nnull NOT NULL, cust_city varchar2(30) , cust_phone varCHAR2(13), cust_gender CHAR(1) DEFAULT 'M' CONSTRAINT cust_gender_mf CHECK (cust_gender='M' or cust_gender='F'), cust_job varCHAR2(30));
创建表 • 在插入或修改记录时,如果违反约束条件,系统会提示错误信息: • 第 * 行出现错误: ORA-02290: 违反检查约束条件 (约束名)
修改表的结构 • 在SQL语言中,使用ALTER TABLE命令修改表的结构,包括增加字段、删除字段、修改字段。对于数据库表,可以使用ALTER TABLE命令增加数据完整性规则、删除数据完整性规则和修改数据完整性规则。
修改表的结构 • 1.增加字段 • 【增加一个列命令】 ALTER TABLE <表名> ADD <字段名1> <类型>[(宽度 [,小数点位数])] • 【增加多个列命令】 ALTER TABLE<表名> ADD ( <字段名1> <类型>[(宽度 [,小数点位数])], <字段名1> <类型>[(宽度 [,小数点位数])]……) • 【功能】在表中增加新字段,并定义字段的属性。 • 【例25】在gcustomer表中增加客户生日cust_birth字段,类型是Date • ALTER TABLE gcustomerbk ADD cust_birth Date; • 【例26】在gcustomer表中增加客户生日cust_birth字段,类型是Date,客户家庭地址cust_address,类型是varCHAR2(30) • ALTER TABLE gcustomerbk ADD ( cust_birth Date,cust_adress varCHAR2(30));
修改表的结构 • 2.修改字段 • 【修改一个列命令】 ALTER TABLE <表名> modify <字段名1> <类型>[(宽度 [,小数点位数])] • 【修改多个列命令】 ALTER TABLE<表名> modify ( <字段名1> <类型>[(宽度 [,小数点位数])], <字段名1> <类型>[(宽度 [,小数点位数])]……) • 【功能】修改表中字段的属性。 • 【例27】将gcustomer表中cust_address字段类型修改为varCHAR2(40) • ALTER TABLE gcustomerbk modify cust_adress varCHAR2(40);
修改表的结构 • 3.删除字段 • 【删除改一个列命令】 ALTER TABLE <表名> drop column <字段名> • 【删除多个列命令】 ALTER TABLE <表名> drop ( <字段名1>, <字段名2>) • 【功能】删除表中指定的字段 • 【注意】删除表中一个字段有Column关键字,删除多个字段没有 • 【例28】删除表gcustomerbk中cust_birth和cust_adress字段。 • ALTER TABLE gcustomerbk drop (cust_bith,cust_adress) ;
修改表的结构 • 4.定义或修改数据完整性 • ALTER TABLE语句操作数据库表的数据完整性的命令格式主要有两 • 如果增加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必须使用ALTER TABLE语句的ADD子句; • ALTER TABLE 表名 ADD [CONSTRAINT 约束名]约束类型 约束定义 • 如果增加NOT NULL约束,那么必须使用ALTER TABLE语句的MODIFY子句, • ALTER TABLE 表名 MODIFY 列名 CONSTRAINT 约束名NOT NULL; • 【功能】在表中定义或修改字段的约束条件。
修改表的结构 • 【例29】在gcustomerbk中增加约束条件,设置cust_phone为非空 • ALTER TABLE gcustomer MODIFY cust_phone CONSTRAINT cust_phone_nnull NOT NULL; • 【例30】在gcustomerbk中增加约束条件,设置cust_phone的长度大于6位 • ALTER TABLE gcustomer ADD CONSTRAINT cust_phone_const CHECK (length(cust_phone) >= 6);
删除表 • 在SQL语言中,删除表的命令是DROP TABLE。 • 【命令】DROP TABLE 表名 • 【功能】删除表。 • 【例31】从磁盘上删除表gcustomerbk。 • DROP TABLE gcustomerbk
SQL的数据操纵功能 • SQL语言的数据操纵也称为数据更新,主要包括插入数据、修改数据和删除数据3种语句。 • 数据操纵涉及另外两个命令: • ROLLBACK:回退命令,取消刚才执行的SQL语句 • COMMIT:提交命令,
SQL的数据操纵功能 • SQL语言的数据操纵也称为数据更新,主要包括插入数据、修改数据和删除数据3种语句。 • 插入记录 • 插入数据是把新的记录插入到一个存在的表中。插入数据使用语句INSERT INTO。 • 【命令】INSERT INTO <表名>[(<字段名1>[,<字段名2>…])] VALUES(<值1>[,<值2>…])