sql基础

  • Post author:
  • Post category:其他

1、什么是关系型数据库,主键,外键,索引分别是什么?

关系型数据库是由多张能互相联接的二维行列表格组成的数据库
主关键字(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录
外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单

2、写出表的增删改查SQL语法

表的创建:create table表名(列名1类型约束,列2类型约束…)
表的删除: drop table表名
表的更改(结构的更改,不是记录的更新) : alter table表名add|drop 列名约束名插入记录: insert into表名…values….
更新记录: update表名set列名=值 where条件
删除记录:delete from表名where 条件

3、SQL的表连接方式有哪些?

SQL中连接按结果集分为:内连接,外连接,交叉连接
内连接: inner join on,两表都满足的组合。内连接分为等值连接,不等连接,自然连接。等值连接:两表中相同的列都会出现在结果集中。
自然连接:两表中具体相同列表的列会合并为同一列出现在结果集中。
外连接:分为左(外)连接,右(外)连接,全连接
左(外)连接:Aleft (outer) join B,以A表为基础,A表的全部数据,B表有的组合,没有的为。
右(外)连接: A right(outer) join B,以B表为基础,B表的全部数据,A表有的组合,没有的位null。
全连接:A full (outer) join两表相同的组合在一起,A表有,B表没有的数据(显示为null),同样B表有,A表没有的显示为null。
交叉连接: cross join,就是笛卡尔乘积。

4、表的连接查询方式有哪些,有什么区别?

交叉连接即笛卡儿乘积,是指两个关系中所有元组的任意组合
使用内连接时,如果两个表的相关字段满足连接条件,就从这两个表中提取数据并组合成新的记录自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接方式

5、什么三范式?

1NF:表中的字段都是单一属性,不再可分。
2NF:在1NF的基础上,表中所有的非主属性都必须完全依赖于任意一组候选键,不能仅依赖于候选键中的某个属性。
3NF:在2NF的基础上,表中所有的属性都不依赖其他非主属性。
简单的说就是:1NF表示每个属性不可分割,2NF表示非主属性不存在对主键的部分依赖,3NF表示不存在非主属性对主键的依赖传递。

6、SQL的select语句完整的执行顺序?

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、select的字段;
8、使用order by 对结果集进行排序。

7、说一下Mysql数据库存储的原理?

储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。存储过程通常有以下优点:
1、存储过程能实现较快的执行速度
2、存储过程允许标准组件是编程。
3、存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
4、存储过程可被作为一种安全机制来充分利用。
5、存储过程能够减少网络流量

8、事务的特性?

1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障

9、简述什么是存储过程和触发器?

存储过程:是数据库中的一个对象,Transact-SQL语句的预编译集合,这些语句在一个名称下存储并作为一个单元进行处理。(可以理解为C语言中的函数,有参数、返回值等函数特性)
触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT或DELETE。

10、什么是数据库索引?

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B_TREE。B_TREE索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据﹔相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。

11、数据库怎么优化查询效率?

1、储存引擎选择:如果数据表需要事务处理,应该考虑使用InnoDB,因为它完全符合ACID特性。如果不需要事务处理,使用默认存储引擎MylSAM是比较明智的
2、分表分库,主从。
3、对查询进行优化、要尽量避免全表扫描,首先应考虑在 where 及order by涉及的列上建立索引
4、应尽量避免在 where子句中对字段进行 null值判断,否则将导致引擎放弃使用索引而进行全表扫描
5、应尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
6、应尽量避免在 where子句中使用or来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
7、Update语句,如果只更改1、2个字段,不要Update 全部字段、否则频繁调用会引起明显的性能消耗,同时带来大量日志.
8、对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差。

12、你用的Mysql是哪个引擎,各引擎之间有什么区别?

主要 MylSAM与InnoDB两个引擎,其主要区别如下:InnoDB支持事务,MylISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MylSAM就不可以了;
MylSAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用;
lnnoDB支持外键,MyISAM不支持;
MyISAM是默认引擎,InnoDB需要指定;InnoDB不支持FULLTEXT类型的索引;
InnoDB中不保存表的行数,如select count() from table时,InnoDB;需要扫描一遍整个表来计算有多少行,但是 MyISAM只要简单的读出保存好的行数即可。
注意的是,当count(语句包含where条件时MyISAM也需要扫描整个表;
对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MylSAM表中可以和其他字段一起建立联合索引﹔
清空整个表时,InnoDB是一行一行的删除,效率非常慢。
MylSAM则会重建表; InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’

13、如何对查询命令进行优化?

a.应尽量避免全表扫描,首先应考虑在where 及 order by涉及的列上建立索。
b.应尽量避免在 where子句中对字段进行null值判断,避免使用!=或<>操作符,避免使用or连接条件,或在 where子句中使用参数、对字段进行表达式或函数操作,否则会导致权标扫描
c.不要在 where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
d.使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。
e.很多时候可考虑用exists代替in。
f.尽量使用数字型字段。
g.尽可能的使用varchar/nvarchar代替char/nchar。
h.任何地方都不要使用select from t ,用具体的字段列表代替””,不要返回用不到的任何字段。

14、数据库的优化?

1.优化索引、SQL语句、分析慢查询;
⒉设计表的时候严格根据数据库的设计范式来设计数据库;
3.使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO
4.优化硬件;采用SSD,使用磁盘队列技术(RAIDO,RAID1,RDID5)等
5.采用 MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率;
6.垂直分表;把一些不经常读的数据放在一张表里,节约磁盘IO;
7.主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来;
8.分库分表分机器(数据量特别大),主要的原理就是数据路由;
9.选择合适的表引擎,参数上的优化
10.进行架构级别的缓存,静态化和分布式;
11.不采用全文索引;
12.采用更快的存储方式,例如 NoSQL存储经常访问的数据。

15、 Sql注入是如何产生的,如何防止?

程序开发过程中不注意规范书写 sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。产生Sql 注入。下面是防止办法:
a.过滤掉一些常见的数据库操作关键字,或者通过系统函数来进行过滤。
b.在 PHP配置文件中将 Register_globals=off;设置为关闭状态
c.SQL语句书写的时候尽量不要省略小引号(tab 键上面那个)和单引号
d.提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的e.对于常用的方法加以封装,避免直接暴漏SQL语句
f.开启 PHP安全模式: Safe_mode=on;
g.打开magic_quotes_gpc来防止SQL 注入
h.控制错误信息:关闭错误提示信息,将错误信息写到系统日志。i.使用mysqli或pdo 预处理。

16、NoSQL和关系数据库的区别?

a.SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存储方式可以省是JSON文档、哈希表或者其他方式。
b.在SQL中,必须定义好表和字段结构后才能添加数据,例如定义表的主键(primary key)、索引[(index),触发器(trigger),存储过程(stored procedure)等。表结构可以在被定义之后更新,但是如果有比较大的结构变更的话就会变得比较复杂。在NoSQL中,数据可以在任何时候任何地方添加,不需要
先定义表。
c.SQL中如果需要增加外部关联数据的话,规范化做法是在原表中增加一个外键,关联外部数据表。而在NoSQL 中除了这种规范化的外部数据表做法以外、我们还能用如下的非规范化方式把外部数据直接放到原数据集中,以提高查询效率。缺点也比较明显,更新审核人数据的时候将会比较麻烦。
d.SQL中可以使用JOIN表链接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。NoSQL暂未提供类似JOIN的查询方式对多个数据集中的数据做查询。所以大部分NoSQL使用非规
范化的数据存储方式存储数据。
e.SQL中不允许删除已经被使用的外部数据,而NoSQL中则没有这种强耦合的概念,可以随时删除任何数据。
f.sQL中如果多张表数据需要同批次被更新,即如果其中一张表更新失败的话其他表也不能更新成功。这种场景可以通过事务来控制,可以在所有命令完成后再统一提交事务。而 NoSQL中没有事务这个概念,每一个数据集的操作都是原子级的。
g.在相同水平的系统设计的前提下,因为 NoSQL中省略了JOIN查询的消耗,故理论上性能上是优于SQL的。

17、 MySQL与MongoDB本质之间最基本的差别是什么

差别在多方面、例如:数据的表示、查询、关系、事务、模式的设计和定义、速度和性能。MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。
MongoDB是一个面向文档的数据库,目前由10gen开发并维护,它的功能丰富齐全,所以完全可以替代MySQL。
与MySQL等关系型数据库相比,MongoDB的优点如下:
①弱一致性,更能保证用户的访问速度。
②文档结构的存储方式,能够更便捷的获取数据。
③内置GridFS,支持大容量的存储。
④内置Sharding.
⑤第三方支持丰富。(这是与其他的NoSQL相比,MongoDB也具有的优势)
⑥性能优越:
MongoDB本身它还算比较年轻的一个产品,所以它的问题,就是成熟度背定没有传统MySQL那么成熟稳定。所以在使用的时候;
尽量使用稳定版.不要在线上使用开发版。这是一个大原则;
另外一点,备份很重要,MongoDB 如果出现一些异常情况,备份一定是要能跟上。除了通过传统的复制的方式来做备份,离线备份也还是要有,不管你是用什么方式,都要有一个完整的离线备份。往往最后出现了特殊情况,它能帮助到你;另外,MongoDB性能的一个关键点就是索引,索引是不是能有比较好的使用效率,索引是不是能够放在内存中,这样能够提升随机读写的性能。如果你的索引不能完全放在内存中,一旦出现随机读写比较高的时候,它就会频繁地进行磁盘交换,这个时候,MongoDB的性能就会急剧下降,会出现波动。
另外、MongoDB还有一个最大的缺点.就是它占用的空间很大,因为它属于典型空间换时间原则的类型。那么它的磁盘空间比普通数据库会浪费一些,而且到目前为止它还没有实现在线压缩功能,在MongoDB中频繁的进行数据增删改时,如果记录变了,例如数据大小发生了变化,这时候容易产生一些数据碎片,出现碎片引发的结果,一个是索引会出现性能问题。
另外一个就是在一定的时间后,所占空间会莫名其妙地增大,所以要定期把数据库做修复,定期重新做索引,这样会提升MongoDB的稳定性和效率。在最新的版本里,它已经在实现在线压缩、估计应该在2.0版左右,应该能够实现在线压缩,可以在后台执行现在 repair DataBase 的一些操作。
如果那样,就解决了目前困扰我们的大问题。

18、 Mysql 数据库中怎么实现分页?

select * from table limit (start-1)*limit,limit;
其中 start是页码,limit是每页显示的条数。

19、 Mysql数据库的操作?修改表-修改字段,重命名版:

alter table 表名change原名新名类型及约束;
alter table students change birthday birth datetime not null;修改表-修改字段,不重名版本:
alter table表名modify列名类型和约束; alter table students modify birth date not nul全列插入:insert into表名values(...)
insert into students values(0,"郭靖",1,"内蒙","2017-6");部分插入∶值的顺序与给出的列顺序对应:insert into students(name, birthday) values("黄蓉"."2017-8");修改:update表名 set列1=值1,列2=2.。。where
update students set gender=0, homwtown="古墓", where id = 5;
备份: mysqldump -uroot -p 数据库名>python.sql,
恢复:mysql -uroot -p数据库名<python.sql

20、优化数据库?提高数据库的性能?

**1.**对语句的优化
①用程序中,保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;
②能够分开的操作尽量分开处理,提高每次的响应速度﹔在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;
③在查询时,不要过多地使用通配符如SELECT*FROMT1语句,要用到几列就选择几列如:SELECT COL1,COL2 FROM T1;
④在可能的情况下尽量限制尽量结果集行数如:SELECT TOP 300 COL1,COL2,COL3 FROMT1,因为某些情况下用户是不需要那么多的数据的。
⑤不要在应用中使用数据库游标,游标是非常有用的工具,但比使用常规的、面向集的SQL语句需要更大的开销;按照特定顺序提取数据的查找。

避免使用不兼容的数据类型
例如float和 int、char和 varchar、binary 和 varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:
SELECT name FROM employee WHERE salary > 60000
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。若在查询时强制转换,查询速度会明显减慢。
**3.**避免在 WHERE子句中对字段进行函数或表达式操作。
若进行函数或表达式操作,将导致引擎放弃使用索引而进行全表扫描。
**4.**避免使用!=或<>、IS NULL 或IS NOT NULL、IN , NOT IN 等这样的操作符
5.尽量使用数字型字段
6.合理使用EXISTS,NOT EXISTS子句。
7.尽量避免在索引过的字符数据中,使用非打头字母搜索。8.分利用连接条件
9.消除对大型表行数据的顺序存取10.避免困难的正规表达式
11.使用视图加速查询
12.能够用BETWEEN的就不要用IN13.DISTINCT的就不用GROUP BY14.部分利用索引
15.能用UNION ALL就不要用UNION
16.不要写一些不做任何事的查询
17.尽量不要用SELECT INTO语句
18.必要时强制查询优化器使用某个索引
19.虽然UPDATE、DELETE语句的写法基本固定,但是还是对UPDATE语句给点建议:a)尽量不要修改主键字段。
b)当修改VARCHAR型字段时,尽量使用相同长度内容的值代替。
c)尽量最小化对于含有UPDATE触发器的表的UPDATE 操作。
d)避免UPDATE将要复制到其他数据库的列。
e)避免 UPDATE建有很多索引的列。
ft)避免 UPDATE在WHERE子句条件中的列。

