强化-SQL语句强化训练(史上最全最经典,呕血推荐) sql语句练习
SQL语句大全大全(经典珍藏版)
SQL语句大全--语句功能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据-数据定义CREATE TABLE --创建一个数据库表DROP TABLE --从数据库中删除表ALTER TABLE --修改数据库表结构CREATE VIEW --创建一个视图DROP VIEW --从数据库中删除视图CREATE INDEX --为数据库表创建一个索引DROP INDEX --从数据库中删除索引CREATE PROCEDURE --创建一个存储过程DROP PROCEDURE --从数据库中删除存储过程CREATE TRIGGER --创建一个触发器DROP TRIGGER --从数据库中删除触发器CREATE SCHEMA --向数据库添加一个新模式DROP SCHEMA --从数据库中删除一个模式CREATE DOMAIN --创建一个数据值域ALTER DOMAIN --改变域定义DROP DOMAIN --从数据库中删除一个域--数据控制GRANT --授予用户访问权限DENY --拒绝用户访问REVOKE --解除用户访问权限--事务控制COMMIT --结束当前事务ROLLBACK --中止当前事务SET TRANSACTION --定义当前事务数据访问特征--程序化SQLDECLARE --为查询设定游标EXPLAN --为查询描述数据访问计划OPEN --检索查询结果打开一个游标FETCH --检索一行查询结果CLOSE --关闭游标PREPARE --为动态执行准备SQL 语句EXECUTE --动态地执行SQL 语句DESCRIBE --描述准备好的查询---局部变量declare @id char(10)--set @id = '10010001'select @id = '10010001'---全局变量---必须以@@开头--IF ELSEdeclare @x int @y int @z intselect @x = 1 @y = 2 @z=3if @x > @yprint 'x > y' --打印字符串'x > y'else if @y > @zprint 'y > z'else print 'z > y'--CASEuse panguupdate employeeset e_wage =casewhen job_level = .1. then e_wage*1.08 when job_level = .2. then e_wage*1.07 when job_level = .3. then e_wage*1.06 else e_wage*1.05end--WHILE CONTINUE BREAK declare @x int @y int @c intselect @x = 1 @y=1while @x < 3beginprint @x --打印变量x 的值while @y < 3beginselect @c = 100*@x + @yprint @c --打印变量c 的值select @y = @y + 1endselect @x = @x + 1select @y = 1end--WAITFOR--例等待1 小时2 分零3 秒后才执行SELECT 语句waitfor delay .01:02:03.select * from employee--例等到晚上11 点零8 分后才执行SELECT 语句waitfor time .23:08:00.select * from employee***SELECT***select *(列名) from table_name(表名) where column_name operator value ex:(宿主)select * from stock_information where stockid = str(nid)stockname = 'str_name'stockname like '% find this %'stockname like '[a-zA-Z]%' --------- ([]指定值的范围)stockname like '[^F-M]%' --------- (^排除指定范围)--------- 只能在使用like关键字的where子句中使用通配符)or stockpath = 'stock_path'or stocknumber < 1000and stockindex = 24not stock*** = 'man'stocknumber between 20 and 100stocknumber in(10,20,30)order by stockid desc(asc) --------- 排序,desc-降序,asc-升序order by 1,2 --------- by列号stockname = (select stockname from stock_information where stockid = 4)--------- 子查询--------- 除非能确保内层select只返回一个行的值,--------- 否则应在外层where子句中用一个in限定符select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_nameselect stockname , "stocknumber" = count(*) from table_name group by stockname--------- group by 将表按行分组,指定列中有相同的值having count(*) = 2 --------- having选定指定的组select *from table1, table2where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示table1.id =* table2.id -------- 右外部连接select stockname from table1union [all] ----- union合并查询结果集,all-保留重复行select stockname from table2***insert***insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")value (select Stockname , Stocknumber from Stock_table2)---value为select语句***update***update table_name set Stockname = "xxx" [where Stockid = 3]Stockname = defaultStockname = nullStocknumber = Stockname + 4***delete***delete from table_name where Stockid = 3truncate table_name ----------- 删除表中所有行,仍保持表的完整性drop table table_name --------------- 完全删除表***alter table*** --- 修改数据库表结构alter table database.owner.table_name add column_name char(2) null .....sp_help table_name ---- 显示表已有特征create table table_name (name char(20), age smallint, lname varchar(30))insert into table_name select ......... ----- 实现删除列的方法(创建新表)alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束***function(/*常用函数*/)***----统计函数----A VG --求平均值COUNT --统计数目MAX --求最大值MIN --求最小值SUM --求和--AVGuse panguselect avg(e_wage) as dept_avgWagefrom employeegroup by dept_id--MAX--求工资最高的员工姓名use panguselect e_namefrom employeewhere e_wage =(select max(e_wage)from employee)--STDEV()--STDEV()函数返回表达式中所有数据的标准差--STDEVP()--STDEVP()函数返回总体标准差--VAR()--VAR()函数返回表达式中所有值的统计变异数--VARP()--VARP()函数返回总体变异数----算术函数----/***三角函数***/SIN(float_expression) --返回以弧度表示的角的正弦COS(float_expression) --返回以弧度表示的角的余弦TAN(float_expression) --返回以弧度表示的角的正切COT(float_expression) --返回以弧度表示的角的余切/***反三角函数***/ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角ATAN2(float_expression1,float_expression2)--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角DEGREES(numeric_expression)--把弧度转换为角度返回与表达式相同的数据类型可为--INTEGER/MONEY/REAL/FLOAT 类型RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为--INTEGER/MONEY/REAL/FLOAT 类型EXP(float_expression) --返回表达式的指数值LOG(float_expression) --返回表达式的自然对数值LOG10(float_expression)--返回表达式的以10 为底的对数值SQRT(float_expression) --返回表达式的平方根/***取近似值函数***/CEILING(numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT 类型FLOOR(numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT 类型ROUND(numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型ABS(numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT 类型SIGN(numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型--与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型PI() --返回值为π即3.1415926535897936RAND([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数----字符串函数----ASCII() --函数返回字符表达式最左端字符的ASCII 码值CHAR() --函数用于将ASCII 码转换为字符--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值LOWER() --函数把字符串全部转换为小写UPPER() --函数把字符串全部转换为大写STR() --函数把数值型数据转换为字符型数据LTRIM() --函数把字符串头部的空格去掉RTRIM() --函数把字符串尾部的空格去掉LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串CHARINDEX(),PA TINDEX() --函数返回字符串中某个指定的子串出现的开始位置SOUNDEX() --函数返回一个四位字符码--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异--0 两个SOUNDEX 函数返回值的第一个字符不同--1 两个SOUNDEX 函数返回值的第一个字符相同--2 两个SOUNDEX 函数返回值的第一二个字符相同--3 两个SOUNDEX 函数返回值的第一二三个字符相同--4 两个SOUNDEX 函数返回值完全相同QUOTENAME() --函数返回被特定字符括起来的字符串/*select quotename('abc', '{') quotename('abc')运行结果如下----------------------------------{{abc} [abc]*/REPLICATE() --函数返回一个重复character_expression 指定次数的字符串/*select replicate('abc', 3) replicate( 'abc', -2)运行结果如下----------- -----------abcabcabc NULL*/REVERSE() --函数将指定的字符串的字符排列顺序颠倒REPLACE() --函数返回被替换了指定子串的字符串/*select replace('abc123g', '123', 'def')运行结果如下----------- -----------abcdefg*/SPACE() --函数返回一个有指定长度的空白字符串STUFF() --函数用另一子串替换字符串指定位置长度的子串----数据类型转换函数----CAST() 函数语法如下CAST() (<expression> AS <data_ type>[ length ])CONVERT() 函数语法如下CONVERT() (<data_ type>[ length ], <expression> [, style])select cast(100+99 as char) convert(varchar(12), getdate())运行结果如下------------------------------ ------------199 Jan 15 2000----日期函数----DAY() --函数返回date_expression 中的日期值MONTH() --函数返回date_expression 中的月份值YEAR() --函数返回date_expression 中的年份值DA TEADD(<datepart> ,<number> ,<date>)--函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期DA TEDIFF(<datepart> ,<number> ,<date>)--函数返回两个指定日期在datepart 方面的不同之处DA TENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分DA TEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分GETDA TE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间----系统函数----APP_NAME() --函数返回当前执行的应用程序的名称COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值COL_LENGTH(<'table_name'>, <'column_name'>) --函数返回表中指定字段的长度值COL_NAME(<table_id>, <column_id>) --函数返回表中指定字段的名称即列名DA TALENGTH() --函数返回数据表达式的数据的实际长度DB_ID(['database_name']) --函数返回数据库的编号DB_NAME(database_id) --函数返回数据库的名称HOST_ID() --函数返回服务器端计算机的名称HOST_NAME() --函数返回服务器端计算机的名称IDENTITY(<data_type>[, seed increment]) [AS column_name])--IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中/*select identity(int, 1, 1) as column_nameinto newtablefrom oldtable*/ISDATE() --函数判断所给定的表达式是否为合理日期ISNULL(<check_expression>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换ISNUMERIC() --函数判断所给定的表达式是否为合理的数值NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值NULLIF(<expression1>, <expression2>)--NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值sql中的保留字action add aggregate allalter after and asasc avg avg_row_length auto_incrementbetween bigint bit binaryblob bool both bycascade case char characterchange check checksum columncolumns comment constraint createcross current_date current_time current_timestampdata database databases datedatetime day day_hour day_minuteday_second dayofmonth dayofweek dayofyeardec decimal default delayeddelay_key_write delete desc describedistinct distinctrow double dropend else escape escapedenclosed enum explain existsfields file first floatfloat4 float8 flush foreignfrom for full functionglobal grant grants grouphaving heap high_priority hourhour_minute hour_second hosts identifiedignore in index infileinner insert insert_id intinteger interval int1 int2int3 int4 int8 intoif is isam joinkey keys kill last_insert_idleading left length likelines limit load locallock logs long longbloblongtext low_priority max max_rowsmatch mediumblob mediumtext mediumintmiddleint min_rows minute minute_secondmodify month monthname myisamnatural numeric no notnull on optimize optionoptionally or order outeroutfile pack_keys partial passwordprecision primary procedure processprocesslist privileges read realreferences reload regexp renamereplace restrict returns revokerlike row rows secondselect set show shutdownsmallint soname sql_big_tables sql_big_selectssql_low_priority_updates sql_log_off sql_log_update sql_select_limit sql_small_result sql_big_result sql_warnings straight_joinstarting status string tabletables temporary terminated textthen time timestamp tinyblobtinytext tinyint trailing totype use using uniqueunlock unsigned update usagevalues varchar variables varyingvarbinary with write whenwhere year year_month zerofill查看全文常用SQL命令和ASP编程在进行数据库操作时,无非就是添加、删除、修改,这得设计到一些常用的SQL 语句,如下:SQL常用命令使用方法:(1) 数据记录筛选:sql="select * from 数据表where 字段名=字段值order by 字段名[desc]"sql="select * from 数据表where 字段名like %字段值% order by 字段名[desc]"sql="select top 10 * from 数据表where 字段名order by 字段名[desc]"sql="select * from 数据表where 字段名in (值1,值2,值3)"sql="select * from 数据表where 字段名between 值1 and 值2"(2) 更新数据记录:sql="update 数据表set 字段名=字段值where 条件表达式"sql="update 数据表set 字段1=值1,字段2=值2 ……字段n=值n where 条件表达式"(3) 删除数据记录:sql="delete from 数据表where 条件表达式"sql="delete from 数据表" (将数据表所有记录删除)(4) 添加数据记录:sql="insert into 数据表(字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"sql="insert into 目标数据表select * from 源数据表" (把源数据表的记录添加到目标数据表)(5) 数据记录统计函数:A VG(字段名) 得出一个表格栏平均值COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计MAX(字段名) 取得一个表格栏最大的值MIN(字段名) 取得一个表格栏最小的值SUM(字段名) 把数据栏的值相加引用以上函数的方法:sql="select sum(字段名) as 别名from 数据表where 条件表达式"set rs=conn.excute(sql)用rs("别名") 获取统的计值,其它函数运用同上。
SQL语句权威教程(超级经典)
SQL语句经典教程SQL常用指令包含以下几个部分:♦ SQL 指令: SQL 如何被用来储存、读取、以及处理数据库之中的资料。
♦表格处理: SQL 如何被用来处理数据库中的表格。
♦进阶SQL: 介绍SQL 进阶概念,以及如何用SQL 来执行一些较复杂的运算。
♦ SQL 语法: 这一页列出所有在这个教材中被提到的SQL 语法。
对于每一个指令,我们将会先列出及解释这个指令的语法,然后用一个例子来让读者了解这个指令是如何被运用的。
当您读完了这个网站的所有教材后,您将对SQL 的语法会有一个大致上的了解。
另外,您将能够正确地运用SQL 来由数据库中获取信息。
笔者本身的经验是,虽然要对SQL 有很透彻的了解并不是一朝一夕可以完成的,可是要对SQL 有个基本的了解并不难。
希望在看完这个网站后,您也会有同样的想法。
SQL指令SELECT是用来做什么的呢?一个最常用的方式是将资料从数据库中的表格内选出。
从这一句回答中,我们马上可以看到两个关键字:从(FROM) 数据库中的表格内选出(SELECT)。
(表格是一个数据库内的结构,它的目的是储存资料。
在表格处理这一部分中,我们会提到如何使用SQL 来设定表格。
) 我们由这里可以看到最基本的SQL 架构:SELECT "栏位名" FROM "表格名"我们用以下的例子来看看实际上是怎么用的。
假设我们有以下这个表格:store_name Sales DateLos Angeles $1500 Jan-05-1999San Diego $250 Jan-07-1999Los Angeles $300 Jan-08-1999Boston $700 Jan-08-1999若要选出所有的店名(store_Name),我们就打入:SELECT store_name FROM Store_Information结果:store_nameLos AngelesSan DiegoLos AngelesBoston我们一次可以读取好几个栏位,也可以同时由好几个表格中选资料。
数据库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 的影星。
SQL语句练习题(精品文档)
S Q L语言一、选择题1.S Q L语言是()的语言,容易学习。
A.过程化B.非过程化C.格式化D.导航式2. S Q L语言的数据操纵语句包括S E L E C T、I N S E R T、U P D A T E、D E L E T E等。
其中最重要的,也是使用最频繁的语句是()。
A.S E L E C TB.I N S E R TC.U P D A T ED.D E L E T E3.在视图上不能完成的操作是()。
A.更新视图B.查询C.在视图上定义新的表D.在视图上定义新的视图4.S Q L语言集数据查询、数据操纵、数据定义和数据控制功能于一体,其中,C R E A T E、D R O P、A L T E R语句是实现哪种功能()。
A.数据查询B.数据操纵C.数据定义D.数据控制5.S Q L语言中,删除一个视图的命令是()。
A.D E L E T EB.D R O PC.C L E A RD.R E M O V E6.在S Q L语言中的视图V I E W是数据库的()。
A.外模式B.模式C.内模式D.存储模式7.下列的S Q L语句中,()不是数据定义语句。
A.C R E A T E T A B L EB.D R O P V I E WC.C R E A T E V I E WD.G R A N T8.若要撤销数据库中已经存在的表S,可用()。
A.D E L E T E T A B L E SB.D E L E T E SC.D R O P T A B L E SD.D R O P S9.若要在基本表S中增加一列C N(课程名),可用()。
A.A D D T A B L E S(C N C H A R(8))B.A D D T A B L E S A L T E R(C N C H A R(8))C.A L T E R T A B L E S A D D(C N C H A R(8))D.A L T E R T A B L E S(A D D C N C H A R(8))10.学生关系模式S(S#,S n a m e,S e x,A g e),S的属性分别表示学生的学号、姓名、性别、年龄。
MySQL经典练习题及答案,常用SQL语句练习50题
MySQL经典练习题及答案,常⽤SQL语句练习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) –学⽣编号,课程编号,分数测试数据#–1.学⽣表#Student(s_id,s_name,s_birth,s_sex) –学⽣编号,学⽣姓名, 出⽣年⽉,学⽣性别CREATE TABLE `Student` (`s_id` VARCHAR(20),s_name VARCHAR(20) NOT NULL DEFAULT'',s_brith VARCHAR(20) NOT NULL DEFAULT'',s_sex VARCHAR(10) NOT NULL DEFAULT'',PRIMARY KEY(s_id));#–2.课程表#Course(c_id,c_name,t_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));/*–3.教师表Teacher(t_id,t_name) –教师编号,教师姓名*/CREATE TABLE Teacher(t_id VARCHAR(20),t_name VARCHAR(20) NOT NULL DEFAULT'',PRIMARY KEY(t_id));/*–4.成绩表Score(s_id,c_id,s_score) –学⽣编号,课程编号,分数*/Create table Score(s_id VARCHAR(20),c_id VARCHAR(20) not null default'',s_score INT(3),primary key(`s_id`,`c_id`));插⼊数据#--插⼊学⽣表测试数据#('01' , '赵雷' , '1990-01-01' , '男')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);练习题和sql语句1、查询"01"课程⽐"02"课程成绩⾼的学⽣的信息及课程分数-- 1、查询"01"课程⽐"02"课程成绩⾼的学⽣的信息及课程分数select a.*,b.s_score as score01,c.s_score as score02 FROM student a JOIN score b ON a.s_id=b.s_id and b.c_id='01' LEFT JOIN score c on a.s_id=c.s_id and c.c_id='02' or c.c_id = NULL WHERE b.s_score>c.s_score ;2、查询"01"课程⽐"02"课程成绩低的学⽣的信息及课程分数-- 2、查询"01"课程⽐"02"课程成绩低的学⽣的信息及课程分数select a.* ,b.s_score as 01_score,c.s_score as 02_score fromstudent a left join score b on a.s_id=b.s_id and b.c_id='01'or b.c_id=NULL join score c on a.s_id=c.s_id and c.c_id='02'where b.s_score<c.s_score-- 3、查询平均成绩⼤于等于60分的同学的学⽣编号和学⽣姓名和平均成绩select b.s_id,b.s_name,ROUND(AVG(a.s_score),2) as avg_score fromstudent bjoin score a on b.s_id = a.s_idGROUP BY b.s_id,b.s_name HAVING ROUND(AVG(a.s_score),2)>=60;-- 4、查询平均成绩⼩于60分的同学的学⽣编号和学⽣姓名和平均成绩-- (包括有成绩的和⽆成绩的)select b.s_id,b.s_name,ROUND(AVG(a.s_score),2) as avg_score fromstudent bleft join score a on b.s_id = a.s_idGROUP BY b.s_id,b.s_name HAVING ROUND(AVG(a.s_score),2)<60unionselect a.s_id,a.s_name,0as avg_score fromstudent awhere a.s_id not in (select distinct s_id from score);-- 5、查询所有同学的学⽣编号、学⽣姓名、选课总数、所有课程的总成绩select a.s_id,a.s_name,count(b.c_id) as sum_course,sum(b.s_score) as sum_score fromstudent aleft join score b on a.s_id=b.s_idGROUP BY a.s_id,a.s_name;-- 6、查询"李"姓⽼师的数量select count(t_id) from teacher where t_name like'李%';-- 7、查询学过"张三"⽼师授课的同学的信息select a.*fromstudent ajoin score b on a.s_id=b.s_id where b.c_id in(select c_id from course where t_id =(select t_id from teacher where t_name ='张三'));-- 8、查询没学过"张三"⽼师授课的同学的信息select*fromstudent cwhere c.s_id not in(select a.s_id from student a join score b on a.s_id=b.s_id where b.c_id in(select c_id from course where t_id =(select t_id from teacher where t_name ='张三')));-- 9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息select a.*fromstudent a,score b,score cwhere a.s_id = b.s_id and a.s_id = c.s_id and b.c_id='01'and c.c_id='02';-- 10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息select a.*fromstudent awhere a.s_id in (select s_id from score where c_id='01' ) and a.s_id not in(select s_id from score where c_id='02')-- 11、查询没有学全所有课程的同学的信息select s.*fromstudent s where s.s_id in(select s_id from score where s_id not in(select a.s_id from score ajoin score b on a.s_id = b.s_id and b.c_id='02'join score c on a.s_id = c.s_id and c.c_id='03'where a.c_id='01'))-- 12、查询⾄少有⼀门课与学号为"01"的同学所学相同的同学的信息select*from student where s_id in(select distinct a.s_id from score a where a.c_id in(select a.c_id from score a where a.s_id='01'));-- 13、查询和"01"号的同学学习的课程完全相同的其他同学的信息select a.*from student a where a.s_id in(select distinct s_id from score where s_id!='01'and c_id in(select c_id from score where s_id='01')group by s_idhaving count(1)=(select count(1) from score where s_id='01'));-- 14、查询没学过"张三"⽼师讲授的任⼀门课程的学⽣姓名select a.s_name from student a where a.s_id not in (select s_id from score where c_id =(select c_id from course where t_id =(select t_id from teacher where t_name ='张三'))group by s_id);-- 15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩select a.s_id,a.s_name,ROUND(AVG(b.s_score)) fromstudent aleft join score b on a.s_id = b.s_idwhere a.s_id in(select s_id from score where s_score<60GROUP BY s_id having count(1)>=2)GROUP BY a.s_id,a.s_name-- 16、检索"01"课程分数⼩于60,按分数降序排列的学⽣信息select a.*,b.c_id,b.s_score fromstudent a,score bwhere a.s_id = b.s_id and b.c_id='01'and b.s_score<60ORDER BY b.s_score DESC;-- 17、按平均成绩从⾼到低显⽰所有学⽣的所有课程的成绩以及平均成绩select a.s_id,(select s_score from score where s_id=a.s_id and c_id='01') as语⽂,(select s_score from score where s_id=a.s_id and c_id='02') as数学,(select s_score from score where s_id=a.s_id and c_id='03') as英语,round(avg(s_score),2) as平均分from score a GROUP BY a.s_id ORDER BY平均分DESC;-- 18.查询各科成绩最⾼分、最低分和平均分:以如下形式显⽰:课程ID,课程name,最⾼分,最低分,平均分,及格率,中等率,优良率,优秀率--及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90select a.c_id,b.c_name,MAX(s_score),MIN(s_score),ROUND(AVG(s_score),2),ROUND(100*(SUM(case when a.s_score>=60then1else0end)/SUM(case when a.s_score then1else0end)),2) as及格率,ROUND(100*(SUM(case when a.s_score>=70and a.s_score<=80then1else0end)/SUM(case when a.s_score then1else0end)),2) as中等率, ROUND(100*(SUM(case when a.s_score>=80and a.s_score<=90then1else0end)/SUM(case when a.s_score then1else0end)),2) as优良率, ROUND(100*(SUM(case when a.s_score>=90then1else0end)/SUM(case when a.s_score then1else0end)),2) as优秀率from score a left join course b on a.c_id = b.c_id GROUP BY a.c_id,b.c_name-- 19、按各科成绩进⾏排序,并显⽰排名(实现不完全)-- mysql没有rank函数select a.s_id,a.c_id,@i:=@i+1as i保留排名,@k:=(case when@score=a.s_score then@k else@i end) as rank不保留排名,@score:=a.s_score as scorefrom (select s_id,c_id,s_score from score WHERE c_id='01'GROUP BY s_id,c_id,s_score ORDER BY s_score DESC)a,(select@k:=0,@i:=0,@score:=0)sunionselect a.s_id,a.c_id,@i:=@i+1as i,@k:=(case when@score=a.s_score then@k else@i end) as rank,@score:=a.s_score as scorefrom (select s_id,c_id,s_score from score WHERE c_id='02'GROUP BY s_id,c_id,s_score ORDER BY s_score DESC)a,(select@k:=0,@i:=0,@score:=0)sunionselect a.s_id,a.c_id,@i:=@i+1as i,@k:=(case when@score=a.s_score then@k else@i end) as rank,@score:=a.s_score as scorefrom (select s_id,c_id,s_score from score WHERE c_id='03'GROUP BY s_id,c_id,s_score ORDER BY s_score DESC)a,(select@k:=0,@i:=0,@score:=0)s-- 20、查询学⽣的总成绩并进⾏排名select a.s_id,@i:=@i+1as i,@k:=(case when@score=a.sum_score then@k else@i end) as rank,@score:=a.sum_score as scorefrom (select s_id,SUM(s_score) as sum_score from score GROUP BY s_id ORDER BY sum_score DESC)a,(select@k:=0,@i:=0,@score:=0)s-- 21、查询不同⽼师所教不同课程平均分从⾼到低显⽰select a.t_id,c.t_name,a.c_id,ROUND(avg(s_score),2) as avg_score from course aleft join score b on a.c_id=b.c_idleft join teacher c on a.t_id=c.t_idGROUP BY a.c_id,a.t_id,c.t_name ORDER BY avg_score DESC;-- 22、查询所有课程的成绩第2名到第3名的学⽣信息及该课程成绩select d.*,c.排名,c.s_score,c.c_id from (select a.s_id,a.s_score,a.c_id,@i:=@i+1as排名from score a,(select@i:=0)s where a.c_id='01')cleft join student d on c.s_id=d.s_idwhere排名BETWEEN2AND3UNIONselect d.*,c.排名,c.s_score,c.c_id from (select a.s_id,a.s_score,a.c_id,@j:=@j+1as排名from score a,(select@j:=0)s where a.c_id='02')cleft join student d on c.s_id=d.s_idwhere排名BETWEEN2AND3UNIONselect d.*,c.排名,c.s_score,c.c_id from (select a.s_id,a.s_score,a.c_id,@k:=@k+1as排名from score a,(select@k:=0)s where a.c_id='03')cleft join student d on c.s_id=d.s_idwhere排名BETWEEN2AND3;-- 23、统计各科成绩各分数段⼈数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分⽐select distinct f.c_name,a.c_id,b.`85-100`,b.百分⽐,c.`70-85`,c.百分⽐,d.`60-70`,d.百分⽐,e.`0-60`,e.百分⽐from score a left join (select c_id,SUM(case when s_score >85and s_score <=100then1else0end) as `85-100`,ROUND(100*(SUM(case when s_score >85and s_score <=100then1else0end)/count(*)),2) as百分⽐from score GROUP BY c_id)b on a.c_id=b.c_idleft join (select c_id,SUM(case when s_score >70and s_score <=85then1else0end) as `70-85`,ROUND(100*(SUM(case when s_score >70and s_score <=85then1else0end)/count(*)),2) as百分⽐from score GROUP BY c_id)c on a.c_id=c.c_idleft join (select c_id,SUM(case when s_score >60and s_score <=70then1else0end) as `60-70`,ROUND(100*(SUM(case when s_score >60and s_score <=70then1else0end)/count(*)),2) as百分⽐from score GROUP BY c_id)d on a.c_id=d.c_idleft join (select c_id,SUM(case when s_score >=0and s_score <=60then1else0end) as `0-60`,ROUND(100*(SUM(case when s_score >=0and s_score <=60then1else0end)/count(*)),2) as百分⽐from score GROUP BY c_id)e on a.c_id=e.c_idleft join course f on a.c_id = f.c_id-- 24、查询学⽣平均成绩及其名次select a.s_id,@i:=@i+1as'不保留空缺排名',@k:=(case when@avg_score=a.avg_s then@k else@i end) as'保留空缺排名',@avg_score:=avg_s as'平均分'from (select s_id,ROUND(AVG(s_score),2) as avg_s from score GROUP BY s_id)a,(select@avg_score:=0,@i:=0,@k:=0)b;-- 25、查询各科成绩前三名的记录-- 1.选出b表⽐a表成绩⼤的所有组-- 2.选出⽐当前id成绩⼤的⼩于三个的select a.s_id,a.c_id,a.s_score from score aleft join score b on a.c_id = b.c_id and a.s_score<b.s_scoregroup by a.s_id,a.c_id,a.s_score HAVING COUNT(b.s_id)<3ORDER BY a.c_id,a.s_score DESC-- 26、查询每门课程被选修的学⽣数select c_id,count(s_id) from score a GROUP BY c_id-- 27、查询出只有两门课程的全部学⽣的学号和姓名select s_id,s_name from student where s_id in(select s_id from score GROUP BY s_id HAVING COUNT(c_id)=2);-- 28、查询男⽣、⼥⽣⼈数select s_sex,COUNT(s_sex) as⼈数from student GROUP BY s_sex-- 29、查询名字中含有"风"字的学⽣信息select*from student where s_name like'%风%';-- 30、查询同名同性学⽣名单,并统计同名⼈数select a.s_name,a.s_sex,count(*) from student a JOINstudent b on a.s_id !=b.s_id and a.s_name = b.s_name and a.s_sex = b.s_sexGROUP BY a.s_name,a.s_sex-- 31、查询1990年出⽣的学⽣名单select s_name from student where s_birth like'1990%'-- 32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列select c_id,ROUND(AVG(s_score),2) as avg_score from score GROUP BY c_id ORDER BY avg_score DESC,c_id ASC -- 33、查询平均成绩⼤于等于85的所有学⽣的学号、姓名和平均成绩select a.s_id,b.s_name,ROUND(avg(a.s_score),2) as avg_score from score aleft join student b on a.s_id=b.s_id GROUP BY s_id HAVING avg_score>=85-- 34、查询课程名称为"数学",且分数低于60的学⽣姓名和分数select a.s_name,b.s_score from score b LEFT JOIN student a on a.s_id=b.s_id where b.c_id=(select c_id from course where c_name ='数学') and b.s_score<60-- 35、查询所有学⽣的课程及分数情况;select a.s_id,a.s_name,SUM(case c.c_name when'语⽂'then b.s_score else0end) as'语⽂',SUM(case c.c_name when'数学'then b.s_score else0end) as'数学',SUM(case c.c_name when'英语'then b.s_score else0end) as'英语',SUM(b.s_score) as'总分'from student a left join score b on a.s_id = b.s_idleft join course c on b.c_id = c.c_idGROUP BY a.s_id,a.s_name-- 36、查询任何⼀门课程成绩在70分以上的姓名、课程名称和分数;select a.s_name,b.c_name,c.s_score from course b left join score c on b.c_id = c.c_idleft join student a on a.s_id=c.s_id where c.s_score>=70-- 37、查询不及格的课程select a.s_id,a.c_id,b.c_name,a.s_score from score a left join course b on a.c_id = b.c_idwhere a.s_score<60--38、查询课程编号为01且课程成绩在80分以上的学⽣的学号和姓名;select a.s_id,b.s_name from score a LEFT JOIN student b on a.s_id = b.s_idwhere a.c_id ='01'and a.s_score>80-- 39、求每门课程的学⽣⼈数select count(*) from score GROUP BY c_id;-- 40、查询选修"张三"⽼师所授课程的学⽣中,成绩最⾼的学⽣信息及其成绩-- 查询⽼师idselect c_id from course c,teacher d where c.t_id=d.t_id and d.t_name='张三'-- 查询最⾼分(可能有相同分数)select MAX(s_score) from score where c_id='02'-- 查询信息select a.*,b.s_score,b.c_id,c.c_name from student aLEFT JOIN score b on a.s_id = b.s_idLEFT JOIN course c on b.c_id=c.c_idwhere b.c_id =(select c_id from course c,teacher d where c.t_id=d.t_id and d.t_name='张三')and b.s_score in (select MAX(s_score) from score where c_id='02')-- 41、查询不同课程成绩相同的学⽣的学⽣编号、课程编号、学⽣成绩select DISTINCT b.s_id,b.c_id,b.s_score from score a,score b where a.c_id != b.c_id and a.s_score = b.s_score-- 42、查询每门功成绩最好的前两名-- ⽜逼的写法select a.s_id,a.c_id,a.s_score from score awhere (select COUNT(1) from score b where b.c_id=a.c_id and b.s_score>=a.s_score)<=2ORDER BY a.c_id-- 43、统计每门课程的学⽣选修⼈数(超过5⼈的课程才统计)。
SQL经典50题练习
创建表及插⼊数据学⽣表Studentcreate table SC(SId varchar(10),CId varchar(10),score decimal(18,1));insert into SC values('01' , '01' , 80);insert into SC values('01' , '02' , 90);insert into SC values('01' , '03' , 99);insert into SC values('02' , '01' , 70);insert into SC values('02' , '02' , 60);insert into SC values('02' , '03' , 80);insert into SC values('03' , '01' , 80);insert into SC values('03' , '02' , 80);insert into SC values('03' , '03' , 80);insert into SC values('04' , '01' , 50);insert into SC values('04' , '02' , 30);insert into SC values('04' , '03' , 20);insert into SC values('05' , '01' , 76);insert into SC values('05' , '02' , 87);insert into SC values('06' , '01' , 31);insert into SC values('06' , '03' , 34);insert into SC values('07' , '02' , 89);insert into SC values('07' , '03' , 98);练习题⽬1. 查询" 01 "课程⽐" 02 "课程成绩⾼的学⽣的信息及课程分数1.1 查询同时存在" 01 "课程和" 02 "课程的情况1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显⽰为 null )1.3 查询不存在" 01 "课程但存在" 02 "课程的情况2. 查询平均成绩⼤于等于 60 分的同学的学⽣编号和学⽣姓名和平均成绩3. 查询在 SC 表存在成绩的学⽣信息4. 查询所有同学的学⽣编号、学⽣姓名、选课总数、所有课程的总成绩(没成绩的显⽰为 null )4.1 查有成绩的学⽣信息5. 查询「李」姓⽼师的数量6. 查询学过「张三」⽼师授课的同学的信息7. 查询没有学全所有课程的同学的信息8. 查询⾄少有⼀门课与学号为" 01 "的同学所学相同的同学的信息9. 查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息10. 查询没学过"张三"⽼师讲授的任⼀门课程的学⽣姓名11. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩12. 检索" 01 "课程分数⼩于 60,按分数降序排列的学⽣信息13. 按平均成绩从⾼到低显⽰所有学⽣的所有课程的成绩以及平均成绩14. 查询各科成绩最⾼分、最低分和平均分:以如下形式显⽰:课程 ID,课程 name,最⾼分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90要求输出课程号和选修⼈数,查询结果按⼈数降序排列,若⼈数相同,按课程号升序排列15. 按各科成绩进⾏排序,并显⽰排名, Score 重复时保留名次空缺15. 按各科成绩进⾏排序,并显⽰排名, Score 重复时保留名次空缺15.1 按各科成绩进⾏排序,并显⽰排名, Score 重复时合并名次16. 查询学⽣的总成绩,并进⾏排名,总分重复时保留名次空缺16.1 查询学⽣的总成绩,并进⾏排名,总分重复时不保留名次空缺17. 统计各科成绩各分数段⼈数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分⽐18. 查询各科成绩前三名的记录19. 查询每门课程被选修的学⽣数20. 查询出只选修两门课程的学⽣学号和姓名21. 查询男⽣、⼥⽣⼈数22. 查询名字中含有「风」字的学⽣信息23. 查询同名同性学⽣名单,并统计同名⼈数24. 查询 1990 年出⽣的学⽣名单25. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列26. 查询平均成绩⼤于等于 85 的所有学⽣的学号、姓名和平均成绩27. 查询课程名称为「数学」,且分数低于 60 的学⽣姓名和分数28. 查询所有学⽣的课程及分数情况(存在学⽣没成绩,没选课的情况)29. 查询任何⼀门课程成绩在 70 分以上的姓名、课程名称和分数30. 查询不及格的课程31. 查询课程编号为 01 且课程成绩在 80 分以上的学⽣的学号和姓名32. 求每门课程的学⽣⼈数33. 成绩不重复,查询选修「张三」⽼师所授课程的学⽣中,成绩最⾼的学⽣信息及其成绩34. 成绩有重复的情况下,查询选修「张三」⽼师所授课程的学⽣中,成绩最⾼的学⽣信息及其成 绩35. 查询不同课程成绩相同的学⽣的学⽣编号、课程编号、学⽣成绩36. 查询每门功成绩最好的前两名37. 统计每门课程的学⽣选修⼈数(超过 5 ⼈的课程才统计)。
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强化训练题库一如果训练了五套题库后,能达到60分也不是很容易的哦数据库文件请到百度网盘下载:/s/1qWHg5o4答案请在百度文库中找……/s/1qWHg5o40:数据库还原---5分全部要求使用一条SQL语句1:ColumnValueMax表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列要求一条SQL语句输出结果: --5分2: ColumnValueMax表中D列类型为datetime要求按照年月日输出结果: --5分3: ColumnValueMax表中D列类型为datetime 包含日期与时间要求使用日期函数输出日期为‘“2008-1-2”的纪录 -5分4ColumnValueMax表,里面有3个字段:A语文,B数学,C英语。
其中有4条记录分别表示语文分,数学分,英语分,请用一条sql语句查询出这四条记录并按以下条件显示出来:大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
-5分Dept部门表5:输出按照月份进行汇总的销售额总值 -5分6 统计按照部门进行的统计销售额输出以下结果: -5分6-1 改造以上结果将没有销售额的金额转换为0:() -5分7使用一条SQL语句输出按照部门汇总后的销售额结果为: -5分8:使用一条SQL语句输出至少两个月都有销售额的部门结果为: -5分其中部门2有一月二月的销售记录,部门3有一月三月的销售记录9:CS游戏比赛Result表内容:如果要生成下列结果, 该如何写sql语句? -5分stuInfo学员信息表,stuName NVARCHAR(20) NOT NULL,--学员姓名stuNo NCHAR(6) NOT NULL,--学号stuSex NCHAR(4) NOT NULL,--性别stuAge SMALLINT NOT NULL,--年龄stuSeat SMALLINT IDENTITY(1,1),--座位号stuMark Nvarchar(200 ) --学员特点stuMarks学员考试成绩表ExamNo CHAR(7) NOT NULL, 考试编号stuNo NCHAR(6) NOT NULL, 学号writtenExam SMALLINT NOT NULL, --笔试成绩LabExam SMALLINT NOT NULL --机试成绩stuName ----学员姓名10.3要求输出以下结果:使用一条SQL查询出比李文才的年龄大的学员的信息10.4为了方便按照学员的名称查询学员的考试成绩,在stuMarks表中添加stuName字段,要求使用一条SQL 语句更新stuMarks表中stuName的值-5分10.5要求插入一个新学员,名称叫‘我考牛呀牛’在stuInfo表中,要求插入该学员的考试成绩在StuMarks表中-5分(两条SQL语句,不能手工添加)10.6要求一条SQL语句删除名称叫‘我考牛呀牛’的学员的考试成绩记录stuMarks表中的记录(假定stuMarks中没有stuName字段)。
SQL语句练习及参考答案(2021年整理精品文档)
SQL语句练习及参考答案编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(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 。
SQl强化训练题二
原创:老二牛车教育SQL 强化训练题库二如果训练了五套题库后,能达到60分也不是很容易的哦数据库文件请到百度网盘下载:/s/1c0d9wek答案请在百度文库中找…..0:数据库还原 ---5分全部要求使用一条SQL 语句1:选取B 表中没有而A 表中有的数据,使用连接和子查询,exists 分别输出使用连接输出结果(): --1分 使用子查询输出结果(): --2分 使用exists 输出结果(): --2分2:给定表TradeInfo ,如下数据IDLastUpdateDate UserID1 2007-12-1 0:00:00 12 2007-12-2 0:00:00 13 2007-12-3 0:00:00 14 2008-3-1 0:00:00 25 2008-1-2 0:00:00 26 2008-1-3 0:00:00 2。
省略2-1:给定表TradeInfo 中两个字段ID ,LastUpdateDate ,ID 表示交易号,LastUPdatedate 表示交易时间,UserId 表示用户编号,请使用一句SQL 语句获得最近的交易号--5分2-1:给定表TradeInfo 中两个字段ID ,LastUpdateDate ,ID 表示交易号,LastUPdatedate 表示交易时间,UserId 表示用户编号,请使用一句SQL 语句获得每个用户最近的交易号的列表--5分3:假设一个出版社的数据库中有Books和Authors两个表,分别存储书籍信息和作者信息。
两个表的结构如下:Create table books (ID int, //书籍编号Author int , //作者编号Title varchar(100) //书名)Create table Authors(ID int, //作者编号Name varchar(100) //姓名)Authors books1)请写一句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 语句经典题目
sql 语句经典题目SQL(Structured Query Language)是用于管理关系数据库的标准编程语言。
以下是一些经典的 SQL 题目,可以帮助你提高 SQL 技能:1. 学生成绩查询假设有一个学生数据库,包括学生、课程和成绩等信息。
学生表为`students`,包含列 `id`, `name`, 和 `age`。
课程表为 `courses`,包含列`id`, `name`。
成绩表为 `scores`,包含列 `student_id`, `course_id`, 和`score`。
查询每个学生的姓名、年龄和所有课程的成绩。
2. 员工工资查询假设有一个员工数据库,包括员工、部门和工资等信息。
员工表为`employees`,包含列 `id`, `name`, 和 `department_id`。
部门表为`departments`,包含列 `id`, `name`。
工资表为 `salaries`,包含列`employee_id`, `salary`。
查询每个员工的姓名、所属部门和工资。
3. 商品销售统计假设有一个商品销售数据库,包括商品、销售和购买者等信息。
商品表为 `products`,包含列 `id`, `name`, 和 `price`。
销售表为 `sales`,包含列 `product_id`, `seller_id`, 和 `buyer_id`。
查询每种商品的名称、单价和销售数量,并按销售数量降序排列。
4. 电影评分查询假设有一个电影数据库,包括电影、导演和评分等信息。
电影表为`movies`,包含列 `id`, `title`, 和 `director_id`。
导演表为 `directors`,包含列 `id`, `name`。
评分表为 `ratings`,包含列 `movie_id`, 和 `rating`。
查询每个导演所执导的电影的评分,并计算每个导演的平均评分。
5. 博客文章分类假设有一个博客文章数据库,包括文章、类别和作者等信息。
强化-SQL语句强化训练(史上最全最经典,呕血推荐)sql语句练习
强化-SQL语句强化训练(史上最全最经典,呕血推荐)sql语句练习2010/71. 有4个关系模式如下:出版社(出版社编号,出版社名称);图书(图书编号,书名,出版社编号,定价);作者(作者编号,姓名);著书(图书编号,作者编号,作者排序)注:作者排序=1表示第一作者,依此类推。
用SQL语句,完成第36~39题。
(1).检索所有定价超过20元的书名。
答案:SELECT书名(1分)FROM图书(1分)WHERE定价>20(2分)(2).统计每个出版社图书的平均定价。
答案:SELECT出版社编号,A VG(定价)(2分)FROM图书(1分)GROUP BY出版社编号(1分)(3).将科学出版社的所有图书定价下调5%。
答案:UPDATE图书SET定价=定价*0.95(1分)WHERE出版社编号IN(1分)(SELECT出版社编号FROM出版社(1分)WHERE出版社名称="科学")(1分)【说明】WHERE出版社名称LIKE"科学"也正确。
(4).列出所有图书的书名、第一作者姓名和出版社名称。
答案:SELECT书名,姓名,出版社名称(1分)FROM出版社A,图书B,作者C,著书D(1分)WHEREA.出版社编号=B.出版社编号ANDB.图书编号=D.图书编号(1分)ANDC.作者编号=D.作者编号AND作者排序=1。
(1分)S(SNO,SNAME,AGE,SEX,SDEPT)SC(SNO,CNO,GRADE)C(CNO,CNAME,CDEPT,TNAME)1.试用SQL的查询语句表达下列查询:①检索LIU老师所授课程的课程号和课程名。
②检索年龄大于23岁的男学生的学号和姓名。
③检索至少选修LIU老师所授课程中一门课程的女学生姓名。
④检索W ANG同学不学的课程的课程号。
⑤检索至少选修两门课程的学生学号。
⑥检索全部学生都选修的课程的课程号与课程名。
⑦检索选修课程包含LIU老师所授课程的学生学号。
数据库SQL语句部分练习题
上机实验任务:
1.用数据库SQL Server 2000的服务管理器启动数据库服务;
2.用数据库SQL Server 2000的企业管理器建立一个数据文件名为“姓名拼音_data”、大小50M,数据库名为自己的姓名。
3.利用企业管理器在新建的数据库上,建立教材中学生、课程、成绩表。
4.查看Pubs库的结构,查看Pubs库表的含义。
5.打开数据库SQL Server 2000的查询分析器,完成附录的练习题。
将完成内容保存到文本文件,文件名为班级+姓名(或班级+学号),写清题号不需抄题,提交到教学讨论区本版文件夹内。
附录1:SQL查询练习
说明:请利用SQL SERVER 2000系统自带数据库pubs的用户表,进行SQL 语句的基本练习。
要求按查询要求写出相应的SQL语句并上机验证正确性
附录:常用函数如下表所示(学会使用T-SQL帮助)
表3-1数学函数。
SQL强化练习题.doc
SQL练习题建立数据库名叫“学生课程”建立数据库表:向表中插入数据1.查询学生表中信息2.查询成绩表中的信息3.查询全部学生的所有信息,且姓名输出在左边(第一列)4.查询学生当前的年龄是多少岁5.要求计算教师授课程的学分(设学分=学时数/16)6.要求列出学生所在的所有院系名称7.查询姓,李,的学生情况8.查询成绩不在85到95之间的信息9.列出所有非软件2班的班级名称10.列出课程号在,C802与C806,之间的所有课程信息11.列出无选修课的所有课程的课程名12.列出,高等数学,,操作系统,,编译原理,的全部信息13.要求查询所有2002年元旦前入学的学生名单.()并按年龄排序14.要求查询年龄在19岁以下或者是女生的学生姓名,年龄,性别15.同时按学号(从小到大)和课程号(从大到小)排列出所有学生课程成绩16.从学生表中统计每个班级名称的人数17.统计19岁以上女生的个数18.查询所有年龄的总和19.从成绩表查询最高分,最低分20.要求查询,C801课程的平均分21.统计选修了课程的学生人数(用成绩表)22.根据性别统计学生平均年龄23.根据学生表统计入学年份24.找出入学人数大于3人的年份及人数25.求相同月份入学的人数(不考虑年份)26.筛选出平均成绩在80分以上的课程及平均成绩27.查询学生姓名,课程号,成绩28.列出所有课程的先修课程名称29.查询课程号为C801,并且成绩大于90分的学生姓名,学号和成绩30.查询学生姓名,学号,课程名,成绩31.要求列出选修了高等数学的学生学号,姓名,成绩,课程名33.查询选修了C802,与C807,这2门课程的学生姓名,课程名和成绩34.查询所有与计算机系学生年龄不相同的学生信息35.查询所有年龄大于计算机系的平均年龄的非计算机系学生的学生信息36.查询所有年龄大于计算机系的最小年龄的非计算机系学生的学生信息37.查询所有年龄小于计算机系的最小年龄的非计算机系学生的学生信息38.查询,何珊,所教班级的所有任课教师的姓名,所教班级名39.按年龄降序列出所有超过平均年龄的学生姓名和年龄40.检索学号不是[200108011]且入学月份为8月的学生信息41.列出年龄在18〜20岁之间且选修了高等数学的男同学的详细信息43.统计学生表中一共有多少名20岁以上的女同学44.查找年龄最大和最小的男学生年龄45.计算选修课门数在1门以上的学生号,姓名,选课门数46.计算每个班学生的平均年龄和最小年龄47.列出所有成绩大于学号为200206002的学生平均成绩的学生姓名, 课程名和成绩48.创建一个[简单学生表]要求包含4个字段”学号,姓名,性别和所在院系",-然后将[学生表]中"国际贸易"或者男学生的记录全部插入到简单学生表中,最后显不插入的记录49.列出所有没有选修课程,C804,的学生清单50.计算每个学生的选修课门数,要求显示学生学号和选修课门数51.将计算级系的学生成绩均加5分。
SQL语句练习及标准答案
SQL语句练习及标准答案SQL语句练习及答案————————————————————————————————作者:————————————————————————————————日期:sql语句练习题1数据库有如下四个表格:student(sno,sname,sage,ssex,sdpt) 学生表系表(dptno,dname)course(cno,cname, gradet, tno) 课程表sc(sno,cno,score) 成绩表teacher(tno,tname) 教师表要求:完成以下操作1.查询姓"欧阳"且全名为三个汉字的学生的姓名。
select sname from student where sname like “欧阳__?;2.查询名字中第2个字为"阳"字的学生的姓名和学号。
select sname,sno from student where sname like '_阳%';3.查询所有不姓刘的学生姓名。
select sname,sno,ssexfrom studentwhere sname not like “刘%”;4.查询db_design课程的课程号和学分。
select cno,ccredit from coursewhere cname like 'db_design'5.查询以"db_"开头,且倒数第3个字符为i的课程的详细情况。
select * from course where cname like 'db%i_ _';6.某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。
查询缺少成绩的学生的学号和相应的课程号。
select sno,cno from sc where grade is null;7.查所有有成绩的学生学号和课程号。
select sno,cno from sc where grade is not null;8.查询计算机系年龄在20岁以下的学生姓名。
SQl强化训练题四
原创:老二牛车教育SQL强化训练题库一如果训练了五套题库后,能达到60分也不是很容易的哦数据库文件请到百度网盘下载:/s/1lfema答案请在百度文库中找……0:数据库还原(教员下发数据库备份文件,还原时间要求3分钟,超过时间扣5分)全部要求使用一条SQL语句stuInfo(stuInfo1)(stuInfo2)学员信息表,stuName NVARCHAR(20) NOT NULL,--学员姓名stuNo NCHAR(6) NOT NULL,--学号stuSex NCHAR(4) NOT NULL,--性别stuAge SMALLINT NOT NULL,--年龄stuSeat SMALLINT IDENTITY(1,1),--座位号stuAddress Nvarchar(200 ) --地址stuCity(在stuInfo1表中) varchar(20 ) --所在城市stuMarks(stuMarks1)(stuMarks2)学员考试成绩表ExamNo CHAR(7) NOT NULL, 考试编号stuNo NCHAR(6) NOT NULL, 学号writtenExam SMALLINT NOT NULL, --笔试成绩LabExam SMALLINT NOT NULL --机试成绩stuName(在stuMarks1表中) ----学员姓名1.1:要求输出参加过考试的学员信息(使用连接,exists,子查询三种方式实现)-6分( 使用stuInfo,stuMarks表)1.2: 要求输出未参加过考试的学员信息(使用连接,exists,子查询三种方式实现)-3分( 使用stuInfo,stuMarks表)1.3-1:根据试题难度进行酌情加分, 分别实现,本班无人通过考试,试题偏难,每人加3分,本班考试成绩一般,每人只加1分( 使用stuInfo1,stuMarks1表) 本题是两条SQL -6分1.3-2:根据试题难度进行酌情加分一条语句实现,本班无人通过考试,试题偏难,每人加3分, 本班考试成绩一般,每人只加1分( 使用stuInfo1,stuMarks1表) -4分1.4为了方便按照学员的名称查询学员的考试成绩,在stuMarks1表中添加stuName字段,要求使用一条SQL 语句更新stuMarks1表中stuName的值(按照 stuInfo1表中stuNo对应stuMarks1表中的stuNo) -5分1.5要求插入一个新学员在stuInfo表,数据来源于 stuInfo1表中的名称叫‘我考牛呀牛’的学员(不能手工添加)-1分1.6-1要求一条SQL语句查询出学员表中有多少不同的城市(stuInfo1表)。
sql语句学习
sql语句学习第一篇:sql语句学习一、选择题1、SQL语言是()语言。
——(SQL特点)(易)A)层次数据库 B)网络数据库 C)关系数据库D)非数据库答案:C2、SQL语言具有两种使用方式,分别称为交互式SQL和()。
——(SQL语言使用方式)(易)A)提示式SQLB)多用户SQLC)嵌入式SQLD)解释式SQL答案:C3-4-5()包括数据库模式定义和数据库存储结构与存取方法定义。
()实现对DB的操作,包括查询、插入、删除、修改数据库中的数据。
()用于数据保护,包括数据的安全性,完整性,并发控制和恢复等。
——(数据库语言DDLDMLDCL)(中)A)数据控制子语言B)数据定义子语言C)数据操纵子语言D)数据库语言答案:B C A6-7-8-9-10、下列SQL语句中,实现数据检索的语句是(),修改表结构的是(),修改属性值的是(),删除表结构的是(),删除表记录的是()。
——(DROP TABLE, ALTER TABLE,UPDATE, DELETE,SELECT 语句)(易)A)SELECTB)DROPC)UPDATED)ALTERE)DELETE答案:A D C B E二、用关系代数表达式及SQL语句描述关系查询1、设有如下关系表R、S和T:——(易)R(BH,XM,XB,DWH)S(DWH,DWM)T(BH,XM,XB,DWH)写出实现下列关系代数的SQL语句:1)σDWH='100'(R)σDWH=’100’(R)2)∏XM,XB(R)∏xM,XB(R)3)∏XM,DWH(σ4)R∞S R∞S5)∏XM,XB,DWH(σ解:1)SELECT * FROM R WHERE DWH=’100’;2)SELECT XM,XB FROM R;3)SELECT XM,DWH FROM R WHERE XB=’女’;4)SELECT R.*,S.DWM FROM R, S WHERE R.DWH=S.DWH;5)SELECT XM,XB,DWH FROM R,S WHERE R.DWH=S.DWH AND XB=’男’;XB='男'XB='女'(R))∏XM,DWH(σXB=’女’(R))(R∞S))∏XM,XB,DWH(σXB=’男’(R∞S))2、设有如下三个关系:——(易-易)A(A#,ANAME,WQTY,CITY):A#:商店代号;ANAME:商店名;WQTY:店员人数B(B#,BNAME,PRICE):B#:商品号;BNAME:商品名称;AB(A#,B#,QTY):QTY:商品数量试用关系代数和SQL语言写出下列查询。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2010/71. 有4个关系模式如下:出版社(出版社编号,出版社名称);图书(图书编号,书名,出版社编号,定价);作者(作者编号,姓名);著书(图书编号,作者编号,作者排序)注:作者排序=1表示第一作者,依此类推。
用SQL语句,完成第36~39题。
(1).检索所有定价超过20元的书名。
答案:SELECT书名(1分)FROM图书(1分)WHERE定价>20(2分)(2).统计每个出版社图书的平均定价。
答案:SELECT出版社编号,A VG(定价)(2分)FROM图书(1分)GROUP BY出版社编号(1分)(3).将科学出版社的所有图书定价下调5%。
答案:UPDATE图书SET定价=定价*0.95(1分)WHERE出版社编号IN(1分)(SELECT出版社编号FROM出版社(1分)WHERE出版社名称="科学")(1分)【说明】WHERE出版社名称LIKE"科学"也正确。
(4).列出所有图书的书名、第一作者姓名和出版社名称。
答案:SELECT书名,姓名,出版社名称(1分)FROM出版社A,图书B,作者C,著书D(1分)WHEREA.出版社编号=B.出版社编号ANDB.图书编号=D.图书编号(1分)ANDC.作者编号=D.作者编号AND作者排序=1。
(1分)S(SNO,SNAME,AGE,SEX,SDEPT)SC(SNO,CNO,GRADE)C(CNO,CNAME,CDEPT,TNAME)1.试用SQL的查询语句表达下列查询:①检索LIU老师所授课程的课程号和课程名。
②检索年龄大于23岁的男学生的学号和姓名。
③检索至少选修LIU老师所授课程中一门课程的女学生姓名。
④检索W ANG同学不学的课程的课程号。
⑤检索至少选修两门课程的学生学号。
⑥检索全部学生都选修的课程的课程号与课程名。
⑦检索选修课程包含LIU老师所授课程的学生学号。
2.试用SQL查询语句表达下列对教学数据库中三个基本表S、SC、C的查询:①统计有学生选修的课程门数。
②求选修C4课程的学生的平均年龄。
③求LIU老师所授课程的每门课程的学生平均成绩。
④统计每门课程的学生选修人数(超过10人的课程才统计)。
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。
⑤检索学号比WANG同学大,而年龄比他小的学生姓名。
⑥检索姓名以WANG打头的所有学生的姓名和年龄。
⑦在SC中检索成绩为空值的学生学号和课程号。
⑧求年龄大于女同学平均年龄的男学生姓名和年龄。
⑨求年龄大于所有女同学年龄的男学生姓名和年龄。
3.试用SQL更新语句表达对教学数据库中三个基本表S、SC、C的各个更新操作:①往基本表S中插入一个学生元组('S9','WU',18)。
②在基本表S中检索每一门课程成绩都大于等于80分的学生学号、姓名和性别,并把检索到的值送往另一个已存在的基本表STUDENT(SNO,SNAME,SEX)。
③在基本表SC中删除尚无成绩的选课元组。
④把W ANG同学的学习选课和成绩全部删去。
⑤把选修MA THS课不及格的成绩全改为空值。
⑥把低于总平均成绩的女同学成绩提高5%。
⑦在基本表SC中修改C4课程的成绩,若成绩小于等于75分时提高5%,若成绩大于75分时提高4%(用两个UPDA TE语句实现)。
4.设教学数据库的模式如下:S(S#,SNAME,AGE,SEX)SC(S#,C#,GRADE)C(C#,CNAME,TEACHER)试用多种方式定义下列完整性约束:(1)在关系S中插入学生年龄值应在16~25岁之间(2)在关系SC中插入元组时,其S#值和C#值必须分别在S和C中出现。
(3)在关系SC中修改GRADE值时,必须仍在0~100之间。
(4)在删除关系C中一个元组时,首先要把关系SC中具有同样C#的元组全部删去。
(5)在关系S中把某个S#值修改为新值时,必须同时把关系SC中那些同样的S#值也修改为新值。
1.解:(1)检索LIU老师所授课程的课程号和课程名。
SELECT C#,CNAME FROM CWHERE TEACHER=…LIU‟(2)检索年龄大于23岁的男学生的学号和姓名。
SELECT S#,SNAME FROM SWHERE (AGE>23) AND (SEX=…M‟)(3)检索至少选修LIU老师所授课程中一门课程的女学生姓名。
SELECT SNAMEFROM SWHERE SEX=…F‟ AND S# IN(SELECT S#FROM SCWHERE C# IN(SELECT C#FROM CWHERE TEACHER=…LIU‟)(4)检索W ANG同学不学的课程的课程号。
SELECT C#FROM CWHERE C# NOT IN(SELECT C#FROM SCWHERE S# IN(SELECT S#FROM SWHERE SNAME='WANG'))(5)检索至少选修两门课程的学生学号。
SELECT S#FROM SCGROUP BY S#HA VING COUNT(C#)>=2(6)检索全部学生都选修的课程的课程号与课程名。
SELECT C#,CNAMEFROM CWHERE NOT EXISTS(SELECT *FROM SWHERE NOT EXISTS(SELECT *FROM SCWHERE SC.S#=S.S# AND SC.C#=C.C#))(7)检索选修课程包含LIU老师所授课的学生学号。
SELECT S#FROM SWHERE S# IN(SELECT S#FROM SCWHERE S.S#=SC.S# AND C# IN(SELECT C#FROM CWHERE TEACHER='LIU'))(请讨论一下,本题是否可如此:SELECT DISTINGCTS# FROM SC WHERE EXISTS (SELECT C# FROM C WHERE TEACHER='LIU'))2.答:①SELECT COUNT(DISTINCT CNO)FROM SC;②SELECT A VG(AGE)FROM S, SCWHERE S.SNO=SC.SNO AND CNO=‟C4‟;③SELECT O, CNAME, A VG(GRADE)FROM SC, CWHERE O=O AND TNAME=‟LIU‟GROUP BY O;④SELECT CNO, COUNT(SNO)FROM SCGROUP BY CNOHA VING COUNT(*)>10ORDER BY 2 DESC, CNO ASC;⑤SELECT X.SNAMEFROM S AS X, S AS YWHERE Y.SNAME=‟WANG‟AND X.SNO>Y.SNO AND X.AGE<Y.AGE;⑥SELECT SNAME, AGEFROM SWHERE SNAME LIKE ‟WANG%‟;⑦SELECT SNO, CNOFROM SCWHERE GRADE IS NULL;⑧SELECT SNAME, AGEFROM SWHERE SEX=‟M‟AND AGE> (SELECT A VG(AGE)FROM SWHERE SEX=‟F‟);⑨SELECT SNAME, AGEFROM SWHERE SEX=‟M‟AND AGE>ALL(SELECT AGEFROM SWHERE SEX=‟F‟);3.答案:①INSERT INTO S(SNO, SNAME, AGE)V ALUES(…S9‟, …WU‟, 18);②INSERT INTO STUDENTSELECT SNO, SNAME, SEXFROM SWHERE 80<=ALL(SELECT GRADEFROM SCWHERE SNO=S.SNO);③DELETE FROM SCWHERE GRADE IS NULL;④DELETE FROM SCWHERE SNO IN (SELECT SNOFROM SWHERE SNAME=‟W ANG‟);⑤UPDATE SCSET GRADE=NULLWHERE GRADE<60AND CNO IN (SELECT CNOFROM CWHERE CNAME=‟MATHS‟);⑥UPDATE SCSET GRADE=GRADE*1.05WHERE SNO IN (SELECT SNOFROM SWHERE SEX=‟F‟)AND GRADE< (SELECT A VG(GRADE)FROM SC);⑦UPDATE SCSET GRADE=GRADE*1.04WHERE CNO=‟C4‟ AND GRADE>75;UPDATE SCSET GRADE=GRADE*1.05WHERE CNO=‟C4‟ AND GRADE<=75;注:这两个语句顺序不能颠倒。
4.答:(1)定义S时采用检查子句:CREAT TABLE S(S# CHAR(4),SNAME char (10) NOT NULL ,AGE SMALLINT ,primary key(S#)CHECK (AGE>=16 and AGE<=25))(2)采用外键子句约束CREAT TABLE SC(S# CHAR(4),C# CHAR(4),GRADE SMALLINT,FOREIGN key(S#) REFERENCE S(S#)FOREIGN key(C#) REFERENCE C(C#)(3)采用元组检查CREAT TABLE SC(S# CHAR(4),C# CHAR(4),GRADE SMALLINT,FOREIGN key(S#) REFERENCE S(S#)FOREIGN key(C#) REFERENCE C(C#)CHECK (GRADE>=0 and AGE<=100))(4)采用外键约束CREAT TABLE SC(S# CHAR(4),C# CHAR(4),GRADE SMALLINT,FOREIGN key(S#) REFERENCE S(S#),FOREIGN key(C#) REFERENCE C(C#))注,在ON DELETE短语缺省的时候表示RESTRICT方式。
(5)采用外键约束CREAT TABLE SC(S# CHAR(4),C# CHAR(4),GRADE SMALLINT,FOREIGN key(S#) REFERENCE S(S#) ON UPDATE CASCADE , FOREIGN key(C#) REFERENCE C(C#))2009/07有一个教学数据库,包括三个关系模式:(1)学生S(S#,SNAME,AGE,SEX)其属性的含义依次为学号、姓名、年龄、性别(2)学习SC(S#,C#,GRADE)其属性的含义依次为学号、课程号、成绩(3)课程C(C#,CNAME,TEACHER)学生关系其属性的含义依次为课程号、课程名、任课教师根据以上3个关系模式用SQL语句完成36~39题。