带答案--实验6:SQL高级查询
实验报告高级查询
![实验报告高级查询](https://img.taocdn.com/s3/m/0d065c89c0c708a1284ac850ad02de80d4d806ef.png)
一、实验目的1. 掌握SQL语言中高级查询语句的使用方法。
2. 熟悉使用子查询、连接查询、分组查询、排序查询等高级查询功能。
3. 提高数据库查询能力,解决实际查询问题。
二、实验环境1. 操作系统:Windows 102. 数据库:MySQL 5.73. 数据库工具:MySQL Workbench三、实验内容1. 创建数据库和表(1)创建数据库```sqlCREATE DATABASE experiment;```(2)创建表```sqlUSE experiment;CREATE TABLE department (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL);CREATE TABLE employee (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,age INT,department_id INT,salary DECIMAL(10, 2),FOREIGN KEY (department_id) REFERENCES department(id) );```2. 高级查询(1)子查询```sql-- 查询部门名称为“技术部”的员工信息SELECT FROM employee WHERE department_id IN (SELECT id FROM department WHERE name = '技术部');-- 查询年龄大于30岁的员工信息SELECT FROM employee WHERE age > (SELECT AVG(age) FROM employee);```(2)连接查询```sql-- 查询部门名称为“技术部”的员工及其部门信息SELECT e., AS department_nameFROM employee eJOIN department d ON e.department_id = d.idWHERE = '技术部';-- 查询员工姓名为“张三”的部门及其部门领导信息SELECT AS employee_name, AS department_name, AS manager_nameFROM employee eJOIN department d ON e.department_id = d.idJOIN employee m ON d.id = m.department_idWHERE = '张三' AND = '部门领导';```(3)分组查询```sql-- 查询每个部门员工的人数SELECT AS department_name, COUNT(e.id) AS employee_countFROM department dJOIN employee e ON d.id = e.department_idGROUP BY ;-- 查询平均工资大于5000的部门信息SELECT AS department_name, AVG(e.salary) AS average_salaryFROM department dJOIN employee e ON d.id = e.department_idGROUP BY HAVING AVG(e.salary) > 5000;```(4)排序查询```sql-- 查询所有员工信息,按年龄升序排序SELECT FROM employee ORDER BY age ASC;-- 查询所有员工信息,按工资降序排序SELECT FROM employee ORDER BY salary DESC;```四、实验结果与分析通过本次实验,我们学习了SQL语言中高级查询语句的使用方法,包括子查询、连接查询、分组查询、排序查询等。
实验6-SQL-查询附答案
![实验6-SQL-查询附答案](https://img.taocdn.com/s3/m/5ba052d78762caaedd33d47f.png)
实验六SQL 查询一、实验目的:1.熟练掌握SELECT语句的语法格式2.掌握联接的几种方法3.掌握子查询的表示和执行4.能够对SELECT查询结果进行分组、排序及统计5.能够运用T-SQL语句对表进行数据的插入、修改、删除6.能够通过导入/导出向导进行数据的导入导出二、实验内容:利用实验四中的数据库做如下操作:1.在“学生表”中,找出性别为“男”的学生记录,字段包括“姓名”、“出生日期”和“专业”。
2.在“课程表”中,找出“课程名”中包含“计算机”三个字的课程。
3.在“成绩表”中,找出“课程编号”为“001”的课程成绩前三名学生。
4.在“成绩表”、“学生表”和“课程表”中,找出“课程编号”为“001”的课程成绩在[80,90]之间的学生的姓名、课程名和成绩。
5.在“学生表”中,找出“专业”为“计算机软件”、“电子商务”专业的学生信息。
6.统计“计算机应用基础”课程的平均分。
7.查找各门课程的修课人数。
8.在“成绩表”中,找出课程编号为“001”的这门课程的所有学生的分数以及最高分、最低分和平均分。
9.找出所有女生的“计算机应用基础”这门课的成绩,包括字段:姓名、课程名、成绩。
10.查找“成绩表”中,课程编号为“001”的成绩高于平均分的所有学生的学号、姓名、课程名和成绩。
11.查找“成绩表”中,高于各门课程平均分的学生信息。
12.查找“课程表”中,没有被学生修课的课程信息。
13.将“课程表”中的课程编号为“001”的学分增加1学分。
14.删除学号为“”学生的相关信息。
三、实验过程:启动“查询分析器”,在其文本窗口中输入相应的Transcat-SQL语句,分析并执行,观察输出结果。
1.Use 学生select 姓名,出生日期,专业 from 学生表 where 性别='男'2.use 学生select * from 课程表 where 课程名 like '%计算机%'3.use 学生select top 3 * from 成绩表 where 课程编号='001' order by 成绩 desc4.Use 学生select a.姓名,c.课程名,b.成绩 from 学生表 as a join 成绩表 as b on b.课程编号=001 and a.学号=b.学号 and b.成绩 between 80 and 90 join 课程表 as c on c.课程编号=b.课程编号5.use 学生select * from 学生表 where 专业 in ('计算机软件','电子商务')6.use 学生select avg(成绩)as 平均成绩 from 成绩表 as a join 课程表 as bon b.课程名='计算机应用基础' and b.课程编号=a.课程编号7.use 学生select 课程编号,count(学号)as 修课人数 from 成绩表 group by 课程编号8.use 学生select * from 成绩表 where 课程编号=001compute max(成绩),min(成绩),avg(成绩)9.use 学生select a.姓名,b.课程名,c.成绩 from 学生表 as a join 成绩表 as c on a.学号=c.学号 and a.性别='女'join 课程表 as bon b.课程编号=c.课程编号 and b.课程名='计算机应用基础'10.use 学生select a.学号,a.姓名,b.课程名,c.成绩 from 课程表 as b join 成绩表 as c on b.课程编号=c.课程编号 and c.课程编号=001 and c.成绩>(select avg(成绩) from 成绩表 where c.课程编号=001)join 学生表 as a on a.学号=c.学号11.use 学生select * from 成绩表 as a where 成绩>(select avg(成绩) from 成绩表 as b where a.课程编号=b.课程编号)12.use 学生select * from 课程表 where not exists(select * from 成绩表 where 成绩表.课程编号=课程表.课程编号)13.use 学生update 课程表 set 学分=学分+1 where 课程编号=00114.use 学生delete 成绩表 where 学号='20030101'。
高级SQL语句查询(含答案和截图)
![高级SQL语句查询(含答案和截图)](https://img.taocdn.com/s3/m/406a993a0912a21614792916.png)
C顾客cidcnamecity discntc001 李广天津10.00c002 王开基北京12.00c003 安利德北京8.00c004 曹士雄天津8.00c006 曹士雄广州0.00P商品pidpname city quantity pricep01 梳子天津111400 0.50p02 刷子成都203000 0.50p03 刀片西安150600 1.00p04 钢笔西安125300 1.00p05 铅笔天津221400 1.00p06 文件夹天津123100 2.00p07 盒子成都100500 1.00A代理aidanamecity percenta01 史可然北京 6a02 韩利利上海 6a03 杜不朗成都7a04 甘瑞北京 6a05 敖斯群武汉 5a06 史可然天津 5O订单ordnomonthcidaid pidqtydollars1011 01 c001 a01 p01 1000 450.00 1012 01 c001 a01 p01 1000 450.00 1019 02 c001 a02 p02 400 180.00 1017 02 c001 a06 p03 600 540.00 1018 02 c001 a03 p04 600 540.00 1023 03 c001 a04 p05 500 450.00 1022 03 c001 a05 p06 400 720.00 1025 04 c001 a05 p07 800 720.001013 01 c002 a03 p03 1000 880.001026 05 c002 a05 p03 800 704.001 查询所有定购了至少一个价值为0.50的商品的顾客的名字。
amefrom clientwherecid in (select cid from order1 where pid in(select pid from product where price='0.5'))2 找出全部没有在代理商a03处订购商品的顾客cid值。
实验-T-SQL高级应用(答案)
![实验-T-SQL高级应用(答案)](https://img.taocdn.com/s3/m/42d93fc29ec3d5bbfd0a74e4.png)
实验六T-SQL高级应用一、实验目的:(1) 掌握T-SQL程序设计的控制结构及程序设计逻辑。
(2) 掌握自定义函数、存储过程、游标的使用。
二、实验内容(1) 从学生数据库school中查询所有同学选课成绩情况:姓名、课程名、成绩。
要求:小于60分的输出“不及格”;60—70分的输出“及格”;70—80分的输出“中等”;80—90分的输出“良好”;90—100分的输出“优秀”。
select sname as '姓名',cname as '课程名',casewhen degree<60 then '不及格'when degree<70 then '及格'when degree<80 then '中等'when degree<90 then '良好'else '优秀'end as '成绩'from student s,course c,scwhere s.sno=sc.sno and o=o(2) 创建一个自定义函数,根据学生姓名查询该生所有的选课信息,包括课程名、成绩。
--创建函数f1create function f1(@xm char(10))returns tableasreturn (select cname,degreefrom student s,course c,scwhere s.sno=sc.sno and o=o and sname=@xm) --调用函数f1select * from f1('刘晨')(3) 创建一个自定义函数,实现如下功能:判断一个数是否是素数。
--创建函数,返回1代表n是素数,返回0代表n不是素数create function sh(@n int)returns tinyintbegindeclare @i int,@f tinyintset @i=2set @f=1 --假定@n是素数while @i<=sqrt(@n)beginif @n%@i=0beginset @f=0breakendset @i=@i+1endreturn @fendgo--调用函数sh,判断5是否是素数if dbo.sh(5)=1print '是素数'elseprint '不是素数'(4)创建包含两个参数的存储过程stucred,一个输入参数(@sno)用于指定学生学号,一个输出参数(@s_cred)用于返回该生所修学分总和。
sql查询举例(含答案)
![sql查询举例(含答案)](https://img.taocdn.com/s3/m/c8c73e49804d2b160a4ec003.png)
查询练习一、简单查询(无条件查询):1、查询“学生档案”表中所有的记录SELECT * FORM 学生档案2、查询“学生档案”表中全体学生的姓名、学号、家庭地址SELECT 姓名, 学号, 家庭地址 FROM 学生档案二、有条件查询1、查询“成绩管理”表中语文成绩在80分以下的学生的学号。
SELECT 学号 FROM 成绩管理 WHERE 语文<802、查询“成绩管理”表中语文成绩在80分到90分之间的学生的学号,语文,数学,英语成绩。
SELECT 学号,语文,数学,英语FROM成绩管理WHERE 语文 >= 80 AND 语文<=90==(语文 BETWEEN 80 AND 90)3、查询“成绩管理”表中数学成绩不在75分到85分之间的学生的学号,语文,数学,英语成绩。
SELECT 学号,语文,数学,英语FROM 成绩管理WHERE 数学 NOT BETWEEN 75 AND 854、查询“学生档案”表中李成刚,刘艺梅,郑莉三名学生的信息。
SELECT *FROM 学生档案WHERE 姓名 IN (“李成刚”,“刘艺梅”,“郑莉”)==(姓名 =“李成刚” OR 姓名=“刘艺梅” OR 姓名=“郑莉”)5、查询“学生档案”表中所有姓张的学生的姓名、学号和性别SELECT 姓名,学号,性别 FROM学生档案WHERE 姓名 LIKE “张*”6、查询“学生档案”表中所有姓张且全名为三个汉字的学生的姓名SELECT 姓名FROM 学生档案WHERE姓名 LIKE “张??”7、查询“学生档案”表中第二个字符为“建”字的学生的学号和姓名SELECT 学号,姓名FROM 学生档案WHERE姓名 LIKE “?建*”8、查询“学生档案”表中家庭住址为“人民路”和“育才路”的学生学号,姓名,性别和家庭住址。
SELECT 学号,姓名,性别,家庭住址FROM 学生档案WHERE家庭住址 LIKE “人民路*” OR家庭住址 LIKE “育才路*”9、查询“学生档案”表中所有团员的学生班级和姓名。
SQL高级查询
![SQL高级查询](https://img.taocdn.com/s3/m/a799f82c482fb4daa58d4bd7.png)
SQL高级查询实战1.创建数据库(5分)1)数据库名:studydb2.创建表(15分)1)学生表2)课程表3)成绩表4)教师表3.插入测试数据(5分)略。
4.实现高级查询(70分,自选14题,每小题5分)1)查询java课程比C#分数高的学生2)查询平均分成绩大于70分的同学的姓名和平均成绩3)查询所有同学的学号、姓名、选课数、总成绩4)查询姓“王”的老师的个数5)查询没有学过java课的学生的学号、姓名6)查询学过“C#”课程并且也学过“sql”课程的学生的学号、姓名7)查询所有课程的平均分、及格率8)查询所有课程成绩小于60分的同学的学号、姓名、性别9)查询没有学全所有课的同学的学号、姓名、性别10)查询至少有一门课与学号为“002”的同学所学相同的同学的学号和姓名11)查询至少学过学号为“002”同学所有一门课的其他同学学号和姓名12)把成绩表中“李庆”老师教的课的成绩都更改为此课程的平均成绩13)查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名14)删除学习“李庆”老师课的成绩表记录15)按平均成绩从高到低显示所有学生的“sql”、“java”、“c#”三门的课程成绩,按如下形式显示:学生ID,sql,java,c#,有效课程数,有效平均分16)查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分17)查询不同老师所教不同课程平均分从高到低显示18)查询各科成绩前三名的记录:(不考虑成绩并列情况)19)查询每门课程被选修的学生数20)查询出只选修了一门课程的全部学生的学号和姓名21)查询男生、女生人数22)查询姓“张”的学生名单23)查询同名同性学生名单,并统计同名人数24)查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列25)查询平均成绩大于的所有学生的学号、姓名和平均成绩26)检索至少选修两门课程的学生学号27)查询两门以上不及格课程的同学的学号及其平均成绩28)检索“java”课程分数小于60,按分数降序排列的同学姓名29)删除“002”同学的“001”课程的成绩30)查询不及格的课程,并按课程号从大到小排列。
第6章 SQL高级查询
![第6章 SQL高级查询](https://img.taocdn.com/s3/m/5f94e162af1ffc4ffe47acb3.png)
6.3.3 自连接
• 自连接是指同一张表之间的连接查询,它主 要用于在自参照表上显示上下级关系或层次 关系。 例如:emp表中包含empno列和mgr列,二者之 间就有参照关系。(mgr参照empno)。 由于自连接是在同一张表之间的连接, 所以必须定义表别名。
例1: SQL> select manager.ename from emp manager,emp worker 2* where manager.empno=worker.mgr and worker.ename='BLAKE‘ ENAME ---------KING
Oracle 10g 数据库
第6章 SQL高级查询
目标
• • • • 了解关系操作和关系完整性; 理解和掌握连接查询; 掌握子查询; 会使用集合操作符。
6.1 关系操作
• 关系运算包括传统的集合运算和专门的关系 运算。 • 传统的集合运算将关系看成元组的集合,其 运算是从关系的“水平”方向即行的角度进 行;而专门的关系运算不仅涉及行而且涉及 列。 • 传统的集合元素包括并、交、差、笛卡尔积 四种运算,专门的关系运算包括选择、投影、 连接和除法运算。
A a1 a2 NULL
B b1 b3 b2
C 5 8 NULL
E 3 10 7
右外连接
6.2 关系的完整性约束
关系模型中有三种完整性约束:实体完整性、 参照完整性、用户自定义完整性。其中前两个是 关系模型必须满足的完整性约束条件,有关系系 统自动支持。而用户自定义完整性是应用领域需 要遵循的约束条件,体现了具体应用领域中的语 义约束。 (1)实体完整性 若属性(指一个或一组属性)A是关系R的主 属性(即主键中的属性),则A不能去空值。 所谓空值就是“不知道”或“不存在”的值。
SQL高级查询——50句查询(含答案)
![SQL高级查询——50句查询(含答案)](https://img.taocdn.com/s3/m/80534420b80d6c85ec3a87c24028915f804d8402.png)
SQL⾼级查询——50句查询(含答案)--⼀个题⽬涉及到的50个Sql语句--(下⾯表的结构以给出,⾃⼰在数据库中建⽴表.并且添加相应的数据,数据要全⾯些. 其中Student表中,SId为学⽣的ID)------------------------------------表结构----------------------------------------学⽣表tblStudent(编号StuId、姓名StuName、年龄StuAge、性别StuSex)--课程表tblCourse(课程编号CourseId、课程名称CourseName、教师编号TeaId)--成绩表tblScore(学⽣编号StuId、课程编号CourseId、成绩Score)--教师表tblTeacher(教师编号TeaId、姓名TeaName)-----------------------------------------------------------------------------------问题:--1、查询“001”课程⽐“002”课程成绩⾼的所有学⽣的学号;Select StuId From tblStudent s1Where (Select Score From tblScore t1 Where t1.StuId=s1.stuId And t1.CourseId='001')>(Select Score From tblScore t2 Where t2.StuId=s1.stuId And t2.CourseId='002')--2、查询平均成绩⼤于60分的同学的学号和平均成绩;Select StuId,Avg(Score) as AvgScore From tblScoreGroup By StuIdHaving Avg(Score)>60--3、查询所有同学的学号、姓名、选课数、总成绩;Select StuId,StuName,SelCourses=(Select Count(CourseId) From tblScore t1 Where t1.StuId=s1.StuId),SumScore=(Select Sum(Score) From tblScore t2 Where t2.StuId=s1.StuId)From tblStudent s1--4、查询姓“李”的⽼师的个数;Select Count(*) From tblTeacher Where TeaName like '李%'--5、查询没学过“叶平”⽼师课的同学的学号、姓名;Select StuId,StuName From tblStudentWhere StuId Not In(Select StuID From tblScore scInner Join tblCourse cu ON sc.CourseId=cu.CourseIdInner Join tblTeacher tc ON cu.TeaId=tc.TeaIdWhere tc.TeaName='叶平')--6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;Select StuId,StuName From tblStudent stWhere (Select Count(*) From tblScore s1 Where s1.StuId=st.StuId And s1.CourseId='001')>0 And(Select Count(*) From tblScore s2 Where s2.StuId=st.StuId And s2.CourseId='002')>0--7、查询学过“叶平”⽼师所教的所有课的同学的学号、姓名;Select StuId,StuName From tblStudent st Where not exists(Select CourseID From tblCourse cu Inner Join tblTeacher tc On cu.TeaID=tc.TeaIDWhere tc.TeaName='叶平' And CourseID not in(Select CourseID From tblScore Where StuID=st.StuID))--8、查询课程编号“002”的成绩⽐课程编号“001”课程低的所有同学的学号、姓名;Select StuId,StuName From tblStudent s1Where (Select Score From tblScore t1 Where t1.StuId=s1.stuId And t1.CourseId='001')> (Select Score From tblScore t2 Where t2.StuId=s1.stuId And t2.CourseId='002')--9、查询所有课程成绩⼩于60分的同学的学号、姓名;Select StuId,StuName From tblStudent stWhere StuId Not IN(Select StuId From tblScore sc Where st.StuId=sc.StuId And Score>60)--10、查询没有学全所有课的同学的学号、姓名;Select StuId,StuName From tblStudent stWhere (Select Count(*) From tblScore sc Where st.StuId=sc.StuId)<(Select Count(*) From tblCourse)--11、查询⾄少有⼀门课与学号为“1001”的同学所学相同的同学的学号和姓名;------运⽤连接查询Select DistInct st.StuId,StuName From tblStudent stInner Join tblScore sc ON st.StuId=sc.StuIdWhere sc.CourseId IN (Select CourseId From tblScore Where StuId='1001')------嵌套⼦查询Select StuId,StuName From tblStudentWhere StuId In(Select Distinct StuId From tblScore Where CourseId In (Select CourseId From tblScore Where StuId='1001'))--12、查询⾄少学过学号为“1001”同学所有课程的其他同学学号和姓名;Select StuId,StuName From tblStudentWhere StuId In(Select Distinct StuId From tblScore Where CourseId Not In (Select CourseId From tblScore Where StuId='1001')--13、把“SC”表中“叶平”⽼师教的课的成绩都更改为此课程的平均成绩; (从⼦查询中获取⽗查询中的表名,这样也⾏)--创建测试表Select * Into Sc From tblScoregoUpdate Sc Set Score=(Select Avg(Score) From tblScore s1 Where s1.CourseId=sc.CourseId)Where CourseId IN(Select CourseId From tblCourse cs INNER JOIN tblTeacher tc ON cs.TeaID=tc.TeaID WHERE TeaName ='叶平')--14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;Select StuID,StuName From tblStudent stWhere StuId <> '1002'AndNot Exists(Select * From tblScore sc Where sc.StuId=st.StuId And CourseId Not In (Select CourseId From tblScore Where StuId='1002')) AndNot Exists(Select * From tblScore Where StuId='1002' And CourseId Not In (Select CourseId From tblScore sc Where sc.StuId=st.StuId))--15、删除学习“叶平”⽼师课的SC表记录;Delete From tblScore Where CourseId IN(Select CourseId From tblCourse cs INNER JOIN tblTeacher tc ON cs.TeaId=tc.TeaId Where tc.TeaName='叶平')--16、向SC表中插⼊⼀些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、'002'号课的平均成绩;Insert Into tblScore (StuId,CourseId,Score)Select StuId,'002',(Select Avg(Score) From tblScore Where CourseId='002') From tblScore WhereStuId Not In (Select StuId From tblScore Where CourseId='003')--17、按平均成绩从⾼到低显⽰所有学⽣的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显⽰:学⽣ID,,数据库,企业管理,英语,有效课程数,有效平均分Select StuId,数据库=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='数据库' And sc.StuID=st.StuId),企业管理=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='企业管理' Andsc.StuID=st.StuId),英语=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='英语' Andsc.StuID=st.StuId),有效课程数=(Select Count(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='数据库' or CourseName='企业管理' or CourseName='英语') And sc.StuID=st.StuId),有效平均分=(Select Avg(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='数据库' or CourseName='企业管理' or CourseName='英语') And sc.StuID=st.StuId)From tblStudent stOrder by 有效平均分 Desc--18、查询各科成绩最⾼和最低的分:以如下形式显⽰:课程ID,最⾼分,最低分Select CourseId as 课程ID, 最⾼分=(Select Max(Score) From tblScore sc Where sc.CourseId=cs.CourseId ),最低分=(Select Min(Score) From tblScore sc Where sc.CourseId=cs.CourseId )From tblCourse cs--19、按各科平均成绩从低到⾼和及格率的百分数从⾼到低顺序 (百分数后如何格式化为两位⼩数??)Select 课程ID,平均分,及格率 From(Select CourseId as 课程ID, 平均分=(Select Avg(Score) From tblScore sc Where sc.CourseId=cs.CourseId ),及格率=Convert(varchar(10),((Select Count(*) From tblScore sc Where sc.CourseId=cs.CourseId And sc.Score>=60)*10000/(Select Count(*) From tblScore sc Where sc.CourseId=cs.CourseId))/100)+'%'From tblScore cs) as tmpGroup by 课程ID,平均分,及格率Order by 平均分, Convert(float,substring(及格率,1,len(及格率)-1)) Desc--20、查询如下课程平均成绩和及格率的百分数(⽤"1⾏"显⽰): 企业管理(001),马克思(002),OO&UML (003),数据库(004)Select 课程ID=sc.CourseId,课程名称=cs.CourseName,平均成绩=Avg(Score),及格率 =Convert(varchar(10),((Select Count(Score) From tblScore Where CourseId=sc.CourseId AndScore>=60)*10000/Count(Score))/100.0)+'%'From tblScore scInner Join tblCourse cs ON sc.CourseId=cs.CourseIdWhere sc.CourseId like '00[1234]'Group By sc.CourseId,cs.CourseName--21、查询不同⽼师所教不同课程平均分从⾼到低显⽰Select 课程ID=CourseId,课程名称=CourseName,授课教师=TeaName,平均成绩=(Select Avg(Score) From tblScore WhereCourseId=cs.CourseId)From tblCourse csInner Join tblTeacher tc ON cs.TeaId=tc.TeaIdOrder by 平均成绩 Desc--22、查询如下课程成绩第 3 名到第 6 名的学⽣成绩单:企业管理(001),马克思(002),UML (003),数据库(004)格式:[学⽣ID],[学⽣姓名],企业管理,马克思,UML,数据库,平均成绩Select * From(Select Top 6 学⽣ID=StuId,学⽣姓名=StuName,企业管理=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='企业管理' And sc.StuID=st.StuId),马克思=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='马克思' Andsc.StuID=st.StuId),UML=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='UML' Andsc.StuID=st.StuId),数据库=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='数据库' Andsc.StuID=st.StuId),平均成绩=(Select Avg(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='数据库' or CourseName='企业管理' or CourseName='UML'or CourseName='马克思') And sc.StuID=st.StuId),排名=Row_Number() Over(Order by(Select Avg(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='数据库' or CourseName='企业管理' or CourseName='UML'or CourseName='马克思') And sc.StuID=st.StuId) DESC) From tblStudent stOrder by 排名) as tmpWhere 排名 between 3 And 6--23、统计列印各科成绩,各分数段⼈数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]Select 课程ID=CourseId, 课程名称=CourseName,[100-85]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score between 85 And 100),[85-70]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score between 70 And 84),[70-60]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score between 60 And 69),[<60]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score <60)From tblCourse cs--24、查询学⽣平均成绩及其名次Select 学号=st.StuId, 姓名=StuName,平均成绩=sc.AvgScore,名次=(Dense_Rank() Over(Order by sc.AvgScore Desc)) From tblStudent st Inner Join (Select StuId,Avg(Score) as AvgScore From tblScore Group by StuId) as sc On sc.StuId=st.StuIdOrder by 学号--25、查询各科成绩前三名的记录:(不考虑成绩并列情况)Select 学号=StuId,课程号=CourseId,分数=ScoreFrom(Select Row_Number() Over(order by CourseId,Score Desc) as i,* From tblScore) as tmp --得到⼀个临时的排名表,其中i表⽰编号Where i In(Select Top 3 i From (Select Row_Number() Over(order by CourseId,Score Desc) as i,* From tblScore) as t1 Wheret1.CourseId=tmp.CourseId)--26、查询每门课程被选修的学⽣数Select 课程ID=CourseId,选修⼈数=(Select Count(*) From (Select Distinct StuId From tblScore Where CourseId=cs.CourseId) as tmp) From tblCourse cs--27、查询出只选修了⼀门课程的全部学⽣的学号和姓名Select 学号=StuId,姓名=StuNameFrom tblStudent stWhere (Select Count(*) From (Select Distinct CourseId From tblScore Where StuId=st.StuId) as tmp)=1--28、查询男⽣、⼥⽣⼈数Select 男⽣⼈数=(select Count(*) From tblStudent Where StuSex='男'),⼥⽣⼈数=(select Count(*) From tblStudent Where StuSex='⼥')--29、查询姓“张”的学⽣名单Select * From tblStudent Where StuName like '张%'--30、查询同名同性学⽣名单,并统计同名⼈数Select Distinct 学⽣姓名=StuName,同名⼈数=(Select Count(*) From tblStudent s2 Where s2.StuName=st.StuName) From tblStudent st Where (Select Count(*) From tblStudent s2 Where s2.StuName=st.StuName)>=2--31、1981年出⽣的学⽣名单(注:Student表中Sage列的类型是datetime)Select * From tblStudent Where Year(Sage)=1981--32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列Select 课程ID=CourseId,课程名称=CourseName,平均成绩=(Select Avg(Score) From tblScore Where CourseId=cs.CourseId)From tblCourse csOrder by 平均成绩,CourseId Desc--33、查询平均成绩⼤于85的所有学⽣的学号、姓名和平均成绩Select 学号=StuId,姓名=StuName,平均成绩=(Select Avg(Score) From tblScore Where StuId=st.StuId) From tblStudent stWhere (Select Avg(Score) From tblScore Where StuId=st.StuId)>85--34、查询课程名称为“数据库”,且分数低于60的学⽣姓名和分数Select 姓名=StuName,分数=Score From tblScore scInner Join tblStudent st On sc.StuId=st.StuIdInner Join tblCourse cs On sc.CourseId=cs.CourseIdWhere CourseName='数据库' And Score<60--35、查询所有学⽣的选课情况;Select 学号=StuId,选课数=(Select Count(*) From (Select Distinct CourseId From tblScore Where StuId=st.StuId) as tmp)From tblStudent stSelect distinct 姓名=StuName,选修课程=CourseName From tblScore scInner Join tblStudent st On sc.StuId=st.StuIdInner Join tblCourse cs On sc.CourseId=cs.CourseId--36、查询任何⼀门课程成绩在70分以上的姓名、课程名称和分数;Select 姓名=StuName,课程名称=CourseName,分数=Score From tblScore scInner Join tblStudent st On sc.StuId=st.StuIdInner Join tblCourse cs On sc.CourseId=cs.CourseIdWhere Score>=70--37、查询不及格的课程,并按课程号从⼤到⼩排列Select * From tblScore Where Score<60 order by CourseId Desc--38、查询课程编号为003且课程成绩在80分以上的学⽣的学号和姓名;Select StuId,StuName From tblStudentWhere StuId in(Select StuId From tblScore Where CourseId='003' And Score>=80)--39、求选了课程的学⽣⼈数Select 选了课程的学⽣⼈数=Count(*) From tblStudent st Where StuId IN (Select StuID From tblScore)--40、查询选修“叶平”⽼师所授课程的学⽣中,成绩最⾼的学⽣姓名及其成绩Select CourseId,CourseName,该科最⾼学⽣=(Select StuName From tblStudent Where StuId in (Select Top 1 StuID From tblScore Where CourseId=cs.CourseId Order by Score Desc)),成绩=(Select Top 1 Score From tblScore Where CourseId=cs.CourseId Order by Score Desc)From tblCourse cs Inner Join tblTeacher tc ON cs.TeaId=tc.TeaIdWhere TeaName='叶平'--41、查询各个课程及相应的选修⼈数Select 课程ID=CourseId,选修⼈数=(Select Count(*) From (Select Distinct StuId From tblScore Where CourseId=cs.CourseId) as tmp) From tblCourse cs--42、查询不同课程成绩相同的学⽣的学号、课程号、学⽣成绩Select 学号=StuId, 课程号=CourseId, 成绩=Score From tblScore scWhere Exists (Select * From tblScore Where Score=sc.Score And StuId=sc.StuId And CourseId <>sc.CourseId)Order by 学号,成绩--43、查询每门功成绩最好的前两名Select 课程号=CourseId,第1名=(Select Top 1 StuId From tblScore Where CourseId=cs.CourseId Order by Score DESC),第2名=(Select Top 1 StuID From (Select Top 2 StuId,Score From tblScore Where CourseId=cs.CourseId Order by Score DESC) as tmp Order by Score)From tblCourse cs--44、统计每门课程的学⽣选修⼈数(超过10⼈的课程才统计)。
SQL数据库实验和参考答案
![SQL数据库实验和参考答案](https://img.taocdn.com/s3/m/e5fc99a7284ac850ad024244.png)
数据库实验和参考答案上机实验七1.声明一个字符串型的局部变量,并对其赋值:‘我的变量’,然后显示出此值。
declare @a char(10)set @a='我的变量'--select @a as 变量的值print @a2.编程实现如下功能:1)声明两个整形的局部变量:@i1和@i2,对@i1赋初值:10,@i2的值为:@i1乘以5,再显示@i2的结果值。
declare @i1 int,@i2 intset @i1=10set @i2=@i1*5print @i22)用While语句实现5000减1,减2,……一直减到50的计算,并显示最终的结果。
declare @sum int,@i intset @sum=5000set @i=1while(@i<=50)beginset @i=@i+1endprint @sum3)输出100以内的素数。
declare @i smallint,@jsmallint,@k smallintset @i=2while(@i<=100)beginset @k=0set @j=2while(@j<@i)beginif(@i%@j=0)beginset @j=@Iendset @j=@j+1endif @k=0print @Iset @i=@i+1end4)将字符数在20以内的字符串变量C的值逆序输出。
要求输出界面为:declare @i varchar(20),@j int,@k varchar(20)set @j=1set @k=''while @j<=len(@i)beginset @k=substring(@i,@j,1) set @j=@j+1endprint '字符串C的值:'+@iprint 'C的逆序字符串:'+@k5)从SC表中查询所有学生的选课成绩情况,分别统计各分数段人数,并输出统计结果。
oracle实验6 sql高级查询
![oracle实验6 sql高级查询](https://img.taocdn.com/s3/m/0144556ddd3383c4bb4cd2ef.png)
oracle实验6 sql高级查询一、实验目的1.掌握SELECT语句的多表连接查询。
2.掌握SELECT语句的子查询。
二、实验内容完成第六章实验和习题内容三、实验环境Windows xp , Oracle 10g四、实验步骤(一)根据Oracle数据库scott方案下的emp表和dept表,完成下列操作:1.查询所有工种为CLERK的员工的姓名及其部门名称。
select ename,dnamefrom scott.emp t1 inner join scott.dept t2 on t1.deptno=t2.deptnowhere job='CLERK';2.查询所有部门及其员工信息,包括那些没有员工的部门。
select * from scott.emp t1 right join scott.dept t2 on t1.deptno=t2.deptno3.查询所有员工及其部门信息,包括那些还不属于任何部门的员工。
select * from scott.emp t1 left join scott.dept t2 on t1.deptno=t2.deptno4.查询在SALES部门工作的员工的姓名信息。
用子查询实现:select * from scott.empwhere deptno=(select deptno from scott.dept where dname='SALES')用连接查询实现:select * from scott.emp t1 inner join scott.dept t2 on t1.deptno=t2.deptnowhere t2.dname='SALES';注意两种实现方式,在行和列上的变化。
5.查询所有员工的姓名及其直接上级的姓名。
select t1.ename as 员工姓名,t2.ename 经理姓名from scott.emp t1,scott.emp t2where t1.mgr=t2.empno;6.查询入职日期早于其上级领导的所有员工的信息。
SQL-06高级查询
![SQL-06高级查询](https://img.taocdn.com/s3/m/8ad0daef5ef7ba0d4a733b46.png)
练习6 复杂的结构化查询语句6.1 上机目的1、掌握SELECT语句的统计函数的作用和使用方法2、通过练习SELECT语句的GROUP BY和ORDER BY字句的用法,理解其作用,掌握语句的写法。
3、通过练习涉及多张表的连接查询,掌握它的作用和写法6.2 上机练习预备知识点说明:①函数中DISTINCT的作用是统计计算的过程中去掉重复值。
②函数中ALL的作用是统计计算全部的值包括重复值。
可省略。
6.2.2 GROUP BY 子句作用:将记录根据GROUP BY后所跟字段的值分成多个组,进行分组计算。
一般情况GROUP BY 子句与汇总函数连用。
格式:GROUP BY(字段,…n)例14 按照班级把学生信息表的数据分组,并且统计每个班级的人数分析:Students表中班级人数这一列,因此需要计算才能得到。
因此需要先按class分组,class列中有几个不同的值就要分成几组,再按各组进行统计计算。
SELECT class,人数= count(*)FROM StudentsGROUP BY class注意:①分组也可以根据多个字段;②不能对数据类型为ntext,text,image或bit的字段使用GROUP BY1、HAVING 子句作用:HAVING子句将对GROUP BY 子句选择出来的结果进行再次筛选,最后输出符合HAVING 子句条件的结果。
HAVING子句必须与GROUP BY子句连用。
例15 查询平均入学总分在350分以上的班级分析:Students表中没有平均分这一列,因此需要计算才能得到。
因此需要先按class分组,class列中有几个不同的值就要分成几组,再进行统计计算,最后用HAVING子句筛选出AVG(mgrade) >=350的记录。
SELECT class,AVG(mgrade)FROM StudentsGROUP BY classHAVING AVG(mgrade)>=3502、ALL关键字作用:暂时忽略WHERE子句中的查询条件。
SQL查询语言高级应用测试
![SQL查询语言高级应用测试](https://img.taocdn.com/s3/m/31a069980d22590102020740be1e650e52eacfad.png)
SQL查询语言高级应用测试(答案见尾页)一、选择题1. SQL中,用于修改查询结果的命令是()。
A. SELECTB. UPDATEC. DELETED. ALTER2. 在SQL中,若要修改表结构,应该使用()。
A. CREATEB. ALTERC. DROPD. UPDATE3. SQL查询语句中,用于分组查询结果的是()。
A. GROUP BYB. ORDER BYC. HAVINGD. DISTINCT4. 在SQL中,若要删除一个表,应该使用()。
A. DROP TABLEB. DELETE TABLEC. DELETED. TRUNCATE TABLE5. SQL查询中,用于筛选满足特定条件的记录的关键字是()。
A. WHEREB. FORC. WHILED. EACH6. 在SQL中,若要修改列的数据类型,应该使用()。
A. ALTER TABLEB. CREATE TABLEC. DROP COLUMND. MODIFY COLUMN7. SQL查询中,用于排序查询结果的是()。
A. ORDER BYB. GROUP BYC. DISTINCTD. HAVING8. 在SQL中,若要查看表的结构,应该使用()。
A. DESCRIBEB. SHOW TABLESC. LOOKUP TABLED. INFO TABLE9. SQL查询中,用于分组的命令是()。
A. ORDER BYB. GROUP BYC. DISTINCTD. HAVE10. 在SQL中,若要插入新的记录,应该使用()。
A. INSERT INTOB. REPLACE INTOC. CREATED. PUT11. SQL查询语言中,用于排序查询结果的是哪个关键字?A. ORDER BYB. GROUP BYC. DISTINCTD. HAVING12. 在SQL中,为了修改表结构,应使用哪种关键字?A. ALTER TABLEB. CREATE TABLEC. DELETE TABLED. RENAME TABLE13. SQL查询语句中,用于筛选满足某个条件的记录的关键字是哪个?A. WHEREB. WHILEC. FORD. EACH14. 在SQL的聚合函数中,用于计算所有记录的平均值的是哪个函数?A. SUMB. AVGC. COUNTD. MAX15. SQL查询中的子查询是指什么?A. 一个包含SQL查询的查询B. 一个嵌套在主查询中的查询C. 一个SELECT查询语句D. 一个包含WHERE子句的查询16. 在SQL中,用于分组查询结果的是哪个关键字?A. GROUP BYB. ORDER BYC. DISTINCTD. HAVING17. SQL查询中,用于指定查询结果返回的列数的关键字是哪个?A. SELECTB. FROMC. WHERED. ALL18. 在SQL的聚合函数中,用于计算查询结果中某个字段的总和的是哪个函数?A. SUMB. AVGC. COUNTD. MAX19. SQL查询中,用于限制查询结果数量的关键字是哪个?A. LIMITB. OFFSETC.哥哥D.妹妹20. 在SQL查询中,用于将查询结果按照指定的顺序排列的关键字是哪个?A. ORDER BYB. GROUP BYC. DISTINCTD. HAVING21. SQL中,用于修改查询结果的命令是什么?A. DELETEB. UPDATEC. INSERT INTOD. ALTER TABLE22. 在SQL中,如何使用子查询来更新主表的数据?A. 将子查询的结果直接赋值给主表的某个字段B. 使用子查询来更新主表的条件C. 将子查询的结果作为另一个查询的筛选条件D. 将子查询的结果与主表的数据进行交集运算23. 什么是SQL注入攻击?它如何发生?A. SQL注入攻击是通过在SQL查询中插入恶意的SQL代码,导致执行非预期的SQL 语句B. SQL注入攻击发生在应用程序没有正确过滤用户的输入C. SQL注入攻击可以通过电子邮件发送恶意链接来传播D. SQL注入攻击是由于应用程序使用的是旧的SQL版本24. 在SQL中,如何使用联合查询来合并两个或多个数据表的信息?A. 使用INNER JOINB. 使用LEFT JOINC. 使用RIGHT JOIND. 使用FULL OUTER JOIN25. 什么是SQL视图?它有哪些优点和限制?A. SQL视图是一个虚拟表,它包含了查询结果B. 视图可以用来简化复杂的查询逻辑C. 视图可以用来实现数据的加密D. 视图具有数据完整性的约束,不能修改26. 在SQL中,如何使用事务来保证数据的完整性和一致性?A. 将多个SQL语句包装在一个事务中B. 使用COMMIT和ROLLBACK命令来管理事务C. 使用SET TRANSACTION ISOLATION LEVEL命令来设置事务隔离级别D. 使用SELECT语句来查看事务的状态27. 什么是SQL索引?它如何提高查询性能?A. SQL索引是一个存储在磁盘上的表格,用于加速数据的查找B. 索引可以按照指定的列进行排序C. 索引可以加快查询速度,但会降低写入性能D. 索引可以用来唯一标识表中的每一行数据28. 在SQL中,如何使用分组函数(如SUM)来统计查询结果?A. 将查询结果按照指定的列进行分组B. 使用GROUP BY子句来对查询结果进行分组C. 使用HAVING子句来过滤分组后的结果D. 使用ORDER BY子句来对分组结果进行排序29. 什么是SQL触发器?它在数据库中的作用是什么?A. SQL触发器是一种数据库对象,用于自动执行响应特定事件的操作B. 触发器可以在数据库中实现复杂的业务逻辑C. 触发器可以用来强制数据完整性D. 触发器只能在SQL Server中存在30. 在SQL中,如何使用外键来维护表之间的关系?A. 在表中添加一个字段,该字段引用另一个表的主键B. 在表中添加一个字段,该字段引用另一个表的外键C. 在表中添加一个字段,该字段引用另一个表的唯一键D. 在表中添加一个字段,该字段引用另一个表的所有键31. SQL中用于数据查询的命令是?A. SELECTB. INSERTC. UPDATED. DELETE32. 在SQL中,若要修改表结构,应该使用哪种命令?A. ALTER TABLEB. CREATE TABLEC. DROP TABLED. MODIFY TABLE33. SQL语言中的子查询是指?A. 一个包含SELECT语句的查询B. 一个包含FROM子句的查询C. 一个包含WHERE子句的查询D. 一个不包含任何子句的查询34. 在SQL中,用于分组查询结果的命令是?A. GROUP BYB. ORDER BYC. HAVINGD. DISTINCT35. SQL中的聚合函数不包括以下哪个?A. COUNTB. SUMC. AVGD. MAX36. 在SQL中,用于连接两个表的命令是?A. JOINB. UNIONC. CROSS JOIND. INNER JOIN37. SQL中,用于筛选满足特定条件的查询结果的是?A. WHERE子句B. HAVING子句C. BETWEEN关键字D. LIKE关键字38. 在SQL中,用于插入数据的命令是?A. INSERT INTOB. CREATE TABLEC. UPDATED. DELETE39. SQL中的视图(View)是一种虚拟表,其功能包括?A. 查看表中的数据B. 修改表中的数据C. 创建表D. 删除表40. 在SQL中,用于删除表中数据的命令是?A. DROP TABLEB. DELETEC. TRUNCATE TABLED. CASCADE二、问答题1. 什么是SQL查询中的SELECT语句?它的主要功能是什么?2. 如何在SQL查询中使用WHERE子句来过滤结果?3. 什么是SQL的聚合函数?它们有哪些用途?4. 在SQL查询中,如何使用JOIN子句来连接不同的表?5. 什么是SQL的子查询?它有什么特点?6. 如何在SQL查询中使用CASE语句来进行条件判断?7. 什么是SQL的透视表?它的作用是什么?8. 如何在SQL查询中使用ORDER BY子句对结果进行排序?参考答案选择题:1. B2. B3. A4. A5. A6. D7. A8. A9. B 10. A11. A 12. A 13. A 14. B 15. B 16. A 17. D 18. A 19. A 20. A21. B 22. C 23. A 24. A 25. AB 26. B 27. ACD 28. ABC 29. ABC 30. A31. A 32. A 33. A 34. A 35. D 36. D 37. A 38. A 39. AB 40. B问答题:1. 什么是SQL查询中的SELECT语句?它的主要功能是什么?SELECT语句是SQL查询的核心,用于从数据库表中检索数据。
sql查询举例(含答案)(2021年整理精品文档)
![sql查询举例(含答案)(2021年整理精品文档)](https://img.taocdn.com/s3/m/05694dbc312b3169a551a4a6.png)
sql查询举例(含答案)编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(sql查询举例(含答案))的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为sql查询举例(含答案)的全部内容。
查询练习一、简单查询(无条件查询):1、查询“学生档案”表中所有的记录SELECT * FORM 学生档案2、查询“学生档案”表中全体学生的姓名、学号、家庭地址SELECT 姓名,学号,家庭地址 FROM 学生档案二、有条件查询1、查询“成绩管理”表中语文成绩在80分以下的学生的学号。
SELECT 学号 FROM 成绩管理 WHERE 语文<802、查询“成绩管理”表中语文成绩在80分到90分之间的学生的学号,语文,数学,英语成绩。
SELECT 学号,语文,数学,英语FROM成绩管理WHERE 语文 >= 80 AND 语文<=90==(语文 BETWEEN 80 AND 90)3、查询“成绩管理”表中数学成绩不在75分到85分之间的学生的学号,语文,数学,英语成绩.SELECT 学号,语文,数学,英语FROM 成绩管理WHERE 数学 NOT BETWEEN 75 AND 854、查询“学生档案”表中李成刚,刘艺梅,郑莉三名学生的信息。
SELECT *FROM 学生档案WHERE 姓名 IN (“李成刚”,“刘艺梅",“郑莉”)==(姓名 =“李成刚” OR 姓名=“刘艺梅” OR 姓名=“郑莉”)5、查询“学生档案"表中所有姓张的学生的姓名、学号和性别SELECT 姓名,学号,性别 FROM学生档案WHERE 姓名 LIKE “张*"6、查询“学生档案”表中所有姓张且全名为三个汉字的学生的姓名SELECT 姓名FROM 学生档案WHERE姓名 LIKE “张??"7、查询“学生档案"表中第二个字符为“建"字的学生的学号和姓名SELECT 学号,姓名FROM 学生档案WHERE姓名 LIKE “?建*”8、查询“学生档案”表中家庭住址为“人民路"和“育才路"的学生学号,姓名,性别和家庭住址.SELECT 学号,姓名,性别,家庭住址FROM 学生档案WHERE家庭住址 LIKE “人民路*" OR家庭住址 LIKE “育才路*"9、查询“学生档案”表中所有团员的学生班级和姓名.SELECT 班级,姓名FROM 学生档案WHERE是否团员=yes10、查询“学生档案”表中1995年4月1日以前出生,女同学或团员的学生记录。
sql查询题目及答案
![sql查询题目及答案](https://img.taocdn.com/s3/m/887eb057d15abe23492f4d88.png)
数据库中有如下三个表:学生表(学号id,姓名name,性别sex,系部depart,年龄age)8个学生记录选课表(学号id,课程号cid,成绩grade) 12门课程课程表(课程号cid,课程名cname,学分Ccredit) 6门课程1.从学生表中查询所有同学的所有信息select*from学生表2.从学生表中查询所有学生的信息,并分别赋予一个别名select学号as xuehao,姓名as xingming,性别as xingbie,系部as xibu,年龄as nianling from学生表3.从学生表中查询姓名是Allen的学生的信息select*from学生表where姓名='Allen'4.从学生表中查询学号在1101到1199之间的所有学生的信息select*from学生表where学号between 1101 and 11995.从学生表中查询年龄小于18和大于20的所有学生的学号和姓名select学号,姓名from学生表where年龄<18 or年龄>206.从学生表中查询计算机系年龄小于20的所有学生的信息select*from学生表where系部='computer'and年龄<207.从学生表中查询姓名以A开头的学生的信息select*from学生表where姓名LIKE'A%'8.从学生表中查询姓名的第三个字符是A的学生的学号和姓名select学号,姓名from学生表where姓名LIKE'__A%'9.从学生表中查询姓名中包含“llen”的学生的学号和姓名select学号,姓名from学生表where姓名LIKE'%llen%'10.从学生表中查询姓名中包含“llen”且姓名只有5个字符的学生的学号和姓名select学号,姓名from学生表where姓名LIKE'%llen%'and len(姓名)=511.从学生表中查询有年龄信息的学生的学号和姓名select学号,姓名from学生表where年龄is not null12.从学生表中查询最大年龄和最小年龄select max(年龄)最大年龄,min(年龄)最小年龄from学生表13.从学生表中查询所有学生的平均年龄select avg(年龄)平均年龄from学生表14.从学生表中查询学校所有系的名字select distinct系部from学生表15.从学生表中查询学校共有多少个系select count(distinct系部)系部总和from学生表16.从选课表中查询所有学生的选课情况select distinct课程号from选课表17.从选课表中查询选修课程号为C01课程的学生的学号select学号from选课表where课程号='C01'18.从选课表中查询所有没有选C02课程的学生的学号select distinct学号from选课表where课程号!='C02'19.从选课表中查询有选修C01或C02课程的学生的学号select distinct学号from选课表where课程号='C01' or 课程号='C02'20.从选课表中查询学号为1101的学生的选课情况select课程号from选课表where学号='1101'21.从选课表中查询所有选课信息,即学号、课程号、成绩,并给成绩加8分select学号,课程号,成绩=成绩+8 from选课表22.从选课表中查询学号为1101的学生的所有选修课程成绩的总和select sum(成绩)成绩总和from选课表where学号='1101'23.从选课表中查询选修课程好为C02所有学生的成绩平均值并赋予“平均成绩”列名select avg(成绩)平均成绩from选课表where课程号='C02'24.从选课表中查询选修课程号C02且该门课程考试及格的学生的学号select学号from选课表where课程号='C02'and成绩>=6025.从选课表中查询所有无考试成绩的学生的学号和课程的课程号select学号,课程号from选课表where成绩is null26.从选课表中查询选修了课程号以C开头的学生的学号和所选课程的课程号select学号,课程号from选课表where课程号LIKE'C%'27.从选课表中查询选修了课程号以C、D或E开头学生的学号和所选课程的课程号select学号,课程号from选课表where课程号LIKE'[CDE]%'28.从选课表中查询选修了课程号中包含DB的学生的学号和课程号select学号,课程号from选课表where课程号LIKE'%DB%'29.从选课表中查询选修了课程的学生的学号select distinct学号from选课表where课程号is not null30.从选课表中查询选修了课程的学生的人数select count(distinct学号)总人数from选课表31.找出姓名以D开头的学生姓名和所有成绩select学生表.姓名,选课表.成绩from学生表join选课表on学生表.学号=选课表.学号where学生表.姓名LIKE'D%'32.查找的所有学生姓名与学号,结果按学号降序排序select 学号,姓名from学生表order BY学号DESC33.查找成绩介于80和90之间的学生姓名,结果按成绩和姓名升序排序select学生表.姓名from选课表join学生表on学生表.学号=选课表.学号where选课表.成绩between 80 and 90order BY选课表.成绩,学生表.姓名34.查找english系的所有学生姓名,结果按成绩和姓名升序排序select学生表.姓名,学生表.学号,选课表.成绩from选课表join学生表on学生表.学号=选课表.学号where学生表.系部='english'35.查找同时选修了C01及C02两门课程的学生姓名及学号select学生表.姓名,A.学号from选课表as A join选课表as B on A.学号=B.学号join学生表on学生表.学号=A.学号where A.课程号='C01'and B.课程号='C02'36.查找所有选修了课程的学生姓名及所在系别select distinct学生表.姓名,学生表.系部from学生表join选课表on学生表.学号=选课表.学号where选课表.课程号is not null37.查找成绩高于90分的学生姓名、学号及系别select学生表.姓名,学生表.学号,学生表.系部from学生表join选课表on学生表.学号=选课表.学号where选课表.成绩>=9038.找出选修了C01课程的学生姓名select学生表.姓名from学生表join选课表on学生表.学号=选课表.学号where选课表.课程号='C01'39.查询English系学生人数select count(*) English 系总人数from学生表where系部='English'40.分别查询各系的学生人数select系部,count(*)人数from学生表group by系部41.创建一个角色uus.CREATE ROLE uus;42.给uus授权SELECT,UPDATE,INSERT .GRANT SELECT,UPDATE,INSERTON StuTO uus43.增加一个登录,登录名为tp,密码为123,默认的数据库为stuEXEC sp_addlogin 'tp', '123', 'stu'44.将登录tp增加为test库的一个用户,并连接到test库。
实验6 SQL 查询附答案
![实验6 SQL 查询附答案](https://img.taocdn.com/s3/m/48aead25453610661ed9f49d.png)
实验六SQL 查询一、实验目的:1.熟练掌握SELECT语句的语法格式2.掌握联接的几种方法3.掌握子查询的表示和执行4.能够对SELECT查询结果进行分组、排序及统计5.能够运用T-SQL语句对表进行数据的插入、修改、删除6.能够通过导入/导出向导进行数据的导入导出二、实验内容:利用实验四中的数据库做如下操作:1.在“学生表”中,找出性别为“男”的学生记录,字段包括“姓名”、“出生日期”和“专业”。
2.在“课程表”中,找出“课程名”中包含“计算机”三个字的课程。
3.在“成绩表”中,找出“课程编号”为“001”的课程成绩前三名学生。
4.在“成绩表”、“学生表”和“课程表”中,找出“课程编号”为“001”的课程成绩在[80,90]之间的学生的姓名、课程名和成绩。
5.在“学生表”中,找出“专业”为“计算机软件”、“电子商务”专业的学生信息。
6.统计“计算机应用基础”课程的平均分。
7.查找各门课程的修课人数。
8.在“成绩表”中,找出课程编号为“001”的这门课程的所有学生的分数以及最高分、最低分和平均分。
9.找出所有女生的“计算机应用基础”这门课的成绩,包括字段:姓名、课程名、成绩。
10.查找“成绩表”中,课程编号为“001”的成绩高于平均分的所有学生的学号、姓名、课程名和成绩。
11.查找“成绩表”中,高于各门课程平均分的学生信息。
12.查找“课程表”中,没有被学生修课的课程信息。
13.将“课程表”中的课程编号为“001”的学分增加1学分。
14.删除学号为“20030101”学生的相关信息。
三、实验过程:启动“查询分析器”,在其文本窗口中输入相应的Transcat-SQL语句,分析并执行,观察输出结果。
1.Use 学生select 姓名,出生日期,专业 from 学生表 where 性别='男'2.use 学生select * from 课程表 where 课程名 like '%计算机%'3.use 学生select top 3 * from 成绩表 where 课程编号='001' order by 成绩 desc4.Use 学生select a.姓名,c.课程名,b.成绩 from 学生表 as a join 成绩表 as b on b.课程编号=001 and a.学号=b.学号 and b.成绩 between 80 and 90join 课程表 as c on c.课程编号=b.课程编号select * from 学生表 where 专业 in ('计算机软件','电子商务')6.use 学生select avg(成绩)as 平均成绩 from 成绩表 as a join 课程表 as bon b.课程名='计算机应用基础' and b.课程编号=a.课程编号select 课程编号,count(学号)as 修课人数 from 成绩表 group by 课程编号8.use 学生select * from 成绩表 where 课程编号=001compute max(成绩),min(成绩),avg(成绩)9.use 学生select a.姓名,b.课程名,c.成绩 from 学生表 as a join 成绩表 as con a.学号=c.学号 and a.性别='女'join 课程表 as bon b.课程编号=c.课程编号 and b.课程名='计算机应用基础'10.use 学生select a.学号,a.姓名,b.课程名,c.成绩 from 课程表 as b join 成绩表 as c on b.课程编号=c.课程编号 and c.课程编号=001 and c.成绩>(select avg(成绩) from 成绩表 where c.课程编号=001)join 学生表 as a on a.学号=c.学号select * from 成绩表 as a where 成绩>(select avg(成绩) from 成绩表 as b where a.课程编号=b.课程编号)12.use 学生select * from 课程表 where not exists(select * from 成绩表 where 成绩表.课程编号=课程表.课程编号)13.use 学生update 课程表 set 学分=学分+1 where 课程编号=001delete 成绩表 where 学号='20030101'。
sql实验习题答案
![sql实验习题答案](https://img.taocdn.com/s3/m/275ec22b24c52cc58bd63186bceb19e8b8f6ec37.png)
sql实验习题答案SQL实验习题答案在学习SQL(Structured Query Language)时,习题是一种非常有效的学习方式。
通过实践操作,我们可以更好地理解SQL语言的各种概念和用法。
下面是一些常见的SQL实验习题及其答案,希望对大家的学习有所帮助。
1. 查询某个表的所有数据答案:SELECT * FROM 表名;2. 查询某个表的前n行数据答案:SELECT * FROM 表名 LIMIT n;3. 查询某个表中满足某个条件的数据答案:SELECT * FROM 表名 WHERE 条件;4. 查询某个表中某个字段的最大值答案:SELECT MAX(字段名) FROM 表名;5. 查询某个表中某个字段的最小值答案:SELECT MIN(字段名) FROM 表名;6. 查询某个表中某个字段的总和答案:SELECT SUM(字段名) FROM 表名;7. 查询某个表中某个字段的平均值答案:SELECT AVG(字段名) FROM 表名;8. 查询某个表中某个字段的记录数答案:SELECT COUNT(字段名) FROM 表名;9. 查询某个表中某个字段的记录数,并按照字段值进行分组答案:SELECT 字段名, COUNT(字段名) FROM 表名 GROUP BY 字段名;10. 查询某个表中满足多个条件的数据答案:SELECT * FROM 表名 WHERE 条件1 AND 条件2;11. 查询某个表中满足多个条件中的任意一个条件的数据答案:SELECT * FROM 表名 WHERE 条件1 OR 条件2;12. 查询某个表中满足某个条件,并按照某个字段进行排序的数据答案:SELECT * FROM 表名 WHERE 条件 ORDER BY 字段名;13. 查询某个表中满足某个条件,并限制结果的行数答案:SELECT * FROM 表名 WHERE 条件 LIMIT n;14. 查询某个表中满足某个条件,并跳过前n行的数据答案:SELECT * FROM 表名 WHERE 条件 OFFSET n;15. 查询某个表中满足某个条件,并按照某个字段进行分页显示答案:SELECT * FROM 表名 WHERE 条件 ORDER BY 字段名 LIMIT n OFFSET m;这些习题涵盖了SQL语言的基本操作和常用函数。
实验6:SQL高级查询
![实验6:SQL高级查询](https://img.taocdn.com/s3/m/d6f0925cf01dc281e53af032.png)
实验六高级查询【实验目的与要求】1、熟练掌握IN子查询2、熟练掌握比较子查询(尤其要注意ANY、ALL谓词如何用集函数代替)3、熟练掌握EXISTS子查询(尤其是如何将全称量词和逻辑蕴含用EXISTS谓词代替)4、熟练掌握复杂查询的select语句【实验准备】1.准备好测试数据2.熟悉多表查询与嵌套查询的用法。
【实验内容】5.1.嵌套子查询以下实验在前面实验中创建的CPXS数据库中完成,请根据前面实验创建的表结构和数据,完成如下嵌套查询:(也可以不按指导书给出的思路写查询语句,只要是正确的即可,有疑问时可以和同学及老师商量你的查询语句是否正确)查询在2004年3月18日没有销售的产品名称(不允许重复)。
用IN子查询:写出对应SQL语句并给出查询结果:select distinct 产品名称from CPwhere 产品编号 not in(select 产品编号from CPXSBwhere 销售日期='2004-3-18');用EXISTS子查询:写出对应SQL语句并给出查询结果:select 产品名称from CPwhere not exists(select 产品编号from CPXSBwhere 销售日期='2004-3-12'and CP.产品编号=CPXSB.产品编号)select distinct 产品名称from CPwhere 产品名称!=all(select 产品名称from CPwhere exists(select 产品编号from CPXSBwhere 销售日期='2004-03-18' andCP.产品编号=CPXSB.产品编号))查询名称为“家电市场”的客户在2004年3月18日购买的产品名称和数量。
用IN子查询:写出对应SQL语句并给出查询结果:select 产品名称,数量from CPXSB left join CP on(CPXSB.产品编号=CP.产品编号)where 客户编号 in(select 客户编号from XSSwhere 客户名称='家电市场')and 销售日期='2004-03-18'用EXISTS子查询:写出对应SQL语句并给出查询结果:select 产品名称,数量from CPXSB left join CP on(CPXSB.产品编号=CP.产品编号)where CPXSB.客户编号 =(select 客户编号from XSSwhere 客户名称='家电市场')and exists(select distinct 产品名称from CPwhere 销售日期='2004-03-18' andCP.产品编号=CPXSB.产品编号)查询销售量大于所有2004年3月18日销售的各产品销售数量的产品编号。
sql高级查询
![sql高级查询](https://img.taocdn.com/s3/m/edc11e325a8102d276a22fac.png)
transact---sql高级查询(上)点击数:1518 发布日期:2006-4-28 17:32:00 【评论】 【打印】 【编程爱好者论坛】 【关闭】transact---sql高级查询(上)1:多表的查询和笛卡儿积2:表格别名的用法3:使用sql server的统计函数4:用group by子句实现分组的查询A:多表查询和笛尔儿积到目前为止,我们所用的都是单个表查询,但是在更多的情况的下,需要对多个表进行同时查询,这时可以把多个表的名字全部填写在from子句中.比如:查询出每个职工的姓名,学历,所在部门名称.由于我们需要的结果来自于两个表,所以必须用多表查询select 姓名,学历,部门名称,负责人 from work,部门 [分析为什么是错误的] 原因:问题出在对表格连接条件的限制上.在上面的语句中,没能对表格连接条件作任何限制,所以sql会在work表中每取出一条记录,就与部门表中的所有记录组合一次,那么假设wor k表有m条记录,而部门表中有n条记录,则得出的结果为m*n条记录这就是笛尔儿积,所以笛尔儿积返回的大多数的结果是冗余的、无用的,所以应该避免笛尔儿积的产生.解决笛尔儿积的方法:事实上由于笛尔儿积是因为两个表的连接条件没有限制造成的,所以只要我们对两个表的连接进行条件限制,就可以避免笛尔儿积的产生.可以通过一个where子句,来连接两个表的公共的字段就可以了.所以将上面的语句改成:select 姓名,学历,部门名称,负责人 from work,部门 where wo rk.部门编号=部门.部门编号B:使用表格的别名A:当使用多个表进行查询时,如果有两个表中有相同的列,应该指明选中的是哪个表中的列. 比如:在work表检索出在address表中都有的职工的职工号,姓名,学历,基本工资select 职工号,姓名,学历,基本工资 from work,address where work.职工号=a ddress.职工号上面的语句是错误的,原因是对于work和address表都有职工号,姓名列,所以应该指明是哪个表的职工号和姓名.改成:select work.职工号,work.姓名,学历,基本工资 from work,address where wor k.职工号=address.职工号或者:select address.职工号,address.姓名,学历,基本工资 from work,address whe re work.职工号=address.职工号想一想:为什么对于学历,基本工资没有指明表名:即:work.学历,work.基本工资[只有一个表有这些列]B:允许使用别名来访问表. 格式:1:表名 as 别名 2:表名 别名例如:上面的语句可改写成:Y FSOF TWA REC O.,LT Dselect w.职工号,w.姓名,学历,基本工资 from work as w,address as a where w.职工号=a.职工号上面的语句中在from中引用两个表,并且为表work指明了别名w,为表address指明了别名a,所以就可以用w来代表work表,用a来代表address表.或者省略as直接改成:select w.职工号,w.姓名,学历,基本工资 from work w,address a where w.职工号=a.职工号 C:如果使用了别名,则以后所有查询语句中,都必须使用别名列比如:select work.职工号,work.姓名,学历,基本工资 from work w,address a where w.职工号=a.职工号 [是错误的]C:使用统计函数:sql跟我们提供了以下几个统计函数: sum:返回一个数字列的总和 avg:对一个数字列求平均值 min:对一个数字列求最小值 max:对一个数字列求最大值count:返回满足select语句中指定的条件的记录个数 举列:1:求出work表中所有男职工的基本工资的和select sum(基本工资) as 性别为男的基本工资 from work where 性别=\'男\'2:求出work表中所有职称是经理的最高工资和最低工资,平均工资select max(基本工资) as 最高工资,min(基本工资) as 最低工资,avg(平均工资) as 平均工资 from work3:与统计函数一起使用distinct关键字[通常只与count函数使用] 例:1:检索出work表中学历的个数select count(学历) from work 2:检索出work表中学历的种类的个数select count(distinct 学历) from work试一试:select distinct count(学历) from work 可行否? 3:有work和部门表,检索出在销售部工作的员工的个数select \'销售部的人数\'=count(职工号) from work a,部门 b where a.部门编号=b.部门编号 and b.部门名称=\'销售部\' 4:在work表中检索出其基本工资小于职工平均工资的人数 select count(职工号) as 人数 from workwhere 基本工资<(select avg(基本工资) from work)5:有学科表和学费表,从学费表检索出有多少个学网页设计的人 select count(学号) as 网页设计的人数 from 学费 a,学科 b where a.所学专业代号=b.课程编号 and b.课程名称=\'网页设计\'D:使用group by子句对结果进行分类[只用于统计函数] 举列:1:检索出work表各职称的人数.select 职称,count(职称) as 职称人数 from work group by 职称 2:检索出各学历的平均工资.select 学历,avg(基本工资) from work group by 学历 3:有学科表和学费表,要求统计出各学科的学生数目.select 所学专业代号,count(所学专业代号) as 人数 into #abc from 学费Y FSOF TWA REC O.,LT Dgroup by 所学专业代号select 课程名称,人数 from #abc,学科 where 所学专业代号=课程编号 4:有职工表和商品销售表,要求检索出每个职工的职工号,姓名,销售总量.select 职工号,sum(销售量) as 销售总量 into #abcd from 商品销售 group by 职工号select 职工.职工号,姓名,销售总量 from 职工,#abcd where #abcd.职工号=职工.职工号5:查询出每个部门最高的基本工资,显示部门名称和最高基本工资 select 部门名称,max(基本工资) from work group by 部门名称 说明:1:在group by中不支持对列名的分配的别名select 学历 as 职工学历,count(学历) from work group by 职工学历 [错错]改为:select 学历 as 职工学历,count(学历) from work group by 学历2:select后面每一列数据除了在统计函数中的列以外都必须在group by子句出现比如:select 学历,性别,sum(基本工资) from work group by 学历[错错]改为:select 学历,性别,sum(基本工资) from work group by 学历,性别意义:各学历各性别的基本工资之和transact---sql高级查询(下)点击数:1714 发布日期:2006-4-28 17:33:00 【评论】 【打印】 【编程爱好者论坛】 【关闭】transact---sql高级查询(下)5:使用having关键字来筛选结果6:使用compute和compute by子句7:使用嵌套查询8:分布式查询E:使用having关键字来筛选结果当完成对数据结果的查询和统计后,可以使用having关键字来对查询和计算的结果进行一步的筛选例:检索出work表中学历是大专或者是中专的人数select 学历,count(学历) from work group by 学历 having 学历 in(\'大专\',\'中专\')说明:1:having关键字都与group by用在一起.Y FSOF TWA REC O.,LT D2:having不支持对列分配的别名例如:select 学历,\'大于5的人数\'=count(学历) from work group by 学历 having 大于5的人数>5 [错错]改为:select 学历,\'大于5的人数\'=count(学历) from work group by 学历 having count(学历)>5F:使用compute和compute by使用compute子句允许同时观察查询所得到各列的数据的细节以及统计各列数据所产生的汇总列select * from work [查询所得到的各列的数据的细节] compute max(基本工资),min(基本工资) [统计之后的结果]这个例子中没有使用by关键字,返回的结果是最后添加了一行基本工资的最大值和最小值,也可增加by关键字.例:select * from work order by 学历compute max(基本工资),min(基本工资) by 学历比较:select 学历,max(基本工资),min(基本工资) from work group by 学历 说明:1:compute子句必须与order by子句用在一起2:compute子句可以返回多种结果集.一种是体现数据细节的数据集,可以按分类要求进行正确的分类;另一种在分类的基础上进行汇总产生结果.3:而group by子句对每一类数据分类之后只能产生一个结果,不能知道细节G:使用嵌套查询查询中再查询,通常是以一个查询作为条件来供另一个查询使用 例:有work表和部门表A:检索出在部门表中登记的所有部门的职工基本资料select * from work where 部门编号 in [not in](select 部门编号 from d bo.部门)B:检索出在work表中每一个部门的最高基本工资的职工资料select * from work a where 基本工资=(select max(基本工资) from work b where a.部门名称=b.部门名称)说明:由外查询提供一个部门名称给内查询,内查询利用这个部门名称找到该部门的最高基本工资,然后外查询根据基本工资判断是否等于最高工资,如果是的,则显示出来. 相当于:select * from work,(select 部门名称,max(基本工资) as 基本工资 from work group by 部门名称 as t) where work.基本工资=t.基本工资 and work.部门名称=t.部门名称C:用嵌套work表和嵌套部门表,在嵌套work表中检索出姓名和职工号都在嵌套部门存在的职工资料select * from 嵌套work where 职工号 in (select 职工号 from 嵌套部门) and 姓名 in (select 姓名 from 嵌套部门) [察看结果,分析原因]改:select * from 嵌套work a,嵌套部门 b where a.职工号=b.职工号 and a.姓名=b.姓名改:select * from 嵌套work where 职工号=(select 职工号 from 嵌套部门) and 姓名=(select 姓名 from 嵌套部门) [行吗?为什么,分析原因?] 在嵌套中使用exists关键字[存在]Y FSOF TWA REC O.,LT D例:1:用嵌套work表和嵌套部门表,在嵌套work表中检索出姓名和职工号都在嵌套部门存在的职工资料select * from 嵌套work a where exists (select * from 嵌套部门 b where a.姓名=b.姓名 and a.职工号=b.职工号)2:在work表检索出在部门表没有的职工select * from work where not exists (select * from 部门 where 部门.部门编号=work.部门编号)能否改成:select * from work where exists (select * from 部门 where 部门.部门编号<>work.部门编号) 在列清单中使用select例:1:在work1表和部门表中检索出所有部门的部门名称和基本工资总和select 部门名称,(select sum(基本工资) from work1 b where a.部门编号=b.部门编号) from 部门 a2:检索各部门的职工人数select 部门编号,部门名称,(select count(职工号) from work1 a where a.部门编号=b.部门编号) as 人数 from 部门 b3:在商品表和销售表中查询每一职工的姓名,所属部门,销售总量 select 姓名,所属部门,(select sum(销售量) from 商品销售 a where a.职工号=b.职工号) as 销售总量 from 嵌套部门 bH:分布式查询我们以前的查询都只是基于一个服务器中的一个数据库的查询,如果一个查询是要跨越一个服务器,像这样的查询就是分布式查询,那么我们以看到分布查询就是数据源自于两个服务器.要进行分布式查询必须先创建一个“链接服务器”,以便让本地的用户能够映射到过程服务器.“链接服务器”的创立A:在“链接服务器”里面输入以后为了方便访问该链接服务器的名称[任意]B:在“提供程序名称”里面选择“Microsoft OLE DB Provider for SQL Server” C:在“数据源”里面输入服务器的网络名D:本地登录,远程用户和远程密码里面分别输入一个本地登录用户,远程登录和远程密码以便让本地SQL Server登录映射为链接服务器上的用户E:访问方法:格式:链接服务器的名称.数据库名.dbo.表名 链接服务器有两个特点:1:通过链接服务器不能删除链接源服务器的任何对像.2:能过链接服务器可以对链接源服务器的表进行insert,updae,delete操作.视图1:什么是视图2:视图和查询的区别3:视图的优点4:如何创建和管理视图Y FSOF TWA REC O.,LT D5:如何通过视图修改基本表的数据6:如何通过视图实现数据的安全性A:什么是视图:视图(view):从一个或几个基本表中根据用户需要而做成一个虚表1:视图是虚表,它在存储时只存储视图的定义,而没有存储对应的数据2:视图只在刚刚打开的一瞬间,通过定义从基表中搜集数据,并展现给用户B:视图与查询的区别:视图和查询都是用由sql语句组成,这是他们相同的地方,但是视图和查询有着本质区别:它们的区别在于:1:存储上的区别:视图存储为数据库设计的一部分,而查询则不是. 2:更新限制的要求不一样要注意:因为视图来自于表,所以通过视图可以间接对表进行更新,我们也可以通过update语句对表进行更新,但是对视图和查询更新限制是不同的,以下我们会知道虽然通过视图可以间接更新表但是有很多限制.3:排序结果:通过sql语句,可以对一个表进行排序,而视图则不行. 比如:创建一个含有order by子句的视图,看一下可以成功吗?C:视图的优点:为什么有了表还要引入视图呢?这是因为视图具有以下几个优点:1:能分割数据,简化观点可以通过select和where来定义视图,从而可以分割数据基表中某些对于用户不关心的数据,使用户把注意力集中到所关心的数据列.进一步简化浏览数据工作.2:为数据提供一定的逻辑独立性如果为某一个基表定义一个视图,即使以后基本表的内容的发生改变了也不会影响“视图定义”所得到的数据3:提供自动的安全保护功能视图能像基本表一样授予或撤消访问许可权.4:视图可以间接对表进行更新,因此视图的更新就是表的更新D:视图的创建和管理 视图的创建 1:通过sql语句格式:create view 视图名 as select 语句试一试:分别创建关于一个表或多个表的视图[因为视图可以来自于多表] 2:通过企业管理器说明:1:在完成视图的创立之后,就可以像使用基本表一样来使用视图 2:在创建视图时,并非所有的select子查询都可用如:compute和compute by,order by[除非与top一起连用] 3:但在查询时,依然都可以用在创建时禁用的select子查询4:在视图创建时,必须为没有标题列指定标题[思考:能否不用select语句来创建一个视图]视图的删除:1:通过sql语句:drop view 视图名 2:通过企业管理器Y FSOF TWA REC O.,LT D说明:与删除表不同的是,删除视图后只是删除了视图了定义,并没有删除表中的数据.[查看相关性]修改视图的定义 1:通过企业管理器 2:通过sql语句:格式:alter view 视图名 as 新的select语句浏览视图信息 sp_helptext 视图名 [查看视图创建的语句]E:如何通过视图修改基本表的数据. 1:在视图上使用insert语句通过视图插入数据与直接在表中插入数据一样,但视图毕竟不是基本表.因此在进行数据插入时还是有一定的限制1:如果视图上没有包括基本表中属性为not null[不能为空]的列,那么插入操作会因为那些列是null值而失败.2:如果某些列因为某些规则或约束的限制而不能直接接受从视图插入的列时,插入会失败3:如果在视图中包含了使用统计函数的结果,或是包含计算列,则插入操作会失败 4:不能在使用了distinct语句的视图中插入值 5:不能在使用了group by语句的视图中插入值2:使用update更新视图中的数据1:更新视图与更新表格一样,但是在视图中使用了多个基本表连接的情况下,每次更新操作只能更新来自基本表的一个数据列例如:创建以下视图:create view del asselect 职工号,姓名,部门名称,负责人 from work1,部门where work1.部门编号=部门.部门编号 如果再执行下面的语句时:update del set 职工号=\'001\',部门名称=\'wenda\' where 职工号=\'01\'[出现错误]只能够改成:update del set 职工号=\'001\' where 职工号=\'01\' update del set 部门名称=\'wenda\' where 职工号=\'01\' 2:不能在使用了distinct语句的视图中更新值 3:不能在使用了group by语句的视图中更新值3:使用delete删除视图中数据.通过视图删除数据最终体现为从基本表中删除数据 格式:delete 视图名 [where 条件]说明:当视图由两个以上的基表构成时,不允许删除视图的数据 例如:建一个视图kkcreate view kk asselect 职工号,姓名,性别,部门名称 from work1,部门 where work1.部门编号=部门.部门编号 [试着去删除]Y FSOF TWA REC O.,LT D如果不了解视图定义内容,则常常会发生向视图中输入不符合视图定义的数据的情况. 比如:create view xm asselect * from work where 性别=\'男\'完全可以插入insert xm values(\'001\',\'女\',23,\'2400\'....)尽管从意义上来说是不合理的,但是上述语句是正确的.为了防止这种情况的发生,可以使用with check option子句来对插入的或更改的数据进行限制. 比如:create view xm asselect * from work where 性别=\'男\' with check option使用schemabinding的视图[使用绑定到构架]我们知道视图是依赖于表,如果在一个表中创建一个视图,今后如果这个表被删除了,则这个视图将不可再用了.为了防止用户删除一个有视图在引用的表,可以在创建视图的时候加上s chemabinding关键字.比如:create view 基本工资 with SCHEMABINDING as select 姓名,性别,基本工资 from dbo.work 说明:1:不能使用“*”来创建此类型的视图2:创建此类型的视图时,一定要加上dbo.表名.3:如果在某个表中定义了此类视图,则用户将不能对表的结构进行修改,否则会删除这些绑定4:如果用户对表的结构进行列改名,则会删除绑定而且视图不可用.5:如果用户对表的结构进行列的类型或者大小修改,则会删除绑定但视图可用,此时用户可以删除视图所引用的表.使用with encryption对视图进行加密为了保护创建视图定义的原代码,可以对视图进行加密. 比如:create view kk with encryptionas select * from work where 职称=\'经理\' 用sp_helptext来查看一下.或用企业管理器查看一下. 说明:如果应用此项用户将无法设计视图F:使用视图加强数据的安全一般通过使用视图共有三种途径加强数据的安全性 A:对不同用户授予不同的使用权.B:通过使用select子句限制用户对某些底层基表的列的访问 C:通过使用where子句限制用户对某些底层基表的行的访问 对不同用户授予不同的权限Sql3大连接查询点击数:439 发布日期:2005-12-17 13:45:00 【评论】 【打印】 【编程爱好者论坛】 【关闭】Tag:sqlY FSOF TWA REC O.,LT D连接查询通过连接运算符可以实现多个表查询。
oracle实验6 sql高级查询
![oracle实验6 sql高级查询](https://img.taocdn.com/s3/m/0144556ddd3383c4bb4cd2ef.png)
oracle实验6 sql高级查询一、实验目的1.掌握SELECT语句的多表连接查询。
2.掌握SELECT语句的子查询。
二、实验内容完成第六章实验和习题内容三、实验环境Windows xp , Oracle 10g四、实验步骤(一)根据Oracle数据库scott方案下的emp表和dept表,完成下列操作:1.查询所有工种为CLERK的员工的姓名及其部门名称。
select ename,dnamefrom scott.emp t1 inner join scott.dept t2 on t1.deptno=t2.deptnowhere job='CLERK';2.查询所有部门及其员工信息,包括那些没有员工的部门。
select * from scott.emp t1 right join scott.dept t2 on t1.deptno=t2.deptno3.查询所有员工及其部门信息,包括那些还不属于任何部门的员工。
select * from scott.emp t1 left join scott.dept t2 on t1.deptno=t2.deptno4.查询在SALES部门工作的员工的姓名信息。
用子查询实现:select * from scott.empwhere deptno=(select deptno from scott.dept where dname='SALES')用连接查询实现:select * from scott.emp t1 inner join scott.dept t2 on t1.deptno=t2.deptnowhere t2.dname='SALES';注意两种实现方式,在行和列上的变化。
5.查询所有员工的姓名及其直接上级的姓名。
select t1.ename as 员工姓名,t2.ename 经理姓名from scott.emp t1,scott.emp t2where t1.mgr=t2.empno;6.查询入职日期早于其上级领导的所有员工的信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六高级查询
【实验目的与要求】
1、熟练掌握IN子查询
2、熟练掌握比较子查询(尤其要注意ANY、ALL谓词如何用集函数代替)
3、熟练掌握EXISTS子查询(尤其是如何将全称量词和逻辑蕴含用EXISTS谓词代替)
4、熟练掌握复杂查询的select语句
【实验准备】
1.准备好测试数据
2.熟悉多表查询与嵌套查询的用法。
【实验内容】
5.1.嵌套子查询
以下实验在前面实验中创建的CPXS数据库中完成,请根据前面实验创建的表结构和数据,完成如下嵌套查询:(也可以不按指导书给出的思路写查询语句,只要是正确的即可,有疑问时可以和同学及老师商量你的查询语句是否正确)
查询在2004年3月18日没有销售的产品名称(不允许重复)。
用IN子查询:
写出对应SQL语句并给出查询结果:
USE CPXS
SELECT产品名称
FROM CP
WHERE产品编号not IN
(SELECT产品编号FROM CPXSB WHERE销售日期='2004-3-12')
select distinct 产品名称
from CP
where 产品编号 not in
(
select 产品编号
from CPXSB
where 销售日期='2004-3-18'
);
用EXISTS子查询:
写出对应SQL语句并给出查询结果:
select distinct 产品名称
from CP
where 产品名称!=all
(
select 产品名称
from CP
where exists
(
select 产品编号
from CPXSB
where 销售日期!='2004-03-18' and
CP.产品编号=CPXSB.产品编号
)
)
查询名称为“家电市场”的客户在2004年3月18日购买的产品名称和数量。
用IN子查询:
写出对应SQL语句并给出查询结果:
select 产品名称,数量
from CPXSB left join CP on(CPXSB.产品编号=CP.产品编号)
where 客户编号 in
(
select 客户编号
from XSS
where 客户名称='家电市场'
)
and 销售日期='2004-03-18'
用EXISTS子查询:
写出对应SQL语句并给出查询结果:
select 产品名称,数量
from CPXSB left join CP on(CPXSB.产品编号=CP.产品编号)
where CPXSB.客户编号 =
(
select 客户编号
from XSS
where 客户名称='家电市场'
)
and exists
(
select distinct 产品名称
from CP
where 销售日期='2004-03-18' and
CP.产品编号=CPXSB.产品编号
)
查询销售量大于所有2004年3月18日销售的各产品销售数量的产品编号。
用ALL谓词:
写出对应SQL语句并给出查询结果:
select 产品编号
from CPXSB
where 数量>all(select 数量
from CPXSB
where 销售日期='2004-03-18'
)
用集函数:
写出对应SQL语句并给出查询结果:
select 产品编号
from CPXSB
group by 产品编号,数量
having 数量> (select max(数量)
from CPXSB
where 销售日期='2004-03-18'
)
查询购买了所有产品的客户的名称。
写出对应SQL语句并给出查询结果:
select 客户名称
from XSS
where not exists(
select 产品编号
from CP
where not exists(
select 客户编号
from CPXSB
where CP.产品编号=CPXSB.产品编号and CPXSB.客户编号=XSS.客户编号
)
)
5.2.集合操作
1. 准备工作
创建如下两表X和Y,并添加相应的值
图5-1 测试表X和Y 阅读并执行以下语句,理解其功能,给出运行结果。
2. 集合并:union
执行以下语句:
请给出运行结果:
3. 集合交:intersect:
执行以下语句:
请给出运行结果:
5.3以下操作请使用PUBS数据库中的数据表进行操作
1、查询PUBS数据库中的employee表中其出版社所在国家为’USA’的所有出版社员工的信息。
2、查询PUBS数据库中的SALES表中书籍出版时间pubdate在‘1991-10-1’以后的书籍的销售信息。
3、查询PUBS数据库中的titles表中书籍价格高于类别为‘business ’的任一书籍价格的所有书籍的信息。
4、查询PUBS数据库中的titles表中书籍价格高于类别为‘business ’的所有书籍价格的所有书籍的信息。