select嵌套/子查询,AS用法

1.嵌套查询(子查询)

嵌套查询:一个内层查询语句(select-from-where)块可以嵌套在另外一个外层查询块的where子句中,其中外层查询也称为父查询,主查询。内层查询也称子查询,从查询。子查询一般不使用order by子句,只能对最终查询结果进行排序。

另一种定义:在一个SELECT 语句的WHERE 子句或HAVING 子句中嵌套另一个SELECT 语句的查询称为嵌套查询,又称子查询。


嵌套查询的工作方式是:先处理内查询,由内向外处理,外层查询利用内层查询的结果嵌套查询不仅仅可以用于父查询select语句使用。还可以用于insert、update、delete语句或其他子查询中。


一、子查询的组成
1、包含标准选择列表组件的标准select查询。

2、包含一个或多个表或者视图名称的标准from子句。
3、可选的where子句。
4、可选的group by子句。
5、可选的having子句

二、子查询的语法规则

1、子查询的select查询总是使用圆括号括起来。
2、不能包括compute或for.browse子句。
3、如果同时指定top子句,则可能只包括order by子句。
4、子查询最多可以嵌套到32层。个别查询可能会不支持32层嵌套。
5、任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。
6、如果某个表只出现在子查询中二不出现在外部查询中,那么该表的列就无法包含在输出中。


三、返回一个值的子查询
当子查询的返回值只有一个时,可以使用比较运算符如=、<、>、>=、<=、!=等将富查询和子查询连接起来。实例如下:

3.1 简单子查询

select name,age 
from person 
where age > ( select age  from person  where name = '张三')

3.2 like嵌套查询
查询姓“张”的老师的个数

select count(distinct(Tname)) 
  from Teacher
  where Tname like '张%';

四、返回一组值的子查询
如果子查询的返回值不止一个,而是一个集合时,则不能直接使用比较运算符,可以在比较运算符和子查询之间插入ANY、SOME或ALL。其中等值关系可以用IN操作符。

4.1 in嵌套查询

in关键字用于where子句中用来判断查询的表达式是否在多个值的列表中。返回满足in列表中的满足条件的记录。

select name 
from person 
where countryid in ( select countryid 
                     from country
                     where countryname = '中国');

4.2 some嵌套查询

some在sql中的逻辑运算符号,如果在一系列比较中,有些值为True,那么结果就为True。some的语法是:


  <表达式>{ =|<>|!=|>|>=|!>|<|<=|!<}some(子查询)  

用等号和以下查询到的值比较,如果与其中一个相等,就返回

select name from person 
where countryid = some ( select countryid from country   
                         where countryname = '中国');



4.3 all嵌套查询

all是sql中的逻辑运算符好,如果一系列的比较都为true,那么结果才能为true。


 <表达式> { =|<>|!=|>|>=|!>|<|<=|!<} all(子查询)
当countryid大于以下返回的所有id,此结果才为True,此结果才返回

select name from person 
where countryid > all ( select countryid from country  
                         where countryname = '中国');




4.4 exists嵌套查询

exists是sql中的逻辑运算符号。如果子查询有结果集返回,那么就为True。exists代表“存在”的意义,它只查找满足条件的那些记录。一旦找到第一个匹配的记录后,就马上停止查找。
  exists 子查询        
   其中子查询是一个首先的select语句,不允许有compute子句和into关键字。
   exists 的意思是,子查询是否有结果集返回。


SELECT * FROM Person
WHERE exists ( SELECT 1);

--SELECT 0 SELECT NULL 返回结果都一样,因为这三个子查询都有结果集返回,因此总是True,SELECT * FROM Person照常执行
   
但是如果子查询中因为加了条件而没有结果集返回,则主语句就不执行了:

SELECT * FROM Person
WHERE exists ( SELECT * FROM Person 
               WHERE Person_Id = 100);   --如果不存在Person_Id的记录,则子查询没有结果集返回,主语句不执行


五、返回新数据表的子查询


5.1 查询“001”课程比“002”课程成绩高的所有学生的学号;

Select a.Sno from (select Sno,score from SC where Sno='001') a,
(select Sno,scorefrom SC where Cno='002') b
Where a.score>b.score and a.Sno=b.Sno;

 

2.AS使用

(1)查询服务Top10,   没有"as A"时报错!!!!     

SELECT A.SERVICE
FROM (SELECT SERVICE_NAME AS SERVICE, COUNT(CODE) CODE_COUNT
   FROM log_detail
   GROUP BY SERVICE_NAME
   ORDER BY CODE DESC LIMIT 0,10) as A
#正确写法

 

 (2)不能把别名当作字段

SELECT userName AS a,  userAddress AS b FROM TestTableWHEREalike'%am%' 

该语句执行是会报错,因为别名只是对字段的一种引用,不能当作字段一样使用,如果真要把别名当字段一样使用,可以如下变通:

   SELECT a, b FROM(

      SELECT userName AS a,  userAddress AS b FROM TestTable

   ) AS tempTable WHERE a like '%dd%' 