21、什么是数据的完整性?

数据完整性指的是存储在数据库中的数据的一致性和准确性。完整性分类:
(1)实体完整性:主键值必须唯一且非空。(主键约束)
(2)引用完整性(也叫参照完整性)︰外键要么为空,要么引用主表中存在的记录。(外键约束)。
(3)用户自定义完整性:针对某一具体关系数据库中的约束条件。

22、存储过程和函数的区别?

相同点:存储过程和函数都是为了可重复的执行操作数据库的sql语句的集合。
1)存储过程和函数都是一次编译,就会被缓存起来,下次使用就直接命中已经编译好的 sql语句,不需要重复使用。减少网络交互,减少网络访问流量。
不同点:标识符不同,函数的标识符是function,存储过程是 proceduce。
1)函数中有返回值,且必须有返回值,而过程没有返回值,但是可以通过设置参数类型(in,out)来实现多个参数或者返回值。
2)存储函数使用select调用,存储过程需要使用call调用。
3) select语句可以在存储过程中调用,但是除了select…into之外的 select语句都不能在函数中使用。4)通过in out参数,过程相关函数更加灵活,可以返回多个结果。

23、怎么进行SQL的查询优化?

(1)从表连接的角度优化:尽量使用内连接,因为内连接是两表都满足的行的组合,而外连接是以其中一个表的全部为基准。
(2〉尽量使用存储过程代替临时写SQL语句:因为存储过程是预先编译好的SQL语句的集合,这样可以减少编译时间。
(3)从索引的角度优化:对那些常用的查询字段简历索引,这样查询时值进行索引扫描,不读取数据块。
(4)还有一些常用的select 优化技巧:
(5)A.只查询那些需要访问的字段,来代替select*
B、将过滤记录越多的where语句向前移:在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。

24、索引的作用,聚集索引与非聚集索引的区别

索引是一个数据库对象,使用索引,可以是数据库程序无须对整个数据进行扫描,就可以在其中找到目标数据,从而提高查找效率。索引的底层采用的是B树。
聚集索引:根据记录的key再表中排序数据行。
非聚集索引:独立于记录的结构,非聚集所以包含的 key,且每个键值项都有指向该简直的数据行的指针。
聚集索引与非聚集索引的区别:
(1)聚集索引的物理存储按索引排序,非聚集所以的物理存储不按索引排序。
(2)聚集索引插入,更新数据的速度比非聚集索引慢,单查询速度更快。
(3)聚集索引的叶级结点保存的是时间的数据项,而非聚集结点的叶级结点保存的是指向数据项的指针。
(4)一个表只能有一个聚集索引((因为只有一种排序方式),但可以有多个非聚集索引。

25、查询练习

1、

 Student-Sourse-SC-Teacher表关系如下:
-Student (sid ,Sname,Sage,Ssex)学生表
-Course (cid,Cname,tid)课程表
-SC (sid,cid,score)成绩表
-Teacher (tid,Tname)教师表
写出sql语句:
#1.查询课程“001“课程比”002“课程成绩高的所有学生的学号

select a.sid from 
(select sid ,score from SC where cid='001') a,
(select sid ,score from SC where C_ID='002') b 
where a.score>b.score and a.sid =b.sid ;

#2.修改学号为20131201 的语文成绩为100


#3.插入一条名为“李四”的教师记录



#4.删除学习“叶平”老师课程的sc表记录




1、查询每门课程被选修的学生数
2、查询课程名称为"编程基础",且分数不少于90分的学生姓名和分数
参考答案:
(1) select C#,count(S#) from sc group by c#;
(2) SELECT Student.Sname,Course.Cname,SC.scoreFROM Student,Course,sc
WHERE Course.Cname="编程基础"AND Student.S#=SC.S#
AND Course.C#=SC.C#AND SC.score>90;

2、

#在SQL Server中,您如何从名为"member"的表中筛选出手机号"Mphonenumber”出现重复的用户并排除空数据?
select * 
from member 
where phonenumberin
(select phonenumber from memberwhere phonenumber is not null
group by phonenumber
having count(1)>1)

3、

#员工信息A-员工亲属信息表B表关系如下:
--员工信息表A:员工标号(codecode,PK),员工姓名(codename),员工性别(codesex),联系电话(codetel),备注(remarks)
#-员工亲属信息表B:员工编码(codecode),亲属编码(recodecode, PK),亲属姓名(recodename) ,联系电话(recodetel),备注(remarks)
写出sql语句:
1.向员工信息表中插入一条数据:(001,张三,男,010-62570007,北京市海淀区)
2.查询出亲属数量大于1的员工编码,员工姓名,员工亲属数量有部分员工亲属信息重复录入(亲属编码不同,其他相同)﹐出现这种情况的员工编码,重复的亲属编码,亲属姓名查询出来。


4、

#部门表dept-雇员表emp表关系如下:
#-部门表dept:部门标号(DEPTNO),部门名称(DNAME),所在位置(LOC)
#-雇员表 emp:员工标号(Empno),员工名称(Emname),员工工位(Job),经理(Mgr),雇佣日期(Hiredate),薪水(Sal),部门编号(Deptno)
#写出sql语句:
1.找出部门名称为ACCOUNTING的部门下的所有员工名称?2.找出部门名称为SALES的部门下每月需要发出的薪水总额?3.找出部门名称为SALES的部门的部门经理?
4.找出部门名称为RESEARCH的部门下雇佣日期为1980-12-17的员工?

5、

#Student-coures-Studentcourse表关系如下:
-student(sno,sname,age,sdept)学生表
-course(cno,cname,teacher)课程表
-Studentcourse(sno,cno,grade)选课表写出sql语句:
1.查询所有课程都及格的学生号和姓名
2.查询平均分不及格的课程号和平均成绩
3.找出各门课程的平均成绩,输出课程号和平均成绩
4.找出没有选择c2课程的学生信息

6、

179#请用一条SQL语句查询出发帖数大于5点击数由高到低排序?
select * from table where post>5 order by hists desc

# 用一条SQL语句将“日期”为21日的记录帖子数全部设置为0?


#用一条SQL筛选出2014年的记录且post大约500的数据,将其 hits减少50?



7、

180#1.用SQL查询购买过goods_id为1001 的用户的user_id

#2.用SQL查询2017年7月1号后(含7月1号)购买过1001这个商品的 user_id和oeder_id, goods_id和price

#3.用SQL查询出订单所含商品明细总金额〉=50的order_id和 user_id


8、

1801)请说明主键,外键的作用,以及建立索引的好处及坏处。
2)请写出课程表中建表SQL语句。
3)如果学号的前两位表示年级,要查找98级女生的姓名,请写出相应的SQL语句。
4)要查找所需要补考(小于60)的学生姓名和这门课程的名称和成绩﹐请写出相应的SQL语句。5)查询每个学生需要补考(小于60分)的课程的平均分,并以平均分排序。
6)(非必答题,请量力选做)请分析这两个表的设计,并谈谈这两个表设计中存在的问题,并根据你的理解给出优化的方案。
7)(非必答题,请量力选做)针对学生考试管理系统,如果要实现学生管理,课程管理,考试成绩管理的基本需求,请根据你对需求的理解,使用UML或者E-R图的方式给出一个简洁明了的数据库设计方案。

