SQL练习语句
SQL查询语句练习及结果
1 单表查询1.1 查询订购日期在1996年7月1日至1996年7月15日之间的订单的订购日期、订单ID、客户ID和雇员ID等字段的值查询语句:select 订单ID客户ID雇员ID订购日期from 订单WHERE 订购日期BETWEEN '1996-7-1' AND '1996-7-15';1.2 查询供应商的ID、公司名称、地区、城市和电话字段的值。
条件是“地区等于华北”并且“联系人头衔等于销售代表”。
查询语句:select 供应商ID公司名称地区城市电话from `供应商`WHERE 地区 = '华北'AND 联系人职务 = '销售代表';1.3 查询供应商的ID、公司名称、地区、城市和电话字段的值。
其中的一些供应商位于华东或华南地区,另外一些供应商所在的城市是天津查询语句:select 供应商ID公司名称地区城市电话from `供应商`WHERE 地区 in('华东''华南') or 城市 = '天津';1.4 查询位于“华东”或“华南”地区的供应商的ID、公司名称、地区、城市和电话字段的值查询语句:select 供应商ID公司名称地区城市电话 from `供应商` WHERE 地区 in('华东''华南');2 多表查询2.1查询订购日期在1996年7月1日至1996年7月15日之间的订单的订购日期、订单ID、相应订单的客户公司名称、负责订单的雇员的姓氏和名字等字段的值,并将查询结果按雇员的“姓氏”和“名字”字段的升序排列,“姓氏”和“名字”值相同的记录按“订单ID”的降序排列查询语句:select 订购日期订单ID公司名称姓氏名字from 订单 aleft join 客户 b on a.客户ID = b.客户IDleft join 雇员 c on a.雇员ID = c.雇员IDWHERE 订购日期 BETWEEN '1996-7-1' AND '1996-7-15'order by 姓氏名字订单ID2.2 查询“10248”和“10254”号订单的订单ID、运货商的公司名称、订单上所订购的产品的名称查询语句:select 订购日期订单ID公司名称姓氏名字from 订单 aleft join 客户 b on a.客户ID = b.客户IDleft join 雇员 c on a.雇员ID = c.雇员IDWHERE 订购日期 BETWEEN '1996-7-1' AND '1996-7-15'order by 姓氏名字订单ID2.3 查询“10248”和“10254”号订单的订单ID、订单上所订购的产品的名称、数量、单价和折扣查询语句:select a.订单IDc.产品名称b.单价b.数量b.折扣from 订单 aleft join 订单明细 b on a.订单ID = b.订单IDleft join 产品 c on c.产品ID = b.产品IDwhere a.订单ID in('10248''10254')2.4 查询“10248”和“10254”号订单的订单ID、订单上所订购的产品的名称及其销售金额销售金额=单价*数量*(1-折扣)查询语句:select a.订单IDc.产品名称 round(b.单价*b.数量*(1-b.折扣)2) as 销售金额from 订单 aleft join 订单明细 b on a.订单ID = b.订单IDleft join 产品 c on c.产品ID = b.产品IDwhere a.订单ID in('10248''10254')3 综合查询3.1 查询所有运货商的公司名称和电话查询语句:select 公司名称电话 from 运货商3.2 查询所有客户的公司名称、电话、传真、地址、联系人姓名和联系人头衔查询语句:select 公司名称电话传真地址联系人姓名联系人职务from 客户3.3 查询单价介于10至30元的所有产品的产品ID、产品名称和库存量查询语句:select 产品ID产品名称库存量from 产品where 单价 BETWEEN 10 and 303.4 查询单价大于20元的所有产品的产品名称、单价以及供应商的公司名称、电话查询语句:select a.产品名称a.单价b.公司名称b.电话from 产品 aleft join 供应商 b on a.供应商ID = b.供应商IDwhere 单价 > 203.5 查询上海和北京的客户在1996年订购的所有订单的订单ID、所订购的产品名称和数量查询语句:select a.订单IDd.产品名称c.数量from 订单 aleft join 客户 b on a.客户ID = b.客户IDleft join 订单明细 c on a.订单ID = c.订单IDleft join 产品 d on c.产品ID =d.产品IDwhere b.城市 in('上海''北京')3.6 查询华北客户的每份订单的订单ID、产品名称和销售金额查询语句:select a.订单IDd.产品名称 round(c.单价*c.数量*(1-c.折扣)2) as 销售金额from 订单 aleft join 客户 b on a.客户ID = b.客户IDleft join 订单明细 c on a.订单ID = c.订单IDleft join 产品 d on c.产品ID =d.产品IDwhere b.地区 = '华北'3.7 按运货商公司名称,统计1997年由各个运货商承运的订单的总数量查询语句:select b.公司名称count(a.订单ID) as 订单总数量from 订单 aleft join 运货商 b on a.运货商 = b.运货商IDwhere year(a.订购日期) = 1997group by b. 公司名称3.8 统计1997年上半年的每份订单上所订购的产品的总数量查询语句:select b.公司名称sum(c.数量) as 产品总数量from 订单 aleft join 运货商 b on a.运货商 = b.运货商IDleft join 订单明细 c on a.订单ID = c.订单IDwhere 订购日期 between '1997-01-01' and '1997-06-30'group by b.公司名称3.9 统计各类产品的平均价格查询语句:select 类别名称round(sum(a.单价*a.数量*(1-a.折扣))/sum(a.数量)2) as 平均价格from 订单明细 aleft join 产品 b on a.产品ID = b.产品IDleft join 类别 c on b.类别ID = c.类别IDgroup by c.类别名称3.10 统计各地区客户的总数量查询语句:select 地区count(客户ID) as 客户总数from 客户group by 地区。
(完整版)sql语句练习题及答案
(完整版)sql语句练习题及答案⼀在数据库 school 中建⽴student , sc, course 表。
学⽣表、课程表、选课表属于数据库School ,其各⾃的数据结构如下:学⽣Student (Sno,Sname,Ssex,Sage,Sdept)课程表course(Cno,Cname,Cpno,Ccredit)学⽣选课SC(Sno,Cno,Grade)⼆设定主码1 Student表的主码:sno2 Course表的主码:cno3 Sc表的主码:sno,cno1写出使⽤ Create Table 语句创建表 student , sc, course 的SQL语句23 删除student表中的元组4在数据库school中删除关系student5在student表添加属性sbirthdate 类型datetimeDelete1 删除所有JSJ 系的男⽣delete from Student where Sdept=’JSJ’ and Ssex=’男’;2 删除“数据库原理”的课的选课纪录delete from SC where Cno in (select Cno fromCourse where Cname=’数据库原理’);Update1 修改0001 学⽣的系科为: JSJ2 把陈⼩明的年龄加1岁,性别改为⼥。
2 修改李⽂庆的1001课程的成绩为93 分3 把“数据库原理”课的成绩减去1分Select 查询语句⼀单表1查询年龄在19⾄21岁之间的⼥⽣的学号,姓名,年龄,按年龄从⼤到⼩排列。
2查询姓名中第2个字为“明”字的学⽣学号、性别。
3查询 1001课程没有成绩的学⽣学号、课程号4查询JSJ 、SX、WL 系的年龄⼤于25岁的学⽣学号,姓名,结果按系排列5按10分制查询学⽣的sno,cno,10分制成绩(1-10分为1 ,11-20分为2 ,30-39分为3,。
90-100为10)6查询 student 表中的学⽣共分布在那⼏个系中。
数据库常用SQL语句练习(含答案)
Emp(员工表)和Dept(部门表)简单题1. 案例:查询没有上级领导的员工的编号,姓名,工资select empno,ename,sal from emp where mgr is null;2. 案例:查询emp表中没有奖金的员工的姓名,职位,工资,以及奖金select ename,job,sal,comm from emp where comm is null or comm=0;既可以是null,也可以是03. 案例:查询emp表中含有奖金的员工的编号,姓名,职位,以及奖金select ename,job,sal,comm from emp where comm>0;4. 案例:查询含有上级领导的员工的姓名,工资以及上级领导的编号select ename,sal,mgr from emp where mgr is not null;5. 案例:查询emp表中名字以‘S’开头的所有员工的姓名select ename from emp where ename like 's%'6. 案例:查询emp表中名字的最后一个字符是'S'的员工的姓名select ename from emp where ename like '%s'7. 案例:查询倒数的第2个字符是‘E’的员工的姓名select ename from emp where ename like '%e_'8. 案例:查询emp表中员工的倒数第3个字符是‘N’的员工姓名select ename from emp where ename like '%n__'9. 案例:查询emp表中员工的名字中包含‘A’的员工的姓名select ename from emp where ename like '%a%'10. 案例:查询emp表中名字不是以'K'开头的员工的所有信息select * from emp where ename not like 'k%';11. 案例:查询emp表中名字中不包含‘A’的所有员工的信息select * from emp where ename not like '%a%'12. 案例:做文员的员工人数(job= CLERK 的)select count(*) from emp where job='clerk';13. 案例:销售人员job: SALESMAN 的最高薪水select max(sal) from emp where job='salesman';14. 案例:最早和最晚入职时间select min(hiredate),max(hiredate) from emp;15. 案例:查询emp表中员工的编号,姓名,职位,工资,并且工资在1000~2000之间。
SQL语句练习及答案
现在有一教学管理系统,具体的关系模式如下:Student (no, name, sex, birthday, class)Teacher (no, name, sex, birthday, prof, depart)Course (cno, cname, tno)Score (no, cno, degree)其中表中包含如下数据:Course表:Score表:Student表:Teacher表:根据上面描述完成下面问题:(注意:注意保存脚本,尤其是DDL和DML,以便进行数据还原)DDL1.写出上述表的建表语句。
命令:create table Student(no nvarchar(5),name nvarchar(5),sex nvarchar(1),birthday datetime,class nvarchar(5))DML2.给出相应的INSERT语句来完成题中给出数据的插入。
命令:单表查询3.以class降序输出student的所有记录(student表全部属性)命令:select*from Student order by class desc4.列出教师所在的单位depart(不重复)。
命令:select distinct depart from teacher5.列出student表中所有记录的name、sex和class列命令:select name,sex,class from student6.输出student中不姓王的同学的姓名。
命令:select name from Student where name not like'王%'7.输出成绩为85或86或88或在60-80之间的记录(no,cno,degree)命令:select*from Score where degree=85 or degree=86 or degree=88 or degree between60 and 808.输出班级为95001或性别为‘女’的同学(student表全部属性)命令:select*from Student where class='95001'or sex='女'9.以cno升序、degree降序输出score的所有记录。
sql语句习题
sql语句习题SQL语句说明书1)显示T_BookInfo表中所有字段的值。
SELECT*FROM T_BookInfo2)查询T_Teacher表中所有记录的TeacherCode、TeacherName、EnterDate和Title字段信息。
SELECT TeacherCode,TeacherName,EnterDate,TitleFROM T_Teacher3)查询男教师的姓名(TeacherName),显示时将字段名TeacherName改为“姓名”。
SELECT TeacherName AS姓名,SexFROM T_TeacherWHERE Sex='男';4)查询2007年以后出版的教材名称(BookName)、出版日期(PublishDate)和库存量(StockNum),显示时字段标题分别为:教材名称、出版日期和库存量。
SELECT BookName AS教材名称,PublishDate AS出版日期,StockNum AS库存量FROM T_BookInfoWHERE YEAR(PublishDate)>2007;5)查询所有教材的出版社代码(PublisherCode),将重复的记录去掉。
SELECT DISTINCT PublisherCodeFROM T_BookInfo6)查询学生订书量(StuBookNum)最大的3个记录,显示教材代号(BookCode)和学生订书量(StuBookNum)。
SELECT TOP3BookCode,StuBookNumFROM T_BookOrderORDER BY StuBookNum DESC7)查询学生订书量(StuBookNum)在150到250之间的教材信息。
SELECT*FROM T_BookInfoWHERE BookCode IN(SELECT BookCodeFROM T_BookOrderWHERE StuBookNum BETWEEN150AND250)8)查询每一种教材的学生订书总量。
SQL菜鸟初学语句
1.创建数据库create database NAME2.创建表create table NAME(A char(4) not null primarykey,B varchar(20) not null,C int)3.查询select * from TABLE_NAME where ((AGE<18) and (LASTNAME between A and B)) or COMPANY like "%NAME%"4.插入insert into TABLE_NAME (COLUMN1,COLUMN2,COLUMN3)values (DATA1,DATA2,DATA3)同时插入多行数据insert into TABLE_NAME(COLUMN1,COLUMN2,COLUMN3)select A,B,C unionselect D,E,F unionselect G,H,I --最后一行没有union5.存在则删除if exists (select * from sysobjects where name = 'A')drop table Ago6.修改列名exec sp_rename 'TABLE_COLUMN','NEW_NAME'修改某行某列数据update TABLE_NAMEset A='C' --C为新值(A为某行某列的一个数据)where A='B' --B为旧值7.添加列alter table NAME add A char(5)删除列alter table NAME drop column A8.根据旧表创建新表select * into NEW_TABLE from OLD_TABLE或者select COLUMN1,COLUMN2,COLUMN3 into NEW_TABLE from OLD_TABLE9.升序、降序select * from TABLE_NAMEorder by COLUMN_NAME asc (升序)desc(降序)10.聚合函数select sum(COLUMN1)--求和,avg(COLUMN1)--平均值,max(COLUMN1)--最大值,min(COLUMN1)--最小值from TABLE[select sum(COLUMN1) as 求和from TABLE --可以把列名修改成“求和”]11.两张表整合为一张select * from TABLE1union --(union只显示不重复的,union all全部显示)select * from TABLE2。
SQL语句练习及参考答案
SQL语句练习及参考答案SQL 语句练习1.设学⽣选课数据库有关系S (sno,sname,age,sex )、SC (sno,cno,grade )和C(cno,cname,teacher ),分别表⽰学⽣、选课和课程,sno 代表学号,sname 代表学⽣姓名,age 代表年龄,sex 代表性别,grade 代表成绩,cno 代表课程号,teacher 代表任课教师。
试完成表⽰下列查询。
(1)检索年龄⼤于21的男学⽣学号(sno)和姓名(sname)。
(2)建⽴性别只能为“男”、“⼥”的约束。
(3)创建⼀个视图v1,该视图⽤来查询学⽣的选课情况,要求包含:学⽣姓名(sname),课程名(cname),任课教师teacher 和成绩grade 。
(4)检索选修课程号为k1和k5的学⽣学号(sno)。
(5)检索全部学⽣都选修的课程的课程号(cno)和课程名(cname)。
(6)删除所有男同学的选课记录。
1.(1)select sno,snae from s where sex=’男’ and age>21 (2)alter table s add constraint c1 check sex in (‘男’,’⼥’)(3)create view v1 as select sname,cname,teacher,grade from s,sc,c where s.sno=sc.sno and/doc/62176c89fe4733687e21aaca.html o=/doc/62176c89fe4733687e21aaca.html o (4)select sno fromsc sc1 where cno=’k1’ and exists (se lect * fromsc sc2 where sc1.sno =sc2.sno and/doc/62176c89fe4733687e21aaca.html o=’k5’)(5)select cno,cnam from c where not exists (select * from s where not exists (select * from sc where/doc/62176c89fe4733687e21aaca.html o=/doc/62176c89fe4733687e21aaca.html o and s.sno=sc.sno)(6)delete from sc where sno in (select sno from s where sex=’男’)或delete sc from sc,s where s.sno=sc.sno and sex=’男’2.设图书借阅数据库有关系图书(图书编号,书名,作者,出版社,出版时间,图书类别)、读者(读者编号,姓名,读者类别)和借阅(读者编号, 图书编号, 借阅⽇期,还期)。
50条数据库sql语句及答案
select teaid from tblTeacher where teaname = '叶平')))
--练习
select stuid from tblScore where courseid in (
--11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
------运用连接查询
SELECT DISTINCT ST.* FROM tblStudent ST, tblScore SC WHERE ST.STUID = SC.STUID
AND SC.COURSEID IN
select stuid from tblScore GROUP BY STUID HAVING max(SCORE)<60)
--10、查询没有学全所有课的同学的学号、姓名;
--练习
SELECT TS.STUID,TS.STUNAME,COUNT(TSC.SCORE) FROM tblStudent TS
TC.COURSEID INNER JOIN tblTeacher TT ON TC.TEAID = TT.TEAID
WHERE TT.TEANAME ='叶平')
--对
SELECT STUID, STUNAME FROM tblStudent WHERE STUID NOT IN(
where A.SCORE > B.SCORE
--老师讲的方法
SELECT T.* FROM tblScore T WHERE T.COURSEID = 1 AND
sql语句练习50题
sql语句练习50题Student(Sid,Sname,Sage,Ssex) 学⽣表Course(Cid,Cname,Tid) 课程表SC(Sid,Cid,score) 成绩表Teacher(Tid,Tname) 教师表练习内容:1.查询“某1”课程⽐“某2”课程成绩⾼的所有学⽣的学号;SELECT a.sid FROM (SELECT sid,score FROM SC WHERE cid=1) a,(SELECT sid,score FROM SC WHERE cid=3) b WHEREa.score>b.score AND a.sid=b.sid;此题知识点,嵌套查询和给查出来的表起别名2.查询平均成绩⼤于60分的同学的学号和平均成绩;SELECT sid,avg(score) FROM sc GROUP BY sid having avg(score) >60;此题知识点,GROUP BY 语句⽤于结合合计函数,根据⼀个或多个列对结果集进⾏分组。
group by后⾯不能接where,having代替了where3.查询所有同学的学号、姓名、选课数、总成绩SELECT Student.sid,Student.Sname,count(SC.cid),sum(score)FROM Student left Outer JOIN SC on Student.sid=SC.cid GROUP BY Student.sid,Sname4.查询姓“李”的⽼师的个数;select count(teacher.tid)from teacher where teacher.tname like'李%'5.查询没学过“叶平”⽼师课的同学的学号、姓名;SELECT Student.sid,Student.Sname FROM Student WHERE sid not in (SELECT distinct( SC.sid) FROM SC,Course,Teacher WHERE SC.cid=Course.cid AND Teacher.id=Course.tid AND Teacher.Tname='叶平');此题知识点,distinct是去重的作⽤6.查询学过“```”并且也学过编号“```”课程的同学的学号、姓名;select a.SID,a.SNAME from (select student.SNAME,student.SID from student,course,sc where cname='c++'and sc.sid=student.sid and sc.cid=course.cid) a,(select student.SNAME,student.SID from student,course,sc where cname='english'and sc.sid=student.sid and sc.cid=course.cid) b where a.sid=b.sid;标准答案(但是好像不好使)SELECT Student.S#,Student.Sname FROM Student,SC WHERE Student.S#=SC.S# ANDSC.C#='001'and exists( SELECT * FROM SC as SC_2 WHERE SC_2.S#=SC.S# AND SC_2.C#='002');此题知识点,exists是在集合⾥找数据,as就是起别名7.查询学过“叶平”⽼师所教的所有课的同学的学号、姓名;select a.sid,a.sname from (select student.sid,student.sname from student,teacher,course,scwhere teacher.TNAME='杨巍巍' and teacher.tid=course.tid and course.cid=sc.cid and student.sid=sc.sid) a标准答案:SELECT sid,Sname FROM Student WHERE sid in (SELECT sid FROM SC ,Course ,Teacher WHERE SC.cid=Course.cid AND Teacher.tid=Course.tid AND Teacher.Tname='杨巍巍' GROUP BY sid having count(SC.cid)=(SELECT count(cid) FROM Course,Teacher WHERE Teacher.tid=Course.tid AND Tname='杨巍巍'))8.查询课程编号“”的成绩⽐课程编号“”课程低的所有同学的学号、姓名;select a.sid,a.sname from(select student.SID,student.sname,sc.SCORE from student,sc where student.sid=sc.sid and sc.cid=1) a, (select student.SID,student.sname,sc.score from student,sc where student.sid=sc.sid and sc.cid=2) b where a.score<b.score anda.sid=b.sid标准答案:SELECT sid,Sname FROM (SELECT Student.sid,Student.Sname,score ,(SELECT score FROM SC SC_2 WHERE SC_2.sid=Student.sid AND SC_2.cid=1) score2 FROM Student,SCWHERE Student.sid=SC.sid AND cid=1) S_2 WHERE score2 <score;9.查询所有课程成绩⼩于分的同学的学号、姓名;SELECT sid,Sname FROM Student WHERE sid not in (SELECT Student.sid FROM Student,SC WHERE Student.sid=SC.sid AND score>60);此题知识点,先查出⼤于60分的,然后not in 就是⼩于60分的了10.查询没有学全所有课的同学的学号、姓名;SELECT Student.sid,Student.Sname FROM Student,SCWHERE Student.sid=SC.sid GROUP BY Student.sid,Student.Sname having count(cid) <(SELECT count(cid) FROM Course);11.查询⾄少有⼀门课与学号为“”的同学所学相同的同学的学号和姓名;12.查询⾄少学过学号为“”同学所有⼀门课的其他同学学号和姓名;SELECT student.sid,student.Sname FROM Student,SC WHERE Student.sid=SC.sid AND cid in (SELECT cid FROM SC WHERE sid=1)此题知识点,SELECT sid,Sname FROM Student,SC WHERE Student.sid=SC.sid AND cid in (SELECT cid FROM SC WHEREsid=1)这样写是错误的,因为from后⾯是两个表,不能明确是哪个表⾥⾯的sid和sname所以错误提⽰是“未明确定义列”13.把“SC”表中“叶平”⽼师教的课的成绩都更改为此课程的平均成绩;update sc set score=(select avg(score) from sc,course,teacher where course.cid=sc.cid and course.tid=teacher.tid andteacher.tname='杨巍巍')14.查询和“”号的同学学习的课程完全相同的其他同学学号和姓名;SELECT sid FROM SC WHERE cid in (SELECT cid FROM SC WHERE sid=6) GROUP BY sid having count(*)=(SELECT count(*) FROM SC WHERE sid=6);此题知识点,⽤数量来判断15.删除学习“叶平”⽼师课的SC表记录;delete from sc s where s.cid in (select c.cid from teacher t,course c where t.tid = c.tid and tname='李⼦')此题知识点,嵌套查询可以分布考虑,先查出李⼦⽼师都交了什么课的id,然后再删除那些id的值16.向SC表中插⼊⼀些记录,这些记录要求符合以下条件:没有上过编号“”课程的同学学号、课程的平均成绩;Insert into SC SELECT sid,2,(SELECT avg(score) FROM SC WHERE cid=2) FROM Student WHERE sid not in (SELECT sid FROM SC WHERE cid=2);17.按平均成绩从⾼到低显⽰所有学⽣的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显⽰:学⽣ID,,数据库,企业管理,英语,有效课程数,有效平均分;(没做出来)18.查询各科成绩最⾼和最低的分:以如下形式显⽰:课程ID,最⾼分,最低分;select cid as 课程号,max(score)as 最⾼分,min(score) as 最低分 from sc group by cid标准答案(但是运⾏不好使)SELECT L.cid As 课程ID,L.score AS 最⾼分,R.score AS 最低分FROM SC L ,SC AS RWHERE L.cid = R.cid ANDL.score = (SELECT MAX(IL.score)FROM SC AS IL,Student AS IMWHERE L.cid = IL.cid AND IM.sid=IL.sidGROUP BY IL.cid)AND R.Score = (SELECT MIN(IR.score) FROM SC AS IR WHERE R.cid = IR.cid GROUP BY IR.cid );19.按各科平均成绩从低到⾼和及格率的百分数从⾼到低顺序26.查询每门课程被选修的学⽣数select sc.cid,count(sc.sid) from sc,course where sc.cid=course.cid group by sc.cid27.查询出只选修了⼀门课程的全部学⽣的学号和姓名SELECT SC.sid,Student.Sname,count(cid) AS 选课数 FROM SC ,StudentWHERE SC.sid=Student.sid GROUP BY SC.sid ,Student.Sname having count(cid)=1;32.查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列SELECT Cid,Avg(score) FROM SC GROUP BY cid ORDER BY Avg(score),cid DESC ;37.查询不及格的课程,并按课程号从⼤到⼩排列SELECT cid,sid FROM sc WHERE score <60 ORDER BY cid38.查询课程编号为且课程成绩在分以上的学⽣的学号和姓名;select student.sid,student.sname from sc,student where sc.cid=1 and sc.score>60 and sc.sid=student.sid40.查询选修“叶平”⽼师所授课程的学⽣中,成绩最⾼的学⽣姓名及其成绩select student.sname,sc.score from sc,student,teacher,course c where teacher.tname='李⼦'and teacher.tid=c.tid and c.cid=sc.cid and sc.sid=student.sid and sc.score=(select max(score)from sc where sc.cid=c.cid)41.查询各个课程及相应的选修⼈数select sc.cid ,count(sc.sid)from sc,student where sc.sid=student.sid group by sc.cid43.查询每门功成绩最好的前两名44.统计每门课程的学⽣选修⼈数(超过⼈的课程才统计)。
sql中级练习题
sql中级练习题在SQL中级练习题中,我们将会思考和解决与SQL查询语言相关的问题。
SQL(结构化查询语言)是一种用于在关系数据库中管理和操作数据的标准语言。
通过解决这些练习题,我们将加深对SQL的理解,并提高在实际应用中编写和优化查询语句的能力。
练习一:学生表查询考虑一个学生表,包含以下字段:学生ID(student_id)、学生姓名(student_name)、学生所在班级(class_id)、学生的总成绩(total_score)。
1. 查询学生表中所有学生的信息。
SELECT * FROM 学生表;2. 查询学生表中总成绩大于80分的学生信息。
SELECT * FROM 学生表 WHERE total_score > 80;3. 查询学生表中总成绩最高的学生信息。
SELECT * FROM 学生表 ORDER BY total_score DESC LIMIT 1;4. 查询每个班级的学生总人数和平均成绩。
SELECT class_id, COUNT(*) AS 学生总人数, AVG(total_score) AS 平均成绩FROM 学生表GROUP BY class_id;练习二:订单表查询考虑一个订单表,包含以下字段:订单ID(order_id)、客户ID (customer_id)、订单日期(order_date)、订单金额(order_amount)。
1. 查询订单表中所有订单的信息。
SELECT * FROM 订单表;2. 查询订单表中订单金额大于1000的订单信息。
SELECT * FROM 订单表 WHERE order_amount > 1000;3. 查询订单表中订单日期在2020年1月1日至2020年12月31日期间的订单信息。
SELECT * FROM 订单表 WHERE order_date BETWEEN '2020-01-01' AND '2020-12-31';4. 查询每个客户的订单总金额和订单数量。
SQL查询语句练习作业
一、创建名为“student”的表,结构见表1,内容见表2表1 student表结构字段名类型宽度学号字符型10姓名字符型10性别字符型 4出生日期日期型8专业字符型20年级数值型10表2 student表二、练习SQL查询语句——基础的select格式: select 字段名 from 表名1、写出查找student表中所有字段的语句,并在命令窗口测试2、写出查找student表中学号的语句,并在命令窗口测试3、写出查找student表中姓名的语句,并在命令窗口测试4、写出查找student表中性别的语句,并在命令窗口测试5、写出查找student表中出生日期的语句,并在命令窗口测试6、写出查找student表中专业的语句,并在命令窗口测试7、写出查找student表中年级的语句,并在命令窗口测试8、写出查找student表中学号和姓名的语句,并在命令窗口测试(注意逗号是英文状态)9、写出查找student表中学号、姓名和性别的语句,并在命令窗口测试10、写出查找student表中学号、姓名、性别和出生日期的语句,并在命令窗口测试11、写出查找student表中学号、姓名、性别、出生日期和专业的语句,并在命令窗口测试12、写出查找student表中学号、姓名、性别、出生日期、专业和年级的语句,并在命令窗口测试三、练习SQL查询语句——where条件查询格式: select 字段名 from 表名 where 条件1、查找student表中学号是101001的学生,写出语句,并在命令窗口测试2、查找student表中李玲的个人信息,写出语句,并在命令窗口测试3、查找student表中所有的男学生,写出语句,并在命令窗口测试4、查找student表中的在1992年3月1日(含)之后出生的学生,写出语句,并在命令窗口测试5、查找student表中信息管理专业的学生,写出语句,并在命令窗口测试6、查找student表中2012级的学生,写出语句,并在命令窗口测试四、练习SQL查询语句——where条件查询AND OR格式: select 字段名 from 表名 where 条件1 and/or 条件21、查找student表中学号为121001和131005的学生信息,写出语句,并在命令窗口测试2、查找student表中李泽田和王海东的个人信息,写出语句,并在命令窗口测试3、查找student表中工商管理专业的男生信息,写出语句,并在命令窗口测试4、查找student表中在1992年和1993年出生的学生,写出语句,并在命令窗口测试5、查找student表中信息管理专业和工商管理专业的女学生,写出语句,并在命令窗口测试6、查找student表中2012级和2013级中1993年出生的学生,写出语句,并在命令窗口测试五、练习SQL查询语句——where条件查询like格式: select 字段名 from 表名 where 字段名like 套式1、查找student表中姓王的学生信息,写出语句,并在命令窗口测试2、查找student表中姓王和姓贾的学生信息,写出语句,并在命令窗口测试3、查找student表中姓王、姓贾和姓李的学生信息,写出语句,并在命令窗口测试4、查找student表中姓名中含“泽”的学生信息,写出语句,并在命令窗口测试5、查找student表中姓名中含“文”的学生信息,写出语句,并在命令窗口测试6、查找student表中姓名中最后1个字是“玲”的学生信息,写出语句,并在命令窗口测试7、查找student表中姓名中最后1个字是“文”的学生信息,写出语句,并在命令窗口测试8、查找student表中姓名有3个字,中间的字是“文”的学生,写出语句,并在命令窗口测试9、查找student表中姓王的男生信息,写出语句,并在命令窗口测试10、查找student表中姓王和姓李的女生信息,写出语句,并在命令窗口测试11、查找student表中姓名中含“文”的女生信息,写出语句,并在命令窗口测试六、练习SQL查询语句——where条件查询between格式: select 字段名 from 表名 where 字段名between 值1 and 值2 1、查找student表中在1992年出生的学生,写出语句,并在命令窗口测试2、查找student表中在1992年和1993年出生的学生,写出语句,并在命令窗口测试3、查找student表中在2010级、2011级、2012级的学生,写出语句,并在命令窗口测试七、练习SQL查询语句——where条件查询order by格式: select 字段名 from 表名 where 条件 order by 字段名 asc/desc 1、把student表中的学生信息按学号降序排列显示,写出语句,并在命令窗口测试2、把student表中的学生信息按姓名降序排列显示,写出语句,并在命令窗口测试3、把student表中的学生信息按姓名升序排列显示,写出语句,并在命令窗口测试4、把student表中的学生信息按年龄升序排列显示,写出语句,并在命令窗口测试5、把student表中的学生信息按年龄降序排列显示,写出语句,并在命令窗口测试6、查找student表中所有的男生,并按学号降序排列,写出语句,并在命令窗口测试6、查找student表中所有的女生,并按姓名升序排列,写出语句,并在命令窗口测试7、查找student表中的在1992年出生的学生,并按年龄降序排列,写出语句,并在命令窗口测试8、查找student表中信息管理专业的学生,并按照姓名降序排列,写出语句,并在命令窗口测试9、把student表中的学生信息按性别分类显示,男生在前,女生在后,男生和女生,各自按照姓名升序排列,写出语句,并在命令窗口测试八、练习SQL查询语句——where条件查询count格式: select count(*) from 表名 where 条件1、统计student表中的学生总人数,写出语句,并在命令窗口测试2、统计student表中男生人数,写出语句,并在命令窗口测试3、统计student表中姓王的人数,写出语句,并在命令窗口测试。
sql经典50题建表语句
sql经典50题建表语句1、题目:创建一个名为"employees"的表,包含"id"、"name"和"salary"三个字段。
sql:CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(50),salary DECIMAL(10, 2));2、题目:创建一个名为"orders"的表,包含"order_id"、"customer_id"和"order_date"三个字段。
sql:CREATE TABLE orders (order_id INT PRIMARY KEY,customer_id INT,order_date DATE);3、题目:创建一个名为"products"的表,包含"product_id"、"product_name"和"price"三个字段。
sql:CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(50),price DECIMAL(10, 2));4、题目:创建一个名为"customers"的表,包含"customer_id"、"first_name"、"last_name"和"email"四个字段。
sql:CREATE TABLE customers (customer_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),email VARCHAR(100));5、题目:创建一个名为"addresses"的表,包含"address_id"、"street"、"city"和"state"四个字段。
50条常用sql语句
SELECT S#,Sname
from Student
WHERE S# in (SELECT S# from SC ,Course ,Teacher WHERE SC.C#=Course.C# AND Teacher.T#=Course.T# AND Teacher.Tname='叶平' GROUP BY S# having count(SC.C#)=(SELECT count(C#) from Course,Teacher WHERE Teacher.T#=Course.T# AND Tname='叶平'));
Hale Waihona Puke 课的平均成绩; Insert SC SELECT S#,'002',(SELECT avg(score)
from SC WHERE C#='002') from Student WHERE S# not in (SELECT S# from SC WHERE C#='002');
from Student,SC WHERE Student.S#=SC.S# AND C#='001') S_2 WHERE score2 <score;
9、查询所有课程成绩小于分的同学的学号、姓名;
SELECT S#,Sname
from Student
WHERE S# not in (SELECT Student.S# from Student,SC WHERE S.S#=SC.S# AND score>60);
GROUP BY S# having avg(score) >60;
简单SQL语句练习
简单SQL语句练习练习5. 1. 2: 基于不断滚动的电影数据库的实例:Movie( title, year , length, inColor , studioName, producerC# )StarsIn(movieTitle, movieYear , starName)MovieStar ( name, address, gender , birthdate)MovieExec( name, address , cert # , netWorth )Studio( name, address, presC# )请写出下列SQL 查询语句:* ( a) 找出米高梅制片公司(MGM studios)的地址。
SELECT address AS Studio_AddressFROM Studio WHERE name = 'MGM';( b) 找出桑德拉·布洛克( Sandra Bullock ) 的出生日期( birthdate) 。
SELECT birthdate AS Star_BirthdateFROM MovieStar WHERE name = 'Sandra Bullock';* ( c) 找出在1980 年拍摄过电影的所有影星, 或者拍摄过电影名中含有“Love”的电影的所有影星。
SELECT starName FROM StarsInWHERE movieYear = 1980 OR movieTitle LIKE '%Love%';( d) 找出净资产至少1 000 万美元的所有行政长官。
SELECT name AS Exec_NameFROM MovieExec WHERE netWorth >= 10000000;( e) 找出所有的男影星或者是住址中含有Malibu 的影星。
SELECT name AS Star_Name FROM movieStarWHERE gender = 'M' OR address LIKE '% Malibu %';练习5. 1. 3: 用SQL 写出下列的查询。
经典_Oracle的sql语句百例训练
经典_Oracle的sql语句百例训练oracle系列《一》:简单sql与单行函数使用scott/tiger用户下的emp表和dept表中顺利完成以下练,表的结构表明如下dept部门表(deptno部门编号/dname部门名称/loc地点)工资=薪金+佣金登入oracle数据库1、sqlplusscott/tiger2、sqlplus/nologsql>connscott/tiger若是使用sys的账号进行登录的话,则使用以下语句sql>conn/assysdba【1】emp表中内容查阅sql>select*fromemp;失效,原因就是没找出该表中,因为该表时scott用户的表中,所以查阅时必须加之scott.emp就可以了【2】显示当前用户sql>showuser【3】查看当前用户的所有表sql>select*fromtab;【4】若想重复继续执行上一条sql语句,则在sqlplus命令行下输出\即可【5】查询一张表的结构,例如dept表sql>descdept【6】在雇员表查阅雇员的编号、姓名、工作sql>selectempno,ename,jobfromemp;【7】可以为列名取别名,在linux下oracle如果英文别名不加上双引号则会变成大写sql>selectempno编号,ename姓名,job工作fromemp;【8】查询所有的工作sql>selectdistinctjobfromemp;工作可能会重复,加之distinct关键字【9】若要求按照以下的格式进行结果输出,如no:7469,name:smith,job:clerksql>select'no:'||empno||',name:'||ename||',job:'||jobfromemp;【10】建议列举每个雇员的姓名及年薪【11】查看每月可以得到奖金的雇员信息【12】建议基本工资大于1500,同时可以申领奖金的雇员信息【13】查询基本工资不大于1500,同时不可以领取奖金的雇员信息【14】查阅在1981年雇用的全部雇员信息,between..and涵盖等同于的情况sql>select*fromempwherehiredatebetween'01-jan-81'and'31-dec-81';【15】oracle对大小敏感,所以查询时名字要区分大小写【16】建议查阅出来雇员编号不是7369、7499的雇员信息sql>select*fromempwhereempnonotin(7369,7499);【17】sql中like语句必须特别注意通配符%和_sql>select*fromempwherehiredatelike'?%';【18】查阅雇员编号不是7369的雇员信息,采用<>或!=sql>select*fromempwhereempno<>7369;【19】要求对雇员的工资由低到高进行排序,升序为默认(asc),降序(desc)sql>select*fromempgroupbysal;【20】查阅出来部门号为10的雇员信息,查阅的信息按照工资从低至高,若工资成正比则按雇佣日期从早到晚排序sql>select*fromempwheredeptno=10groupbysaldesc,hiredateasc;数据库系统中,每个数据库之间区别最小的就是在函数的积极支持上,单行函数就是最简单的函数,单行函数分成1、字符函数:接受字符输入并且返回字符或数值2、数值函数:接受数值输入并返回数值3、日期函数:对日期型数据进行操作4、切换函数:将一种数据初始化为另一种数据类型5、通用型函数:nvl、decode函数字符函数:【1】大小写切换upper和lowersql>selectupper('smith')fromdual;【2】将雇员姓名变为开头字母大写,initcapsql>selectinitcap(ename)fromemp;字符函数中存有相连接函数concat,但不如||不好用,除了字符串处置的一些函数字符串撷取:substr()字符串长度:length()内容替代:replace()sql>selectsubstr('hello',1,3),length('hello'),replace('hello','l','x')fromdual;这里注意的是oracle中字符串截取从0和从1开始都是一样的,谨防面试提问【3】建议表明所有雇员的姓名及姓名的后3个字符sql>selectename,substr(ename,length(ename)-2)fromemp;以上操作显得较为麻烦,substr()函数是可以倒着截取sql>selectename,substr(ename,-3,3)fromemp;数值函数:1、四舍五入:round()2、截断小数位:trunc()3、取余(取模):modsql>selectround(789.536)fromdual;【1】保留2位小数,(如果是-2则对整数进行四舍五入,变为800了)sql>selectround(783.56,2)fromdual;【2】使用mod()函数进行取余操作sql>selectmod(10,3)fromdual;日期函数:1、日期-数字=日期2、日期+数字=日期3、日期-日期=数字(天数)【1】求出当前日期sql>selectsysdatefromdual;oracle提供了以下的日期函数支持:months_between():谋出来给定日期范围的月数add_months():在指定日期上加上指定的月数,求出之后的日期next_day():下一个的今天的日期last_day():谋出来给定日期的最后一天日期【2】求出从雇用日期到今天所有雇员的雇员编号、姓名和月数sql>selectempno,ename,round(months_between(sysdate,hiredate))fromemp;。
MysqlSql语句练习题(50道)
MysqlSql语句练习题(50道)表名和字段–1.学⽣表Student(s_id,s_name,s_birth,s_sex) –学⽣编号,学⽣姓名, 出⽣年⽉,学⽣性别–2.课程表Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号–3.教师表Teacher(t_id,t_name) –教师编号,教师姓名–4.成绩表Score(s_id,c_id,s_score) –学⽣编号,课程编号,分数测试数据--建表--学⽣表CREATE TABLE `Student`(`s_id` VARCHAR(20),`s_name` VARCHAR(20) NOT NULL DEFAULT '',`s_birth` VARCHAR(20) NOT NULL DEFAULT '',`s_sex` VARCHAR(10) NOT NULL DEFAULT '',PRIMARY KEY(`s_id`));--课程表CREATE TABLE `Course`(`c_id` VARCHAR(20),`c_name` VARCHAR(20) NOT NULL DEFAULT '',`t_id` VARCHAR(20) NOT NULL,PRIMARY KEY(`c_id`));--教师表CREATE TABLE `Teacher`(`t_id` VARCHAR(20),`t_name` VARCHAR(20) NOT NULL DEFAULT '',PRIMARY KEY(`t_id`));--成绩表CREATE TABLE `Score`(`s_id` VARCHAR(20),`c_id` VARCHAR(20),`s_score` INT(3),PRIMARY KEY(`s_id`,`c_id`));--插⼊学⽣表测试数据insert into Student values('01' , '赵雷' , '1990-01-01' , '男');insert into Student values('02' , '钱电' , '1990-12-21' , '男');insert into Student values('03' , '孙风' , '1990-05-20' , '男');insert into Student values('04' , '李云' , '1990-08-06' , '男');insert into Student values('05' , '周梅' , '1991-12-01' , '⼥');insert into Student values('06' , '吴兰' , '1992-03-01' , '⼥');insert into Student values('07' , '郑⽵' , '1989-07-01' , '⼥');insert into Student values('08' , '王菊' , '1990-01-20' , '⼥');--课程表测试数据insert into Course values('01' , '语⽂' , '02');insert into Course values('02' , '数学' , '01');insert into Course values('03' , '英语' , '03');--教师表测试数据insert into Teacher values('01' , '张三');insert into Teacher values('02' , '李四');insert into Teacher values('03' , '王五');--成绩表测试数据insert into Score values('01' , '01' , 80);insert into Score values('01' , '02' , 90);insert into Score values('01' , '03' , 99);insert into Score values('02' , '01' , 70);insert into Score values('02' , '02' , 60);insert into Score values('02' , '03' , 80);insert into Score values('03' , '01' , 80);insert into Score values('03' , '02' , 80);insert into Score values('03' , '03' , 80);insert into Score values('04' , '01' , 50);insert into Score values('04' , '02' , 30);insert into Score values('04' , '03' , 20);insert into Score values('05' , '01' , 76);insert into Score values('05' , '02' , 87);insert into Score values('06' , '01' , 31);insert into Score values('06' , '03' , 34);insert into Score values('07' , '02' , 89);insert into Score values('07' , '03' , 98);表数据如下student 学⽣表:s_id s_name s_birth s_sex01赵雷1990-01-01男02钱电1990-12-21男03孙凤1990-05-20男04李云1990-08-06男05周梅1991-12-12⼥06吴兰2017-12-13⼥07郑⽵1989-07-01⼥08王菊1990-01-20⼥09赵雷1990-01-21⼥10赵雷1990-01-22男score 分数表:s_id c_id s_score010180010290010399020170020260020380030180030280030380040150040230040320050176050387060131060334070389070198course 课程表c_id c_name t_id01语⽂0202数学0103英语03teacher ⽼师表:t_id t_name01张三02李四03王五-- 准备条件,去掉 sql_mode 的 ONLY_FULL_GROUP_BY 否则此种情况下会报错:-- Expression #1 of select list is not in group by clause and contains nonaggregated column 'userinfo.-- 原因:-- MySQL 5.7.5和up实现了对功能依赖的检测。
sql查询语句练习
CREATE TABLE STUDENT(SNO VARCHAR2(30) NOT NULL,SNAME VARCHAR2(40) NOT NULL,SSEX VARCHAR2(20) NOT NULL,SBIRTHDAY DATE,CLASS VARCHAR2(50));CREATE TABLE COURSE(CNO VARCHAR2(50) NOT NULL,CNAME VARCHAR2(100) NOT NULL,TNO VARCHAR2(100) NOT NULL);CREATE TABLE SCORE(SNO VARCHAR2(30) NOT NULL,CNO VARCHAR2(50) NOT NULL,DEGREE NUMBER(10, 1) NOT NULL);CREATE TABLE TEACHER(TNO VARCHAR2(30) NOT NULL,TNAME VARCHAR2(40) NOT NULL,TSEX VARCHAR2(20) NOT NULL,TBIRTHDAY DATE NOT NULL,PROF VARCHAR2(60),DEPART VARCHAR2(100) NOT NULL);INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾华' ,'男' ,TO_DATE('1977-09-01','yyyy-mm-dd'),95033);INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' ,'男' ,TO_DATE('1975-10-02','yyyy-mm-dd'),95031);INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王丽' ,'女' ,TO_DATE('1976-01-23','yyyy-mm-dd'),95033);INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李军' ,'男' ,TO_DATE('1976-02-20','yyyy-mm-dd'),95033);INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' ,'女' ,TO_DATE('1975-02-10','yyyy-mm-dd'),95031);INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陆君' ,'男' ,TO_DATE('1974-06-03','yyyy-mm-dd'),95031);INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-105' ,'计算机导论',825); INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-245' ,'操作系统' ,804); INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('6-166' ,'数据电路' ,856); INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('9-888' ,'高等数学' ,100); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-245',86);INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-245',75);INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-245',68);INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-105',92);INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-105',88);INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-105',76);INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'3-105',64);INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'3-105',91);INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'3-105',78);INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'6-166',85);INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'6-106',79);INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'6-166',81);INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)VALUES (804,'李诚','男',TO_DATE('1958-12-02','yyyy-mm-dd'),'副教授','计算机系'); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)VALUES (856,'张旭','男',TO_DATE('1969-03-12','yyyy-mm-dd'),'讲师','电子工程系'); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)VALUES (825,'王萍','女',TO_DATE('1972-05-05','yyyy-mm-dd'),'助教','计算机系'); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)VALUES (831,'刘冰','女',TO_DATE('1977-08-14','yyyy-mm-dd'),'助教','电子工程系');1、查询Student表中的所有记录的Sname、Ssex和Class列。
简单的SQL语句练习大全
简单的SQL语句练习大全一:本题用到下面三个关系表:CARD借书卡。
CNO 卡号,NAME姓名,CLASS 班级BOOKS图书。
BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY库存册数BORROW借书记录。
CNO 借书卡号,BNO 书号,RDA TE 还书日期备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。
要求实现如下15个处理:1.写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束。
//表名borrow2.找出借书超过5本的读者,输出借书卡号及所借图书册数。
3.查询借阅了"水浒"一书的读者,输出姓名及班级。
4.查询过期未还图书,输出借阅者(卡号)、书号及还书日期。
5.查询书名包括"网络"关键词的图书,输出书号、书名、作者。
6.查询现有图书中价格最高的图书,输出书名及作者。
7.查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。
8.将"C01"班同学所借图书的还期都延长一周。
9.从BOOKS表中删除当前无人借阅的图书记录。
10.如果经常按书名查询图书信息,请建立合适的索引。
11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SA VE表中(注ORROW_SA VE表结构同BORROW表)。
12.建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)。
13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。
14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句。
SQL语句练习
SQL语句练习单表练习employee表:create table employee(id int,name varchar(20),sex varchar(10),birthday date,salary float,resume text);insert into employee values(1,"zhangsan","male","1980-11-25",2000,"good body"); insert into employee values(2,"lisi","male","1980-04-25",1000,"good body");insert into employee values(3,"xiaohong","female","1978-11-25",4000,"good girl");1.将所有员⼯薪⽔修改为5000元。
2.将姓名为’zhangsan’的员⼯薪⽔修改为3000元。
3.将姓名为’lisi’的员⼯薪⽔修改为4000元,sex改为female。
4.将xiaohong的薪⽔在原有基础上增加1000元。
答案:/*将所有员⼯薪⽔修改为5000元。
*/UPDATE employee SET salary=5000;SELECT * FROM employee;/*将姓名为’zhangsan’的员⼯薪⽔修改为3000元。
*/UPDATE employee SET salary=3000 WHERE NAME='zhangsan';SELECT * FROM employee;/*将姓名为’lisi’的员⼯薪⽔修改为4000元,sex改为female。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PL/SQL(Procedural Language/SQL)是Oracle在标准SQL语言上的过程性扩展。
SQL(Structure Query Language)结构化查询语言,是应用程序与数据库进行交互操作的接口。
将数据查询(Data Query)、数据操纵(Data Manipulation)、数据定义(Data Definition)和数据控制(Data Control)功能集于一体。
SQL的特点:字符值和日期值区分大小写。
当在SQL语句中引用字符值和日期值时,需要给出正确的大小写数据,否则不能返回正确的信息。
PL/SQL的例子,如果应用程序需要取得雇员的工资,那么可以建立函数实现改功能。
Eg:
CREATE FUNCTION get_sal(no NUMBER)
RETRUN NUMBER IS
Salary NUMBER(6,2)
BEGIN
SELECT sal INTO salary FROM emp WHERE empno=no;
RETURN salary;
END;
/
DECLARE
name varchar2(10);
BEGIN
SELECT ename INTO name FROM emp WHERE empno=&no;
Dbms_output.put_line(name);
EXCEPTION
WHEN NO_DA TA_FOUND THEN
dbms_output.put_line(‘该雇员不存在’);
END;
/
第一种:sqlplus工具
Sqlplus [username]/[password][@server]
其中username用于指定数据库用户名,password用于指定用户口令,而server则用于指定主机字符串(网络服务名)。
当链接到本地数据库时,不需要提供网络服务名。
PL/SQL块由三部分组成:定义部分、执行部分、例外处理部分。
其中定义部分用于定义常量、变量、游标、例外、复杂数据类型等;执行部分用于实现应用模块功能,该部分包含了要执行的PL/SQL语句和SQL语句;例外处理部分用于处理执行部分可能出现的运行错误。
DECLARE 该部分是可选的;
/* */
BEGIN 该部分是必须的;
/* */
EXCEPTION 该部分是可选的
/* */
END;
实例一:只包含执行部分的PL/SQL块;
Set serveroutput on
BEGIN
Dbms_output.putline(‘Hello,everyone!’);
END;
其中dbms_output是Oracle所提供的系统包。
Put_line是该包中所包含的过程,用于输出字符串信息。
实例二:包含定义部分和执行部分的PL/SQL块;
DECLARE
V_ename V ARCHAR2(5);
BEGIN
SELECT ename INTO v_ename FROM emp
WHERE empno=&no;
Dbms_output.putline(‘雇员名:’||v_ename);
END;
/
-----------
DECLARE
V_ename V ARCHAR2(5);
BEGIN
SELECT ename INTO v_ename FROM emp
WHERE empno=&no;
Dbms_output.putline(‘雇员名:’||v_ename);
EXCEPTION
WHEN NO_DATA_FOUND THEN
Dbms_output.putline(‘请输入正确的雇员号!’)
END;
/
其中NO_DA TA_FOUND 是系统PLSQL中的预定义的例外!
命名块《outer》《inner》两个层次
过程
可以使用CREATE PROCEDURE命令建立过程。
CREATE PROCEDURE update_sal(name VARCHAR2,newsal NUMBER)
IS
BEGIN
UPDATE emp SET sal=newsal
WHERE lower(ename)=lower(name);
END;
/
函数
函数用于返回特定数据。
当建立函数时,在函数头部必须包含RETURN子句,而在函数体内必须要包含RETURN语句返回数据。
CREATE FUNCTION annual_income(name V ARCHAR2)
RETURN NUMBER IS
Annual_salary NUMBER(7,2);
BEGIN
SELECT sal*12+nvl(comn,0) INTO annual_salary
FROM emp WHERE lower(ename)=lower(name);
RETURN annual_salary;
END;
/
包
包是函数和过程的一个打包过程,可以分为包规范和包体两部分所组成的。
CERATE PACKAGE 命令建立包规范;使用CREATE PACKAGE BODY 命令建立包体。
触发器
触发器是指隐含执行的存储过程。
当定义触发器时,必须要指定触发事件以及触发操纵,常用的触发事件包括INSERT,UPDA TE,DELETE,而触发操纵实际上是一个PLSQL块。
建立触发器可以使用CREATE TRIGGER命令来完成的。
CREATE TRIGGER update_cascade
AFTER UPDA TA OF deptno no dep
FOR EACH ROW
BEGIN
UPDATA emp SET deptno=:new.deptno
WHERE deptno=:old.deptno;
END;
/
(过程)
过程用于执行特定操纵,当建立过程时,既可以指定输入参数(IN),也可以指定输出参数(OUT)。
通过在过程中使用输入参数,可以将应用环境的数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。
可以使用CREA TE PROCEDURE 命令建立过程。
CREATE PROCERURE update_sal(name V ARCHAR2,newsal NUMBER)
IS
BEGIN
UPDATE emp SET sal=newsal
WHERE lower(ename)=lower(name);
END;
/
上述的例子中,用于修改更新雇员的工资,在使用的过程中可以使用execute命令或者call命令来执行。
Exec update_sal(‘scott’,2000)
Call update_sal(‘scott’,2000);
函数
函数用于返回特定的数据,当建立函数时,在函数头部必须包含RETURN子句,而在函数体内必须要包含RETURN语句返回数据。
CREATE RUNCTION annual_income(name V ARCHAR2)
RETURN NUMBER IS
Annual_salary NUMBER(7,2);
BEGIN
SELECT sal*2+nvl(comn,0) INTO annual_salary
FROM emo WHERE lower(ename)=lower(name);
RETURN annual_salary;
END;
/
触发器
触发器是指隐含执行的存储过程。
CREATE TRIGGER update_cascade
AFTER UPDA TE OF depto ON dept
FOR EACH ROW
BEGIN
UPDATE emp SET depto=:new.depto
WHERE depto=:old.depto;
END;
DECLARE
V_ename V ARCHAR2(5);
V_sal NUMBER(6,2);
C_tax_rate CONSTANT NUMBER(3,2):=0.03;
v_tax_sal NUMBER(6,2);
BEGIN
SELECT ename,sal INTO v_ename,v_sal
FROM emp WHERE empno=&eno;
V_tax_sal:=v_sal*c_tax_rate;
Dbms_output.put_line(‘雇员名:’||v_ename);
Dbms_output.put_line(‘雇员工资:’||v_sal);
Dbms_output.put_line(‘所得税:’||v_tax_sal);
END;
/
输入eno的值:7788
雇员名:soctt
使用%TYPE属性
为了避免不必要的错误。
可以使用%TYPE属性定义变量,当使用%TYPE属性定义变量是,它会按照数据库列或者其他变量来确定新变量的类型和长度。
DECLARE
V_ename emp.ename%TYPE;
V_sal emp.sal%TYPE;。