该处要给内嵌的select查询指定一个别名,否则会报错

(3)as可以作为连接语句的操作符

先获取到tablename表中的所有记录,之后创建一张tablename表,结构和tablename2表相同,记录为后面语句的查询结果。

create table tablename as select * from tablename2
  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1 SQL基础 1.1 基本概念 结构化查询语言(Structured Query Language)简称SQL,是一种关系数据库查询语言,用于存取数据以及查询、更新和管理关系数据库系统。 1.2 语句结构 1.2.1 数据查询语言(DQL) 对数据库进行的信息查询,select。 1.2.2 数据操作语言(DML) 用于操作关系型数据库对象内部的数据,insert、update、delete。 1.2.3 数据定义语言(DDL) 用来建立及定义数据表、字段以及索引等数据库结构,create、alter、drop 。 1.2.4 数据控制语言(DCL) 用于控制对数据库里数据的访问,通常用于创建与用户访问相关的对象以及控制用户的权限,grant、revoke(撤销)。 1.2.5 事务控制命令(TPL) 用于管理数据库事务,commit、rollback、savepoint(在一组事务里创建标记点以用于回退)。 1.3 表的构成 1.3.1 字段 字段是表里的一列,用于保持每条记录的特定信息 1.3.2 记录 记录,也被成为一行数据,是表里的每一行 1.4 完整性的约束条件 1.4.1 实体完整性 关系模型的实体完整性在create table用primary key约束实现,primary key约束用于定义主键,它保证主键的唯一性和非空性。 1.4.2 参照完整性 关系模型的参照完整性可以通过在create table用foreign key (<外键>) references <被参照表名> (<与外键对应的主键名>)进行约束定义。 1.4.3 用户定义完整心 在create table语句可以根据应用要求,定义属性以及元组上的约束。 常见的用户定义的完整性约束有: not null或null约束。 unique约束:唯一性约束。 default约束:默认值约束。 check约束:检查约束,check约束通过约束条件表达式设置列值应该满足的条件。 1.5 范式 1.5.1 第一范式 1.5.1.1 规范 无重复的列,确保每列保持原子性,即数据库表的所有字段值都是不可分解的原子值。 1.5.1.2 举例 姓名 年龄 联系电话 地址 省 市 详细地址 1.5.2 第二范式 1.5.2.1 规范 属性完全依赖于主键,确保表每列都与主键相关。 1.5.2.2 举例 订单表 订单Id 商品Id 总金额 商品名称 001 1 10 苹果 001 2 10 橘子 联合主键订单Id、商品Id => 商品表 商品Id 商品名称 单价 订单表 订单Id 总金额 1.5.3 第三范式 1.5.3.1 规范 属性不依赖于其它非主属性,确保数据表的每一列数据都和主键直接相关,而不能间接相关,即要求一个数据库表不包含已在其它表已包含的非主关键字信息。 1.5.3.2 举例 党员表 党员Id 党员姓名 组织Code 符合3NF 党员表 党员Id 党员姓名 组织名称 不符合3NF 组织表 组织Code 组织名称 1.6 外连接 1.6.1 准备 create table student_A( uuid varchar2(32), name varchar2(100)); create table student_B( uuid varchar2(32), name varchar2(100)); insert into student_A values('1','小黄'); insert into student_A values('2','小黑'); insert into student_A values('3','小红'); insert into student_B values('1','大黄'); insert into student_B values('2','大黑'); insert into student_B values('4','大红'); insert into student_B values('4','大紫'); 1.6.2 左连接(left join) 1.6.2.1 说明 查询指定的左表的所有行,而不仅仅是联接列所匹配的行;如果左表的某行在右表没有匹配行,则在相关联的结果集行右表的所有选择列表列均为空值。 1.6.2.2 语法 select A.*,B.* from student_A A left join student_B B on A.Uuid = B.Uuid; 1.6.2.3 结果 1.6.2.4 (+)表示 select A.*,B.* from student_A A,student_B B where A.Uuid = B.Uuid(+) 1.6.3 右连接(right join) 1.6.3.1 说明 查询指定的右表的所有行,而不仅仅是联接列所匹配的行;如果右表的某行在左表没有匹配行,则在相关联的结果集行左表的所有选择列表列均为空值。 1.6.3.2 语法 select A.*,B.* from student_A A right join student_B B on A.Uuid = B.Uuid; 1.6.3.3 结果 1.6.3.4 (+)表示 select A.*,B.* from student_A A,student_B B where A.Uuid(+) = B.Uuid 1.6.4 全外连接(full outer join) 1.6.4.1 说明 完整外部联接返回左表和右表的所有行;当某行在另一个没有匹配行时,则另一个表的选择列表列包含空值;如果表之间有匹配行,则整个结果集行包含基表的数据值。 1.6.4.2 语法 select A.*, B.* from student_A A full outer join student_B B on A.Uuid = B.Uuid; 1.6.4.3 结果 1.6.4.4 全外连接不支持(+)写法 1.6.5 (+) + 表示补充,即哪个表有加号,这个表就是匹配表。 1.7 运算符 1.7.1 比较 =、>,<,>=,<=,!=,<>, 1.7.2 确定范围 between and 、not between and 1.7.3 确定集合 in、not in 1.7.4 字符匹配 like(“%”匹配任何长度,“_”匹配一个字符) 1.7.5 转义字符 1.7.5.1 常规转义字符 “\”转义字符,“\%”则表示单纯的字符“%” 1.7.5.2 escape escape关键字经常用于使某些特殊字符,如通配符:'%','_'转义为它们原来的字符的意义,被定义的转义字符通常使用'\',但是也可以使用其他的符号。 select * from Student_a where name like '%$%%' escape '$'; 1.7.6 空值 is null、is not null 1.7.7 集合查询 union(并)、intersect(交)、minus(差) 1.7.8 多重条件 and、or、not 1.7.9 对查询结果分组 <group by 列名> 1.7.10 分组筛选条件 [having <条件表达式>] 1.7.11 字符串拼接 select 'A' || 'B' from dual; // || 拼接 1.8 函数 1.8.1 聚集函数 count、sum、avg、max、min 1.8.2 case when 1.8.2.1 语法 select t.uuid, t.score, case when t.score > 90 then '优秀' when t.score > 60 then '及格' else '不及格' end from exam_user_exam t 1.8.3 decode 1.8.3.1 语法 select decode(x,1,'x is 1', 2 , 'x is 2','others') from dual 1.8.3.2 说明 当x等于1时,则返回‘x is 1’,当x等于2时,则返回‘x is 2’,否则,返回‘others’。 1.8.4 nulls first(nulls last)排序 1.8.4.1 语法 select * from dy_info t order by t.degree nulls first 1.8.4.2 说明 控制null显示行位置 1.8.5 Nvl 1.8.5.1 语法 select nvl(t.sap,'空') from dy_info t; 1.8.5.2 说明 如果sap号为空,则返回‘空’,否则返回sap号。 1.8.6 递归查询 1.8.6.1 语法 select t.* from g_organ t start with t.organcode = '080' connect by prior t.parentcode = t.organcode; //递归查询父节点 select t.* from g_organ t start with t.organcode = '080' connect by t.parentcode = prior t.organcode; //递归查询子节点 1.8.7 union 和 union all 1.8.7.1 语法 select * from dual union all select * from dual 1.8.7.2 说明 union 会对查询数据进行去重并排序,union all只是简单的将两个结果合并。 1.8.8 wm_concat 1.8.8.1 语法 select wm_concat(t.role_name) from g_role t where t.role_name like '%书记%' 1.8.8.2 说明 拼接字符串,结果为:‘党工委副书记,总支副书记,党支部书记,党委书记,党委副书记,党总支书记,党工委书记,党总支副书记,党支部副书记’ 1.8.9 相似度 1.8.9.1 语法 select utl_match.edit_distance_similarity('aaaaa','bbaaaa') from dual; 1.8.10 去格式 1.8.10.1 oracle正则表达式:去除<></>格式 select REGEXP_REPLACE(title,'<[^>]*>','') title from exam_question 1.8.11 rank() over (partition by …) 1.8.11.1 语法 select organcode,score,ranknum from ( select t.organcode, t.score, rank() over (partition by t.organcode order by t.score desc) ranknum from exam_user_exam t) where ranknum < 4 1.8.11.2 说明 获取每个组织,考试成绩前三名。 1.9 存储过程 1.9.1 定义 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.9.2 准备 create table t_user ( username varchar2(20), password varchar2(20) ); create table t_user_temp ( username varchar2(20), password varchar2(20) ); insert into t_user(username,password) values('小王','1111'); insert into t_user(username,password) values('小李','1111'); 1.9.3 创建存储过程 create or replace procedure adduser as begin insert into t_user_temp(username,password) select username,password from t_user t where t.username = '小李'; end adduser; 1.9.4 执行 begin adduser; end; 1.9.5 验证 select * from t_user; select * from t_user_temp 2 SQL深入 2.1 常用 2.1.1 表空间 2.1.1.1 创建表空间 create tablespace TS_DJY datafile 'd:/software/oracle/tablespace/ts_djy.dat' size 1024M autoextend on next 100M maxsize 2048M; 2.1.1.2 指定用户表空间 alter user cssdj default tablespace TS_DJY; 2.1.1.3 指定表的表空间 create table t_student( uuid varchar2(32) )tablespace TS_DJY; 2.1.2 自增sequence 2.1.2.1 创建 create sequence seq_student_uuid minvalue 1 maxvalue 999999999999999 start with 1 increment by 1 nocache; 2.1.2.2 使用 select seq_student_uuid.nextval from dual; //获取下一个 select seq_student_uuid.currval from dual; //获取当前 2.1.3 批量插入 2.1.3.1 查询结果批量插入 insert into tablea(cola,colb) select cola,colb from tableb; 2.1.3.2 创建相同的表结构并插入数据(备份表数据) create tab_new as select * from tab_old; 2.1.3.3 创建相同的表结构不插入数据 create tab_new as select * from tab_old where rownum=0; 2.1.4 伪列伪表 2.1.4.1 伪列 伪列不是表的真实列,但是你可以象使用真实列一样使用伪列,常用伪列:rowid行的绝对物理编号,每一行是唯一的。rownum序号,返回查询结果的每行序号。系统时间sysdate,返回系统当前时间。 2.1.4.2 伪表 select * from dual; 2.1.5 系统表 2.1.5.1 user_tables 当前用户表信息 2.1.5.2 user_tab_columns 当前用户表所有列信息,搜索列所在的表: select * from user_tab_columns t where t.column_name like '%ORGANCODE%'; 2.1.5.3 user_tablespaces 当前用户表空间 2.1.5.4 dba_users 数据库所有用户 2.1.5.5 dba_tables 数据库所有表 2.1.5.6 dba_tablespaces 数据库所有表空间 2.1.6 锁表解锁 2.1.6.1 查看锁表信息 select l.OBJECT_ID,s.SID,s.SERIAL#,s.USERNAME, s.MACHINE from V$locked_Object l,V$session s where l.SESSION_ID = s.SID; 2.1.6.2 解锁 alter system kill session 'sid,serial#'; 2.1.7 备份与恢复 2.1.7.1 导出 导出用户: exp cssdj/cssdj@zr owner=(cssdj,cssdj_zsy) file=d:/cssdj.dmp log=d:/cssdj.log 导出用户表: exp cssdj/cssdj@zr tables=(g_dict,g_dict_item) file=d:/cssdj.dmp log=d:/cssdl.log 2.1.7.2 导入 imp cssdj/cssdj@zr fromuser=cssdj_zsy touser=cssdj file=d:/cssdj.cmp log=d:/cssdj.log 2.1.7.3 数据泵 2.1.8 Dblink 2.1.8.1 创建 create database link orcllink connect to cssdj identified by cssdj using '(DESCRIPTION = (ADDRESS_LIST= (ADDRESS=(PROTOCOL = TCP)(HOST = 219.239.110.65)(PORT = 1521))) (CONNECT_DATA=(SID = orcl)))'; 2.1.8.2 删除 drop database link orcllink; 2.1.8.3 使用 select * from dy_info@orcllink; 2.2 Oracle与Mysql差异 2.2.1 Group by 2.2.1.1 Oracle select后面出现的列,如果没有使用集合函数,必须出现在group by select sno,sname,sum(grade) from student group by sno,sname; //合法写法 select sno,sname,sum(grade) from student group by sno; //非法写法 select sno,min(sname),sum(grade) from student group by sno; //建议用这种写法,效率高些 2.2.1.2 Mysql select sno,sname,sum(grade) from student group by sno,sname; //合法写法 select sno,sname,sum(grade) from student group by sno; //合法写法 2.2.2 分页 2.2.2.1 Oracle 使用rownum来表明分页位置,而且rownum只能小于某值,不能大于某值,故而rownum和where联用才能完成数据范围的控制 2.2.2.2 Mysql mysql的分页可以用limit startNum,pageNum 2.3 了解 2.3.1 事务 2.3.1.1 Rollback start transaction; --开始事务 insert into g_dict values('test','测试','1',''); --执行数据操作语言(DML) select * from g_dict where code = 'test'; --可以查看是否执行正确 rollback; --错误执行rollback操作 commit; --正确执行commit操作 2.3.1.2 Savepoint start transaction; --开始事务 insert into g_dict values('t1','测试','1',''); --执行数据操作语言(DML) savepoint pointA; insert into g_dict values('t2','测试','1',''); --执行数据操作语言(DML) select * from g_dict where code = 'test33'; --可以查看是否执行正确 rollback to savepoint pointA; 2.3.2 利用执行计划评估SQL语句的性能 2.3.2.1 工具 在PL/SQL Developer写好一段SQL代码后,按F5,PL/SQL Developer会自动打开执行计划窗口,显示该SQL的执行计划。 2.3.2.2 查看总COST,获得资源耗费的总体印象 一般而言,执行计划第一行所对应的COST(即成本耗费)值,反应了运行这段SQL的总体估计成本,单看这个总成本没有实际意义,但可以拿它与相同逻辑不同执行计划的SQL的总体COST进行比较,通常COST低的执行计划要好一些。 2.3.2.3 了解执行计划的执行步骤 按照从左至右,从上至下的方法,了解执行计划的执行步骤; 执行计划按照层次逐步缩进,从左至右看,缩进最多的那一步,最先执行,如果缩进量相同,则按照从上而下的方法判断执行顺序,可粗略认为上面的步骤优先执行。每一个执行步骤都有对应的COST,可从单步COST的高低,以及单步的估计结果集(对应ROWS/基数),来分析表的访问方式,连接顺序以及连接方式是否合理。 2.3.2.4 分析表的访问方式 表的访问方式主要是两种:全表扫描(TABLE ACCESS FULL)和索引扫描(INDEX SCAN),如果表上存在选择性很好的索引,却走了全表扫描,而且是大表的全表扫描,就说明表的访问方式可能存在问题;若大表上没有合适的索引而走了全表扫描,就需要分析能否建立索引,或者是否能选择更合适的表连接方式和连接顺序以提高效率。 2.3.2.5 分析表的连接方式和连接顺序 表的连接顺序:就是以哪张表作为驱动表来连接其他表的先后访问顺序。 表的连接方式:简单来讲,就是两个表获得满足条件的数据时的连接过程。主要有三种表连接方式,嵌套循环(NESTED LOOPS)、哈希连接(HASH JOIN)和排序-合并连接(SORT MERGE JOIN)。我们常见得是嵌套循环和哈希连接。 嵌套循环:最适用也是最简单的连接方式。类似于用两层循环处理两个游标,外层游标称作驱动表,Oracle检索驱动表的数据,一条一条的代入内层游标,查找满足WHERE条件的所有数据,因此内层游标表可用索引的选择性越好,嵌套循环连接的性能就越高。 哈希连接:先将驱动表的数据按照条件字段以散列的方式放入内存,然后在内存匹配满足条件的行。哈希连接需要有合适的内存,而且必须在CBO优化模式下,连接两表的WHERE条件有等号的情况下才可以使用。哈希连接在表的数据量较大,表没有合适的索引可用时比嵌套循环的效率要高。 2.3.3 优化器 Oracle优化器分为基于规则的优化器(RBO)和基于代价的优化器(CBO)。 2.3.3.1 规则的优化器(RBO) RBO的优化方式,依赖于一套严格的语法规则,只要按照规则写出的语句,不管数据表和索引的内容是否发生变化,不会影响PL/SQL语句的"执行计划"。 2.3.3.2 基于代价的优化器(CBO) CBO计算各种可能"执行计划"的"代价",即cost,从选用cost最低的方案,作为实际运行方案。各"执行计划"的cost的计算根据,依赖于数据表数据的统计分布,ORACLE数据库本身对该统计分布是不清楚的,须要分析表和相关的索引,才能搜集到CBO所需的数据。 2.3.4 表分析analysis 2.3.4.1 说明 analyze table,一般可以指定分析表、所有字段、所有索引字段、所有索引,若不指定则全部都分析。 2.3.4.2 表分析 analyze table dy_info compute statistics; 2.3.4.3 删除分析数据 analyze table dy_info delete statistics; 2.3.5 oracle添加强制索引 如果使用的是CBO的话,可能SQL不执行索引,则可以添加强制索引执行索引。 2.3.5.1 语法 /*+index(tablename indexname)*/ 2.3.5.2 举例 select /*+index(t INDEX_SAP)*/* from dy_info t where t.sap = 'T6000890'
