实施面试题(3)

一.JDBC连oracle/MySQL,并实现查询

public class Test {

    private String driName = "com.mysql.jdbc.Driver";

    private String url = "jdbc:mysql://localhost:3306/myschool";

    private String dbName = "root";

private String dbPwd = "root";

 /**

     * 获得连接

     */

    public Connection getConn() {

        Connection conn = null;

        try {

            Class.forName(driName);

            conn = DriverManager.getConnection(url, dbName, dbPwd);

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return conn;

}

/**

     * 关闭数据库连接

     */

    public void closeAll(ResultSet rs,PreparedStatement stat, Connection conn) {

    try {

        if (rs != null)

            rs.close();

        if (stat != null)

            stat.close();

        if (conn != null)

            conn.close();

    } catch (SQLException e) {

        e.printStackTrace();

}}}

二.数据库部分:

现有商品表(product)如下:

ID

NAME

PRICE

TYPE

1

冰箱

1500.0

家电

2

苹果

3.0

水果

3

李子

7.0

水果

4

电视

6000.0

家电

5

台灯

20.0

家电

 顾客表(customer)如下:

ACID

ACNAME

ACADRESS

1

张三

北京

2

李四

上海

3

王五

天津

 商品交易表(order)如下:

ACID

ID

AMOUNT

1

1

12

3

1

1

2

2

3

1

3

1

1

2

4

3

5

4

 请回答以下问题并编写数据库语句:

1.按照逻辑关系,这三张表的主外键关系以及约束你认为应该如何设置?并阐明你的理由。(1)商品表(product)的主键是 ID,对应的外键是商品交易表(order)的ID;

(2)顾客表(customer)的主键是ACID,对应的外键是商品交易表的(order)的ACID;

2.求取买过李子的顾客名称及地址的SQL语句

select ACNAME as 顾客名称,ACADRESS as 地址 from  product as p

        Inner  join order as  o  on o.ID=p.ID

        Inner  join customer as c on c.ACID=o.ACID

Where  p.NAME=’李子’;

  1. 求取既买过李子又买过苹果的顾客名称

select ACNAME as 顾客名称 from  product as p

        Inner  join order as  o  on o.ID=p.ID

        Inner  join customer as c on c.ACID=o.ACID

Where  p.NAME=’李子’and p.NAME=’苹果’;

4.求取销售数量前两名的顾客名称

select NAME as 商品名称 from product as p

Inner  join order as o on o.ID=p.ID

Order by amount desc

Limit 0,2;

5.请写出包含三张表的数据,包含主外键

1)CREATE TABLE `product` (

  `ID` int(11) NOT NULL AUTO_INCREMENT,

  `NAME` varchar(255) COLLATE utf8_unicode_ci NOT NULL,

  `PRICE` double NOT NULL,

  `TYPE` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,

  PRIMARY KEY (`ID`)

) ENGINE=InnoDB comment=’现有商品表’

2)CREATE TABLE `customer` (

  `ACID` int(11) NOT NULL AUTO_INCREMENT,

  `ACNAME` varchar(255) COLLATE utf8_unicode_ci NOT NULL,

  `ACADRESS` varchar(255) COLLATE utf8_unicode_ci NOT NULL,

  PRIMARY KEY (`ACID`)

) ENGINE=InnoDB comment=’顾客表’;

3)CREATE TABLE `order` (

  `ACID` int(11) NOT NULL,

  `ID` int(11) NOT NULL,

  `AMOUNT` int(11) NOT NULL,

  PRIMARY KEY (`ACID`),

  KEY `order_id` (`ID`),

  CONSTRAINT `order_acid` FOREIGN KEY (`ACID`) REFERENCES `customer` (`ACID`),

  CONSTRAINT `order_id` FOREIGN KEY (`ID`) REFERENCES `product` (`ID`)

) ENGINE=InnoDB comment=’商品交易表’;

6、请描述当该场景数据量增长到10万行以后,为了保证查询效率,应如何设置索引,并写出创建索引的语句。

等待上网查

三.简答题

1.Oracle是怎样分页的?

使用rownum进行分页

2.简述Oracle中dml、ddl、dcl的使用

 DML是 数据操纵语言update、delete、insert

DDL是数据定义语言 create 、drop 、alter

DCL是 数据控制语言 commit、rollback、grant、invoke

3.Oracle数据库union和union all的区别?

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。Union All 速度比Union快