9、

181图
富豪榜统计需求:
1)请给出,所有投资用户中,投资总额排名前10位的用户,按投资总额倒序排列,输出项如下,例如:
用户名,投资总额张三,9000000李四,800000o
2)给出富豪榜第一名的用户的单笔平均投资额

10、经典学生表

有student表和score,创建表的语法如下,完成数据库题目创建student
CREATE or REPLACE TABLE student (
id INT(10)NOT NULL UNIQUE PRIMARY KEY ,name VARCHAR(20)NOT NULL,
sex VARCHAR(4) ,
birth YEAR,
department VARCHAR(20) ,address VARCHAR(50)
);
创建score表:
CREATE or REPLACE TABLE score (
id INT(10)NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT ,stu_id INT(10)NOT NULL,
c_name VARCHAR(20) ,grade INT(10)
);


3.3.1为student表和score表增加记录#向student表插入记录:
INSERT INTO student VALUES( 901,'张老大','男',1985,'计算机系','北京市海淀区');INSERT INTO student VALUES( 902,'张老二','男',1986,'中文系','北京市昌平区'");INSERT INTO student VALUES( 903,'张三','女',1990,'中文系','湖南省永州市');

INSERT INTO student VALUES( 904,'李四','男",1990,"英语系","辽宁省阜新市);INSERT INTO student VALUES( 905,'王五','".1991,"英语系","福建省厦门市';lINSERT INTO student VALUES( 906,'王六','",1988,'计算机系','湖南省衡阳市');

往score表插入记录:
INSERT INTO score VALUES(NULL.901,"计算机',98);
INSERT INTO score VALUES(NULL,901,"英语",80);
INSERT INTO score VALUES/(NULL.902,"计算机'.65);
INSERT INTO score VALUES(NULL.902,"中文" ,88);
INSERT INTO score VALUES(NULL.903, "中文",95);
INSERT INTO score VALUES(NULL.904,"计算机',7O);
INSERT INTO score VALUES(NULL,904,"英语" .92);
INSERT INTO score VALUES(NULL.905,"英语" .94);
INSERT INTO score VALUES(NULL.906,"计算机',.90);
INSERT INTO score VALUES(NULL.906,"英语" ,85);

3.3.2查询student表的所有记录
SELECT*FROM student;

3.3.3查询student表的第2条到4条记录
SELECT * FROM student LIMIT 1,3;
说明:
LIMIT子句可以被用于强制SELECT语句返回指定的记录数。LIMIT接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是O(而不是1)

3.3.4 从student表查询所有学生的学号( id) 、姓名(name)和院系
( department)的信息
SELECT id,name,department FROM student;

3.3.5 从student表中查询计算机系和英语系的学生的信息sELECT*
FROM student
WHERE department IN('计算机系"∵英语系'》

3.3.6 从student表中查询年龄18~22岁的学生信息
SELECT id,name,sex,2018-birth AS age,department,address
FROM student
WHERE 2018-birth BETWEEN18AND 22;
SELECT id,name,sex,2018-birth AS age,department,address
FROM student
WHERE 2018-birth>=18 AND 2018-birth<=22;

3.3.7从student表中查询每个院系有多少人
SELECT department,COUNT(id)
FROM student
GROUP BY department;


3.3.9计算每个考试科目的平均成绩SELECT c_name,AVG(grade)
FROM score GROUP BY c_name;

3.3.8 从score表中查询每个科目的最高分
SELECT c_name,MAX(grade) FROM score
GROUP BY c_name;


3.3.10将计算机考试成绩按从高到低进行排序
SELECT stu_id, grade
FROM score
WHERE c_name= '计算机'ORDER BY grade DESC;

3.3.11查询student表中学生的学号、姓名、年龄、院系和籍贯并且按照年龄从小到大的顺序排列
select student.id,name,2017-birth,department,addressfrom student
where 2017-birthORDER BY 2017-birth

3.3.12查询score表中学生的学号、考试科目和成绩并且按照成绩从高到低的顺序排列.
select score.stu_id,c_name,gradefrom score
ORDER BY grade DEsC
数据检索-多表查询


3.3.13查询李四的考试科目(c_name)和考试成绩(grade)
SELECT c_name, grade
FROM score
WHERE
stu_id=(SELECT id
FROM student
WHERE name= '李四');


3.3.14用连接的方式查询所有学生的信息和考试信息SELECT student.id,name,sex,birth,
department,address,c_name,gradeFROM student,score
WHERE student.id=score.stu_id;
作业:左连接右链接,内连接和外链接的区别。

3.3.15计算每个学生的总成绩
SELECT student.id,name,SUM(grade)FROM student,score
WHERE student.id=score.stu_idGROUP BY id;

3.3.16查询计算机成绩低于95的学生信息
SELECT* FROM student
WHERE id lN
(SELECT stu_id FROM score
WHERE c_name="计算机" and grade<95);

3.3.17查询同时参加计算机和英语考试的学生的信息
SELECT * FROM student
WHERE
id =ANY( SELECT stu_id
FROM score
WHERE stu_id lN(
SELECT stu_id FROM
score WHERE c_name= '计算机')AND c_name= '英语');
SELECT a.*FROM student a ,score b ,score cWHERE
a.id=b.stu_id
AND b.c_name='计算机'AND a.id=c.stu_id
AND c.c_name='英语';


3.3.18从student表和score表中查询出学生的学号,然后合并查询结果
SELECT id FROM student
UNION
SELECT stu_id FROM score;


3.3.19查询姓张或者姓王的同学的姓名、院系和考试科目及成绩
SELECT student.id, name,sex,birth,
department, address,c_name,grade
FROM student, score
WHERE
(name LlKE张%OR name LIKE '王%')
AND
student.id=score.stu_id ;

3.3.20查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩
SELECT student.id, name,sex,birth,department, address, c_name,grade
FROM student,score
WHERE address LIlKE'湖南%’ANDstudent.id=score.stu_id;


1)创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话
CREATE TABLE Student(
s_id int(5),
s_name VARCHAR(20),
s_age INT(3),
s_sex char(2),
s_address VARCHAR(20),
s_phone char(11)
)
2)修改学生表的结构,添加一列信息,学历
alter TABLE Student add s_ed VARCHAR(10);

3)修改学生表结构,删除一列信息,家庭住址ALTER TABLE Student DROP COLUMN s_address;

4)向学生表添加如下信息:学号姓名年龄性别联系电话学历
#1A22男123456小学;2B21男119中学;
#3C23男110高中;4D18女114大学

INSERT into Student VALUES(1,'A ',22,','123456','小学');
INSERT into Student VALUES(2,'B',21.'','119';'中学');
INSERT into Student VALUES(3,'C'.23.'','110';'高中);
INSERT into Student VALUES(4,'B',18,'女','114','大学);

5)修改学生表的数据,将电话号码以11开头的学员的学历改为“大专“
UPDATE Student SET s-ed='大专' WHERE s_phone like '11%';

6)删除学生表的数据,姓名以C开头,性别为“男"的记录删除
DELETE FROM Student where s_sex='' and s_name like 'C%';

7)查询学生表的数据,将所有年龄小于22岁的,学历为""大专”的,学生的姓名和学号示出来
SELECT s_name,s_id FROM Student WHERE s_sex < 22 and s_ed='大专';

11、SQL试题

193
学生表(学生id,姓名、性别,分数)student(s_id,name,sex,score)班级表(班级id,班级名称), class (c_id,c_name)
学生班级表(班级id,学生id) , student_class (s_id,c_id)
(1)查询一班得分在80分以上或者等于60,61,62的学生
(2)查询所有班级的名称,和所有班中女生人数和女生的平均分
( 1)select * from student a ,class b,student_class c
where a.s_id = c.s_id and b.c_id = c.c_idand c_name = '一班'
and (a.score > 80 or a.s_id in (60,61,62))
(2)select c_name,count(*),avg(a.score)
from student a ,class b,student_class cwhere a.s_id = c.s_id and b.c_id = c.c_id
and a.sex='女'group by c_name;

lN或NOTIN的语法为:
SELECT*FROM table_name WHERE field [NOT] IN(data_list)。
其中 data_list可以是具体的数值,也可以是通过子查询得到的数据集,IN相当于多个OR条件的叠加。


12、SQL试题

3.4.6 MySQL/Oracle 如何查询某一个表的前10行记录
查询MySQL表的前10条记录:
select * from表名limit 0,10;
select * from表名limit 10 offset O;
select * from表名limit 10;
查询Oracle表的前10条记录:
select * from表名where rownum<=10;

13、

1941.请使用SQL语句查询出所有项目,项目经理的名称及其所属部门的名称
2.请使用SQL语句将没有人员的部门从部门表中删除
3.请使用SQL语句将项目表中的项目经理等级修改为该员工在人员表中的职级。并且将人员表中所有市场部的人员姓名后面加上"-商务",如"张三-商务"。
参考答案:
select prj.Prj_name,per.Per_name,dep.Dep_id from prjleft join per on prj.Per_id = per.Per_id
left join dep on dep.Dep_name=per.Per_name;

#在SQL Server中,您如何从名为"member”的表中筛选出手机号" phonenumber"出现重复的用户并排除空数据?
select * from member where phonenumberin(select phonenumber from member
where phonenumber is not null
group by phonenumber
having count(1)>1)
使用首先使用phonenumber is not null 排除空数据,再通过分组统计过滤出出现次数大于1次的phonenumber列表,利用in子查询获得这些手机号重复额用户信息



14、

1.进行多表联查时,应该注意什么
2.如何对查询结果进行条件映射归集
3.对某个表的值进行按天统计总条数、总金额数量,如何编写这个SQL
参考答案:
1.多表联查的关键在于找出表与表之间的关联字段,一般设计表的时候会根据具体业务和模块将数据拆分保存到多个表中间,在一个表中设计字段指代另一个表的字段,从而保证数据间的关系。另外多表联查要根据需要选择合适的连接查询方式,如内连接,左外连接,右外连接等
2.条件查询相当于对结果集进行的过滤筛选。这时候我们会使用where字句,后面使用一个或者多个条件表达式,多个条件表达式之间使用and或者or进行连接
3.加上表名为table_name,日期字段为create_time,金额字段为 amount,则 sql如下select date_format(create_time,' %Y%m%d') as日期
count(1) as总条数,sum(amount) as总金额
from table_name
group by date_format(create_time,'%Y%m%dy;

15、根据所学的SQL知识,写出如下相应的SQL语句,要求数据库返回的结果为:删除除了自动编号不同,其他都相同的学生冗余信息

196

16、(1)用连接方式查询所有学生的信息和考试成绩信息(2)计算每个学生的总成绩

198

17、现有emp表,结构及数据如下

图198
(1)计算职位为SALESMAN的员工的工资总和(2〉部门号为20的员工,工资从高到底排列
(3)计算各个部门中,出生日期在1981你那6月1日之后的员工总数

18、200

图200
使用逆向思维、所有成绩都合格、表示所有课程最低分数大于60分。因此可以对学生按姓名进行分组,设置最低分数大于60分的分组条件,筛选出满足要求的学生

19、

1、查询每门课程被选修的学生数
2、查询谍程名称为"编程基础"、且分数不少于90分的学生姓名和分数


20、

图201
(1)查询出"USER"表中"USER_ID""0O01"的数据
(2)查询出"USER_CARD"表中"USER_ID"属于"USER"表中的数据
(3)按"USER_ID"降序查找出"USER_CARD"表中"USER_ID"属于"USER""表的数据
(4)查找出"USER_CARD"表中“USER_ID"属于"USER"表的第一条数据
(5)按照表的字段类型及条件"USER_ID"为“0004”, USER_NAME”为“TESTING3" ,"USER_BIR_DATE""2020-01-04",插入到"USER"表中




21、

图203
(1)【2分】请写出计算所有学生的英语平均成绩的 sql语句
(2【5分】现有五个学生,其学号假定分别为11,22,33,44,55;请用一条SQL语句实现列出这个学生的数学成绩及其姓名、学生地址、电话号码;
(3【5分】查询所有学生的姓名、计算机成绩.按照计算机成绩从高到低排序
(4)【5分】查询所有总成绩大于240分的学生学号、姓名、总成绩,按照总成绩从高到底排序
(5)【8分】将每个系总成绩第一名的学生查出来,查询结果包括系名、学号、姓名、总成绩;





21、

图203
(1)【2分】请写出计算所有学生的英语平均成绩的 sql语句
(2【5分】现有五个学生,其学号假定分别为11,22,33,44,55;请用一条SQL语句实现列出这个学生的数学成绩及其姓名、学生地址、电话号码;
(3【5分】查询所有学生的姓名、计算机成绩.按照计算机成绩从高到低排序
(4)【5分】查询所有总成绩大于240分的学生学号、姓名、总成绩,按照总成绩从高到底排序
(5)【8分】将每个系总成绩第一名的学生查出来,查询结果包括系名、学号、姓名、总成绩;





22、

图206
(1)
(2

23、分组查询

图207
(1)
(2

24、

图208
(1)
(2

25、

图209
(1)
(2(3

26、

图210
(1)
(2(3

27、

图211
(1)
(2(3

28、

图212
(1)
(2(3

29、

图213
(1)
(2(3

30、

图213
(1)
(2(3

31、

图214
(1)
(2(3

32、

mysql> select * from student;
+----+---------+--------+------+------+-----------+
| id | no      | name   | age  | sex  | pronvince |
+----+---------+--------+------+------+-----------+
|  1 | 2020001 | 张三   |   18 || 辽宁      |
|  2 | 2020002 | 李三   |   19 || 湖南      |
|  3 | 2020003 | 王三   |   20 || 北京      |
|  4 | 2020004 | 杨三   |   21 || 上海      |
|  5 | 2020005 | 周三   |   22 || 广州      |
|  6 | 2020006 | 帅帅   |   12 || 辽宁      |
+----+---------+--------+------+------+-----------+
6 rows in set (0.00 sec)

mysql> select * from grade;
+----+---------+--------+-------+
| id | no      | class  | grade |
+----+---------+--------+-------+
|  1 | 2020001 | 语文   |    88 |
|  2 | 2020002 | 数学   |    98 |
|  3 | 2020003 | 英语   |   100 |
|  4 | 2020004 | 政治   |    78 |
|  5 | 2020002 | 语文   |    99 |
|  6 | 2020003 | 语文   |    95 |
|  7 | 2020004 | 语文   |   100 |
|  8 | 2020001 | 英语   |    80 |
|  9 | 2020006 | 英语   |    50 |
| 10 | 2020002 | 英语   |    40 |
+----+---------+--------+-------+
10 rows in set (0.00 sec)


(1)查询全班语文成绩最高分数
mysql> select max(grade) from grade where class='语文';
+------------+
| max(grade) |
+------------+
|        100 |
+------------+
1 row in set (0.00 sec)

(2)按照年龄对student表进行倒序排列
mysql> select * from student order by age desc;
+----+---------+--------+------+------+-----------+
| id | no      | name   | age  | sex  | pronvince |
+----+---------+--------+------+------+-----------+
|  5 | 2020005 | 周三   |   22 || 广州      |
|  4 | 2020004 | 杨三   |   21 || 上海      |
|  3 | 2020003 | 王三   |   20 || 北京      |
|  2 | 2020002 | 李三   |   19 || 湖南      |
|  1 | 2020001 | 张三   |   18 || 辽宁      |
|  6 | 2020006 | 帅帅   |   12 || 辽宁      |
+----+---------+--------+------+------+-----------+
6 rows in set (0.00 sec)

mysql> 


(3)查询班级中英语成绩及格的全部女生
mysql> select * from student s, grade g where s.no=g.no and s.sex = '女' and g.grade >60  and g.class = '英语';
+----+---------+--------+------+------+-----------+----+---------+--------+-------+
| id | no      | name   | age  | sex  | pronvince | id | no      | class  | grade |
+----+---------+--------+------+------+-----------+----+---------+--------+-------+
|  1 | 2020001 | 张三   |   18 || 辽宁      |  8 | 2020001 | 英语   |    80 |
+----+---------+--------+------+------+-----------+----+---------+--------+-------+
1 row in set (0.00 sec)

mysql> 


33、

已知教学数据库包含三个关系:学生关系S(SND,SNAME,SA,SD)课程关系C(CNO,CN,TNAME),选课关系SC(SNO,CNO,G)其中,下划线的字段为该关系的码,SNO 代表学号,SNAME代表学生姓名,SA代表学生年龄,SD代表学生所在系,CNO代表课程号,CN代表课程名,TNAME代表任课老师姓名,G代表成绩,请用SQL语句实现:
1、简历学生关系和选课关系,有完整约束的要定义完整性约束
2、将下列学生信息插入学生关系中:李丹,18岁,电信系,学号:20070206INSERT into S(SNO,SNAME,SD) VALUES(20070206,'李丹∵电信系"》;
3、找出选修了课程为“112002"的学生学号和姓名
SELECT S.SNO,S.SNAME FROM s s,sc C where S.SNO=C.SNO AND C.CNO='112002";
4、修改学号为”20070206"的学生所在的系为计算机
UPDATE S SET SD="计算机'WHERE SNO="20070206'
5、查询选修了数据库系统原理这门课的学生的姓名和成绩
SELECT S.SNAME,C.G FROM s s,sC C where s.SNO=C.SNO;



版权声明:本文为weixin_36912391原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。