《数据库原理及应用》课程实验 实验1 创建数据库和数据表 一、实验目的 熟悉SQL Server Management Studio界面;掌握通过图形化向导和执行Transact-SQL语句创建数据库的方法。 二、实验环境 Windows7操作系统,SQL Server软件。 三、实验课时 2课时。 四、实验内容 SQL Server一个数据库必须至少包含一个数据文件和一个事务日志文件,所以创建数据库就是建立主数据文件和日志文件。 在SQL Server创建数据库的方法主要有两种:一是在SQL Server Management Studio窗口使用可视化界面,通过方便的图形化向导创建,二是通过执行Transact-SQL语句创建。 (一)向导方式创建 1、从“开始”菜单选择“所有程序”→“Microsoft SQL Server ”,打开“SQL Server Management Studio”窗口,使用Windows或SQL Server身份验证建立连接。 2、在“对象资源管理器”窗格展开服务器,选择“数据库”节点右击,从弹出的快捷菜单选择“新建数据库”命令,打开“新建数据库”窗口。 3、该窗口有3个页,分别是“常规”、“选项”和“文件组”,完成这3个页的内容即可完成数据库的创建。这里,我们仅设置“常规”的相应内容,其他2个页的内容按照默认设置即可。 (1)“数据库名称”文本框输入数据库的名称,如“student”,再输入该数据库的所有者,这里使用默认值即可。(也可以通过单击文本框右边的“浏览”按钮选择所有者。 (2)“数据库文件”列表包括两行,一个是数据文件,一个是日志文件。通过单击下面相应的按钮可以添加或删除相应的数据文件。  逻辑名称:指定该文件的文件名。  文件类型:用于区别当前文件是数据文件还是日志文件。  文件组:显示当前数据库文件所属的文件组。  初始大小:指定该文件的初始容量。在SQL Server 数据文件的默认值为3MB,日志文件的默认值为1MB。  自动增长:用于设置在文件容量不够用时,文件根据何种增长方式自动增长。  路径:指定存放在文件的目录。默认情况下,SQL Server 将存放路径设置为其安装目录下的data子目录,单击该列的按钮可以在打开的“定位文件夹”对话框更改数据库的存储路径。 完成上述操作后,单击“确定”按钮关闭“新建数据库”窗口,即完成了数据库的创建,可以在“对象资源管理器”窗格看到新建的数据库。 (二)语言方式创建 SQL Server 使用的Transact-SQL语言是标准SQL的增强版本,使用它提供的Create Database语句同样可以完成对数据库的建立(参考内容见附录)。 1、单击“新建查询”按钮,创建一个查询输入窗口将附录的语句复制到该窗口。选择创建数据库的命令,单击工具栏的“分析”按钮,可以检查语法错误;单击“执行”按钮即可执行语句,在查询窗口内的“查询”窗格可以看到“命令已成功完成”的提示消息。在“对象资源管理器”窗格刷新,即可看到新建的数据库。 2、继续执行Create Database之后的语句,在“student”数据库用Create Table命令依次建立S、C和SC这三个数据表,各表字段如下: STUDENT(SNO,SNAME,SEX,DOB,DEPT,TELNO) COURSE(CNO,CNAME,CPNO,TEACHER,CREDIT) SC(SNO,CNO,SCORE) 表1:STUDENT表 列名 类型 长度 约束 NULL PK FK CHECK sno char 10 N Y sname varchar 8 N sex Char 2 N ‘男’ or ‘女’ DOB datetime dept varchar 10 telno char 11 N 表2:COURSE表 列名 类型 长度 约束 NULL PK FK CHECK cno char 5 N Y cname varchar 10 N Cpno char 5 teacher varchar 8 N credit smallint 表3:SC表 列名 类型 长度 约束 NULL PK FK CHECK sno char 10 N Y References s(sno) cno char 5 N References c(cno) score decimal(6,2) 0-100 要求:当主表STUDENT的主码SNO和COURSE的主码CNO发生修改或删除时,SC表的相应外码做CASCADE操作。 (三)知识巩固 用SQL-DDL语言创建“产品订购”数据库,包含四个数据表S、P、J和SPJ,表结构及内容如下(下划线为主码): S(SNO,SNAME, ADDRESS,TEL) 释义:供应商(供应商编号,姓名,地址,电话) J(JNO,JNAME,LEADER,BG) 释义:项目(编号,项目名,负责人,预算) P(PNO,PNAME,SPEC,CITY,COLOR) 释义:零件(编号,零件名,规格,生产地,颜色) SPJ(SNO,JNO,PNO,QTY) 释义:供应(供应商编号,项目编号,零件编号,数量) 其,sno,jno,pno分别为对应S表,J表,P表的外码。 S表 列名 类型 长度 约束 NULL PK FK CHECK sno char 10 N Y sname varchar 8 N address char 10 N tel char 11 N J表 列名 类型 长度 约束 NULL PK FK CHECK jno char 10 N Y jname varchar 8 N leader varchar 8 N bg int N P表 列名 类型 长度 约束 NULL PK FK CHECK pno char 10 N Y pname varchar 8 N spec char 10 N city char 10 N color char 10 N SPJ表 列名 类型 长度 约束 NULL PK FK CHECK sno char 10 N Y References s(sno) jno char 10 N References j(cno) pno char 10 N References p(pno) qty int 实验2 数据库的简单查询 一、实验目的 掌握单表查询各个子句(Select、From、Where、Group、Having、Order)的用法,特别要掌握比较运算符和逻辑运算符的使用。 二、实验环境 Windows7操作系统,SQL Server软件。 三、实验课时 2课时。 四、实验内容 在已建立的学生数据库和数据表的基础上,用Select语句完成下列查询操作。 STUDENT(SNO,SNAME,SEX,DOB,DEPT,TELNO) COURSE(CNO,CNAME,CPNO,TEACHER,CREDIT) SC(SNO,CNO,SCORE) 1、 查询全体学生的学号和姓名。 Select sno,sname From s 2、 查询全体学生的所有基本信息(仅针对S表)。 Select * From S 3、 对SC表查询全体学生的选课记录,并对score列增加5分。 Select sno,cno,score=score+5 From SC 4、 查询全体学生的学号和姓名,将原来的英文列名设置文别名。 Select sno,sname from 5、 显示所有选课学生的学号,去掉重复结果。 Select distinct sno From sc 6、 查询成绩在80分以上的学生选课记录。 Select * From sc Where score>80 7、 查询经济系所有学生的学号和姓名。 Select sno,sname From S 8、 查询成绩在80~90分的学生选课记录. 9、 查询年龄不在22~25的学生记录。 10、 查询所有姓“刘”的学生基本信息。 11、 查询无考试成绩(成绩为空值)的学号、课程号。 12、 查询考试成绩非空值的学号、课程号。 13、 查询数学系年龄小于20岁的学生记录。 14、 查询选修了‘101’或‘102’课程的选课记录。 15、 查询学生总人数。 16、 查询选修了课程的学生人数。 17、 查询选修了‘101’课程的学生的平均成绩。 18、 查询学号为‘01003’的学生的考试总成绩。 19、 查询‘101’课程的最高分和最低分。 20、 查询每门课程的选课人数。 21、 查询每个学生的学号、选课数、平均成绩和总成绩。 22、 查询选课数超过2门的学生学号及其选课数。 23、 查询所有学生信息,查询结果按年龄降序排列。(针对S表操作) 24、 查询所有学生信息,查询结果按系名升序,同系学生按年龄降序排列。 25、查询选课数超过2门的学生学号及其选课数,查询结果按选课数降序排列。 实验3 数据库的多表查询 一、实验目的 继续熟练SQL-SELECT语句的使用;理解多表查询的概念;掌握多表连接查询各个子句的用法,特别要比较内连接和外连接的结果。掌握非相关子查询、相关子查询用法,理解它们的执行过程。 二、实验环境 Windows7操作系统,SQL Server软件。 三、实验课时 2课时。 四、实验内容 (一)、在已建立的STUDENT数据库和数据表的基础上,用Select语句的连接查询完成下列操作。 1、查询每个学生的基本信息及其选课情况。 select * from s,sc where s.sno=sc.sno 2、查询选修‘a’课程的学生学号、姓名和成绩。 select sno,sname,score from s,sc where cno=’a’ and s.sno=sc.sno 3、查询与‘李四’在同一个系学习的学生记录。 select from where 4、查询与‘李平’年龄相同的学生记录。 select from where 5、查询选修课程名为“高数”的选课记录。 select sno,score from c,sc where cname=’高数’ and c.cno=sc.cno 6、查询选修课程名为“高数”的学生记录。 select s.sno,sname from s,c,sc where cname='高数' and s.sno=sc.sno and c.cno=sc.cno 7、查询选修‘a’课程且成绩大于等于90的学号、姓名和成绩。 select s.sno,sname,score from s,sc where cno='a' and score>90 and s.sno=sc.sno 8、查询‘吴十’的所有选课记录。 select cno from s,sc where sname=’吴十’ and s.sno=sc.sno 9、查询计算机系学生选修的课程号,要求结果去掉重复记录。 select distinct cno from s,sc where dept=’计算机’ and s.sno=sc.sno 10、查询计算机系选修课程数大于等于2的学号、姓名及平均成绩,查询结果按平均成绩降序。 select sno,sname,avg(score)平均成绩 from s,sc where sc and s.sno=sc.sno order by avg(score) 11、查询每个学生的学号、选修课程号、课程名及成绩。 select s.sno,c.cno,cname,score from s,c,sc where s.sno=sc.sno and c.cno=sc.cno 12、查询所有学生的选修情况(包括选课和未选课的学生),要求显示学号、姓名、课程号和成绩。 select sno,sname,cno,score from where (二)、在已建立的数据库和数据表的基础上,用Select语句的嵌套查询完成下列操作。 1、查询选修‘a’课程且成绩大于等于90的学号、姓名。 select sno,sname from s where sno=(select sno from sc where cno='a' and score>90) 2、查询‘李四’的所有选课记录。 select cno from sc where sno= (select sno from s where sname=’李四’ ) 3、查询与‘李平’在同一个系学习的学生记录。 select from where 4、查询与‘李平’年龄相同的学生记录。 select from where 5、查询选修课程名为‘高数’的选课记录,输出结果包括学号和成绩。 select sno,score from sc where cno= (select cno from c where cname=’ 高数’ ) 6、查询选修课程名为‘高数’的学生记录,输出结果包括学号、姓名和所在系。 select sno,sname,dept from s where sno= (select sno from sc where cno= (select cno from c where cname=’高数’ ) ) 7、查询学号为‘1’学生的选修课程号和课程名。 select cno,cname from c where sno= (select from where 8、查询没有选修‘101’课程的学生学号和姓名。 select from where 9、查询选修‘101’课程或‘102’课程的学生姓名。 select from where 10、查询选修‘101’课程和‘102’课程的学生学号。 select from where 11、查询选修‘101’课程但没选修‘102’课程的学生学号。 select from where 12、查询没有选修任何课程的学生记录,输出结果包括学号、姓名和所在系。 select from where 13、查询数学系学生选修的课程号,要求结果去掉重复记录。 select from where 14、查询选修课程至少包含‘01003’选修课程的学生学号。 select from where 实验4 数据库更新、视图定义及使用 一、实验目的 掌握Insert、Update、Delete语句的使用;对于Insert语句,要求理解默认值约束、空值约束在插入记录时所起的作用。理解视图的概念,掌握Create View、Drop View语句的使用;掌握基于视图的查询语句的使用。 二、实验环境 Windows7操作系统,SQL Server软件。 三、实验课时 2课时。 四、实验内容 (一)、在已建立的数据库和数据表的基础上,向数据库添加一个临时表ST,其结构与S表结构相同。用Insert语句向临时表输入数据,输入有误时用Update语句进行修改。再用三个更新语句完成下列操作。 1、向S表添加若干新记录,内容自定。(观察已定义的表的约束情况) 2、向SC表添加新记录,内容自定,不低于10条(注意不能违反参照完整性)。 3、为临时表ST添加记录。 4、把S表的所有行一次性地加到临时表STselect * into ST from S; 5、在SC表把所有学生的成绩加2分。 update sc set score=case when score+2>100 then 100 else isnull(score,0)+2 end; 6、在ST表把所有学生的年龄增加1。 7、在ST表把‘李四’的所在系改为‘计算机’。 update st set dept='计算机' where sname='李四' 8、在SC表将选修课程‘高数’的学生成绩加2分。 update sc set score=score+2 from sc,c where sc.cno=c.cno and cname='高数' 9、在SC表删除所有成绩为空值的选修记录。 delete sc where score is null 10、删除计算机系选修成绩不及格的选课记录。 delete sc from s,sc where s.sno=sc.sno and score90 7、查询计算机系选修课程名为“高数”并且成绩大于70分的学生的学号和成绩。 select sno,score from SCVIEW where cname='高数' and score>70 8、通过MAST视图将学号为‘01008’学生的年龄修改为21岁。 9、通过MAST视图将学号为‘2’学生所在系改为‘经济’,是否能成功执行?若不能成功请说明理由;若修改成功,请再次通过MAST视图查询学生基本信息,是否能查询到该生?若不能查询请说明理由。 能成功执行以下语句: update MAST set dept='经济' where sno='2' 不能查到该生,因为在MAST视图下他的条件已经不符合系名为数学。 10、通过SCVIEW视图将学号为‘1’学生的总成绩修改为380分,是否能成功执行?若不能成功请说明理由。 实验5 数据库的安全与保护 一、实验目的 理解SQL Server的用户与权限管理机制,掌握用对象资源管理器创建服务器登录帐号,并同时建立用户。掌握如何为给定的用户分配权限。 二、实验环境 Windows7操作系统,SQL Server软件。 三、实验课时 2课时。 四、实验内容 用户与权限管理 (1)打开“SQL Server Management Studio”窗口,使用对象资源管理器创建两个服务器登录帐号Test1和Test2,并在“sample_st”数据库创建两个对应的同名用户。设置Test1用户和Test2用户的默认架构为guest。 (2)使用Test1身份登录,并为Test2分配创建数据表的权限;用Test2身份登录来验证权限分配成功。 (3)使用Test1身份登录,收回刚刚分配给Test2的创建数据表的权限;用Test2身份登录来验证权限回收成功。 五、实验步骤 1、使用对象资源管理器创建两个服务器登录帐号。 以系统管理员身份登录SQL Server。打开“SQL Server Management Studio”窗口,在对象资源管理器列表,打开展开“安全性”文件夹,选择“登录名”图标,单击鼠标右键,在弹出的菜单选择“新建登录名”。在打开的对话框依次建立Test1和Test2,选择“SQL Server身份验证”,同时还要输入密码,默认数据库为“sample_st”。 (2)在“用户映射”列出了当前登录帐号可以选择访问的数据库如“sample_st”,在其左侧的复选框打勾,表示当前登录帐号可以访问对应的数据库,默认用户名与登录帐号相同。 (3)单击“确定”按钮完成创建。 2、创建新的数据库用户。 在对象资源管理器要访问操作的数据库,展开“安全性”文件夹,在“用户”文件夹查找是否已建立与登录名Test1和Test2同名的数据库用户,若已建立,则在属性修改其默认架构为guest;否则右击鼠标在菜单选择“新建用户”选项,出现“数据库用户-新建”对话框,建立相应的用户。 3、用Grant、Revoke命令实现对用户的授权和收权。 4、用Create命令创建数据表验证授权和收权是否成功。 5、以系统管理员身份登录SQL Server。使用:“GRANT SELECT ON SC TO Test1 WITH GRANT OPTION”命令,再分别以Test1和Test2身份登录,进行授权及查询数据表,验证“WITH GRANT OPTION”能否成功执行。 6、以系统管理员身份使用“REVOKE”命令回收上述授权。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值