4.rowid和rownum的定义

   Rowid: 表中的每一行在数据文件中都有一个物理地址,ROWID 伪列返回的就是该行的物理地址。使用 ROWID 可以快速的定位表中的某一行。ROWID 值可以唯一的标识表中的一行。由于 ROWID 返回的是该行的物理地址,因此使用 ROWID 以显示行是如何存储的。

也可以通过指定 ROWID 来查询记录

Rownum:

在查询的结果集中,ROWNUM 为结果集中每一行标识一个行号,第一行返回 1,第二行返回 2,以此类推。通过 ROWNUM 伪列可以限制查询结果集中返回的行数。

5.请说明数据库主键、外键的作用

主键:唯一标识,不能为空,加快查询速度,自动创建索引
外键:约束内表的数据的更新,从定义外键时可以发现 外键是和主键表联系,数据类型要统一,长度(存储大小)要统一。这样在更新数据的时候会保持一致性

6.说说Oracle中经常使用的函数

ceil(n) 大于或等于数值n的最小整数  
floor(n) 小于等于数值n的最大整数
power(m,n) m的n次方    
round(n,m) 将n四舍五入,保留小数点后m位 
sign(n) 若n=0,则返回0,否则,n>0,则返回1,n<0,则返回-1
sqrt(n) n的平方根      
initcap(char) 把每个字符串的第一个字符换成大写  
lower(char) 整个字符串换成小写       
replace(char,str1,str2) 字符串中所有str1换成str2
substr(char,m,n) 取出从m字符开始的n个字符的子串

7.怎样创建索引、索引使用的原则,有什么优点和缺点?

对于查询频率高的字段创建索引

对排序、分组、联合查询频率高的字段创建索引

索引的数目不宜太多

优点:(1)帮助用户提高查询速度
(2)利用索引的唯一性来控制记录的唯一性
(3)可以加速表与表之间的连接
(4)降低查询中分组和排序的时间
创建索引的缺点:
(1)存储索引占用磁盘空间
(2)执行数据修改操作(INSERT、UPDATE、DELETE)产生索引维护

 

四、如执行  select * from score 查询语句返回结果集:

name

subject

score

张三

语文

80

张三

数学

80

张三

英语

59

李四

语文

56

李四

数学

47

李四

英语

62

王五

语文

77

王五

数学

65

王五

英语

88

1)写一段 Sql 语句,查询至少两门科目不及格(小于60分)的人的姓名;

Select    name as '姓名'

From     Score

WHERE score<60

GROUP BY name

HAVING COUNT(`subject`)>=2

2)写一段 sql 语句,查询所有科目都不及格的人的姓名(科目数未知)

Select name as '姓名'

From    Score

WHERE score<60

GROUP BY name

HAVING COUNT(`subject`)>=3

五、数据库有学生表: student(sid,sName,age,address,dNo);

成绩表: score(sid,cid,score);

课程表: class(cld,cName,tName);

Sid--学号,sName--学生名称,dNo--学生所在系的编号,cid--课程号,cName--课程名,tName--教师名,数据库含有数据,写出下列查询的SQL语句:

 

A、查询姓名为“丁一”的学生的所选课程、任课教师及课程成绩:

Select

class.`cName` AS ‘所选课程’,class.`tName` AS ‘任课教师’,score.`score` AS ‘课程成绩’

From    student

Inner join score on student.sid = score.sid

Inner join class on class.cid = score.cid

Where student.`sName` = ‘丁一’;

B、查询“计算机”课程的成绩等于或大于90分学生的姓名及学号:

Select   student.`sName` AS ‘学生姓名’,student.`sid` As ‘学号’

From    student

Inner join score on student.sid = score.sid

Inner join class on class.cid = score.cid

Where class.`cName` = ‘计算机’

And  score.`score`>=90;

C、查询学生的总数和平均年龄:

Select   count(*) AS ‘学生总数’, avg(age) AS ‘平均年龄’

From   student

D、查询每个系的选修各门课程的学生数量及平均成绩:

Select

student.`dNo` AS ‘院系’, class.`cName` AS ‘课程名’, count(score.`sid`) AS ‘学生数量’, avg(score.`score`) AS ‘平均成绩’

From   student

Inner join score on student.sid = score.sid

Inner join class on class.cid = score.cid

Group by student.`dNo`

Select

student.`dNo` AS '院系', count(score.`sid`) AS '大于70分的学生数量', avg(score.`score`) AS '英语平均成绩'

From   score

Inner join student on student.sid = score.sid

Inner join class on class.cid = score.cid

Where class.cName = '英语'

Group by student.`dNo`

HAVING avg(score.`score`)>70

 

上一篇:mysql事务的 四个特征(ACID)


下一篇:什么是ACID、CAP与BASE