mysql常见的面试题

package com.chp.mysql;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;


public class Jdbc {

	public static void main(String[] args) {
		// 1.加载驱动类
		try {
			Class.forName("com.mysql.jdbc.Driver");
			// 2.建立连接
			String url = "jdbc:mysql://localhost:3306/java";
			Connection con = DriverManager.getConnection(url, "root", "root");
			// 查询
			String sql = "select * from teacher";
			//使用preparedStatement作用:性能更高,防止sql注入 
			PreparedStatement ps = con.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				System.out.println(rs.getString(1)+rs.getString(2));

			}
			// 增删改
			sql = "update teacher set name =? where teaId=?";
			ps = con.prepareStatement(sql);
			ps.setString(1, "程老师");
			ps.setInt(2, 1);
			ps.executeUpdate();
			
			//调用存储过程
			CallableStatement cstm=con.prepareCall("{call myProdure(?,?,?)}");
			cstm.setString(1, "苍老师");
			cstm.setInt(2, 99);
			cstm.registerOutParameter(3, Types.INTEGER);
	
			cstm.execute();
			System.out.println(cstm.getInt(3));
			//执行完需要关闭jdbc对象
			if (rs != null) {//关闭记录集
				rs.close();
			}
			if (ps != null) {//关闭声明
				ps.close();
			}
			if (con != null) {//关闭连接对象
				con.close();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

一.前言

   本人是搞java系统开发这块的,数据库是面试笔试的重点,所以特定整理了一些自己遇到的自认为有价值和他人遇到的好的面试题进行整理.这篇就当做题集.会不定期更新此篇题集.

 

题目1

    什么是数据库事务?

  答案:单个逻辑单元执行的一系列操作,这些操作要么全做要么全不做,是不可分割的.事务的开始和结束用户是可以控制的,如果没控制则由数据库默认的划分事务.事务具有以下性质:

(1)原子性

    指一个事务要么全执行,要么全不执行.也就是说一个事务不可能执行到一半就停止了.比如:你去买东西,钱付掉了,东西没拿.这两步必须同时执行 ,要么都不执行.

(2)一致性

   指事务的运行并不改变数据库中的一致性.比如 a+b=10;a改变了,b也应该随之改变.

(3)独立性

   两个以上的事务不会出现交替运行的状态,因为这样可能导致数据的不一致

(4)持久性

   事务运行成功之后数据库的更新是永久的,不会无缘无故的回滚.

 

题目2

   执行数据库查询时候,如果查询的数据有很多,假设有1000万条,用什么方法可以提高查询效率?在数据库方面或java代码方面有什么优化办法?

1.在数据库设计方面

(1)建立索引

(2)分区(比如说按时间分区)

(3)选取最适用的字段属性(尽量减少字段宽度和使用固定长度的字段)

2.在数据库I/O方面

(1)增加缓冲区

(2)如果涉及到表的级联,最好不同的表放在不同的磁盘,以增加I/O速度

3.Sql语句方法

(1)优化sql语句,减少比较次数,可用连表查询来代替子查询

(2)限制返回的条目数(mysql用limit)

(3)有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就

去掉外键(比喻:就好比免检产品,就是为了提高效率,充分相信产品的制造商)

4.在java方面

如果反复使用的查询,可通过preparedstatement,因为他在运行前已经预编译,只要运行就Ok了.

 

题目3

sql语言的常见问题

1.增删查改之类的问题,连表查询是必出题目,可以参考之前我写的那篇文章

这里讲一些分组查询跟降序升序分页

分组:group by 列名 

统计各个部门薪水大于5000的人数

例子:SELECT department , COUNT(money) from employee where money>=5000group by department;

 

分页:limit ()

select * from table limit 5; --返回前5行 

select * from table limit 0,5; --同上,返回前5行  

select * from table limit 5,10; --返回6-15行

应用到java里,select * from table limit " +(pageNo-1)*pageSize + "," + pageSize

排序:order by 列名 

asc 和desc 不写默认为升序

前者是升序后者是降序

 

综合题:

 以下两张表,员工表employee 与部门表 department

             

查询结果如下:

请写出sql语句

分析:

我们可以看到这是一般的连表,但是连表的显示的统计人数,所以我们分两步来走

第一步:查出各个部门的对应人数,把这个看做一个新表e1

select e.dep_id,count(name) num from employee e group by dep_id;

第二部:将查询结果与部门表连表

由于查询结果是显示左边的全部表格信息所以用左联,空的话为0,则采用ifnull()函数来解决

select d.*,ifnull(num,0) num  from  department d left  join (select e.dep_id,count(name) num from employee e group by dep_id) e1 on d.id=e.dep_id;

 

题目四

什么是数据库的三范式?

第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)

数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必

须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两

个独立的字段。

第二范式(2NF):

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必

须先满足第一范式(1NF)。

要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储

各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。

第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖

主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成

一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,

以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。

第三范式的要求如下:

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一

个数据库表中不包含已在其它表中已包含的非主关键字信息。

所以第三范式具有如下特征:

1,每一列只有一个值

2,每一行都能区分。

3,每一个表都不包含其他表已经包含的非主关键字信息。

例如,帖子表中只能出现发帖人的 id,而不能出现发帖人的 id,还同时出现发帖人姓名,

否则,只要出现同一发帖人 id 的所有记录,它们中的姓名部分都必须严格保持一致,这就

是数据冗余

题目五

union 与union all的区别

 

union 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排 序运算,删除重复的记录再返回结果。 union all 则会显示重复结果,只是简单的两个结果合并并返回.所以效率比union高,在保证没有重复数据的情况下用union all.

select name from table1

union

select name  from table2;

题目六

.用一条 SQL  语句查询出每门课都大于 80 分的学生姓名 

name kecheng fenshu 

张三   语文          81 

张三   数学          75 

李四   语文          76 

李四   数学          90 

王五   语文          81 

王五   数学        100 

王五   英语         90  

分析:都大于80,他的反面就是<=80,我们可以先求出所有<=80的姓名,然后取反就可以了 

所以sql语句 select name from student where name not in (select  name from student where fenshu <=80);

 

题目七

求各个部门直接的比赛结果?  有个叫team 的表格,里面有id跟部门名name,如果各个部门要举行比赛用语句求出比赛结果  

select a.name,b.name from game a cross join game b where a.name<b.name;

 

题目八

一个用户表中有一个积分字段,假如数据库中有 100 多万个用户,若要在 多万个用户,若要在

每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决 每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?

 

alter table drop column score;

alter table add colunm score int;

可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意,

这样的操作时无法回滚的,在我的印象中,只有 insert update delete 等 DML 语句才能回滚,

对于 create table,drop table ,alter table 等 DDL 语句是不能回滚

题目九

Class.forName()的作用?

按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载

过,则返回代表该字节码的 Class 实例对象,否则,按类加载器的委托机制去搜索和加载该

类,如果所有的类加载器都无法加载到该类,则抛出 ClassNotFoundException。加载完这

个 Class 字节码后,接着就可以使用 Class 字节码的 newInstance 方法去创建该类的实例

对象了。

题目十

大量数据的分页?

select * from table order by id limit(pagesize*(pageNumbe-1),pagesize);

 

题目十一

统计每年每月的信息
year monthamount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
查成这样一个结果
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
提示:这个与工资条非常类似,与学生的科目成绩也很相似。

select sales.year ,
(select t.amount from sales t where t.month='1' and t.year= sales.year) ' m 1',
(select t.amount from sales t where t.month=' 2 ' and t.year= sales.year) ' m 2',
(select t.amount from sales t where t.month=' 3 ' and t.year= sales.year) ' m 3',
(select t.amount from sales t where t.month=' 4 ' and t.year= sales.year) as ' m 4' from
sales group by year;

题目十二

. 删除除了 id  号不同, 其他都相同的学生冗余信息
2.学生表如下:
id 号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001       数学         69
2 2005002 李四 0001       数学         89
3 2005001 张三 0001       数学         69

mysql写法:

DELETE FROM student  WHERE ID NOT IN (SELECT t.id FROM(
        SELECT  MIN(id) id FROM student  GROUP BY 学号, 姓名,课程,编号,分数
    ) t)

注意:一定要按上面的写,如果你以为select t.id 多此一举的话那么你就大错特错了,原因:在mysql中,不能通过嵌套子查询来直接删除或者修改记录,需要通过别名来指定嵌套子查询作为一个临时表

同时还要注意给min(id)定义一个id别名,不然无法识别列名

 

题目十二

用JDBC如何调用存储过程以及sql调用

package com.chp.mysql;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;


public class Jdbc {

	public static void main(String[] args) {
		// 1.加载驱动类
		try {
			Class.forName("com.mysql.jdbc.Driver");
			// 2.建立连接
			String url = "jdbc:mysql://localhost:3306/java";
			Connection con = DriverManager.getConnection(url, "root", "root");
			// 查询
			String sql = "select * from teacher";
			//使用preparedStatement作用:性能更高,防止sql注入 
			PreparedStatement ps = con.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				System.out.println(rs.getString(1)+rs.getString(2));

			}
			// 增删改
			sql = "update teacher set name =? where teaId=?";
			ps = con.prepareStatement(sql);
			ps.setString(1, "程老师");
			ps.setInt(2, 1);
			ps.executeUpdate();
			
			//调用存储过程
			CallableStatement cstm=con.prepareCall("{call myProdure(?,?,?)}");
			cstm.setString(1, "苍老师");
			cstm.setInt(2, 99);
			cstm.registerOutParameter(3, Types.INTEGER);
	
			cstm.execute();
			System.out.println(cstm.getInt(3));
			//执行完需要关闭jdbc对象
			if (rs != null) {//关闭记录集
				rs.close();
			}
			if (ps != null) {//关闭声明
				ps.close();
			}
			if (con != null) {//关闭连接对象
				con.close();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以下是一些 MySQL 常见面试题: 1. 什么是 MySQLMySQL 是一种开源的关系型数据库管理系统(RDBMS),用于存储、管理和检索数据。它是一种客户端/服务器模型数据库,可以同时支持多个连接。 2. MySQL 的优点是什么? MySQL 的优点包括: - 开源:MySQL 是免费和开源的,可以用于商业和非商业用途。 - 可扩展性:MySQL 可以处理大量数据和高并发请求。 - 跨平台:MySQL 可以在多个操作系统上运行,如 Windows、Linux、Mac 等。 - 安全性:MySQL 提供了许多安全功能,如 SSL 加密、访问控制和数据加密。 3. MySQL 中的主键和唯一键有什么区别? 主键是一列或一组列,用于唯一标识表中的每一行数据。主键必须是唯一的,且不能为 NULL。 唯一键是一列或一组列,用于确保表中的数据唯一。唯一键可以包含 NULL 值,但每个值只能出现一次。 4. 如何在 MySQL 中创建一个新表? 可以使用以下命令在 MySQL 中创建一个新表: ``` CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, ... ); ``` 其中,`table_name` 是要创建的表的名称,`column1`、`column2`、`column3` 等是表中的列名,`datatype` 是每列的数据类型。 5. 如何在 MySQL 中插入新数据? 可以使用以下命令在 MySQL 中插入新数据: ``` INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...); ``` 其中,`table_name` 是要插入数据的表的名称,`column1`、`column2`、`column3` 等是表中的列名,`value1`、`value2`、`value3` 等是要插入的值。 6. 如何在 MySQL 中更新数据? 可以使用以下命令在 MySQL 中更新数据: ``` UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition; ``` 其中,`table_name` 是要更新数据的表的名称,`column1`、`column2` 等是要更新的列名,`value1`、`value2` 等是要更新的值,`condition` 是更新数据的条件。 7. 如何在 MySQL 中删除数据? 可以使用以下命令在 MySQL 中删除数据: ``` DELETE FROM table_name WHERE condition; ``` 其中,`table_name` 是要删除数据的表的名称,`condition` 是删除数据的条件。 8. 如何在 MySQL 中查询数据? 可以使用以下命令在 MySQL 中查询数据: ``` SELECT column1, column2, ... FROM table_name WHERE condition; ``` 其中,`column1`、`column2` 等是要查询的列名,`table_name` 是要查询的表的名称,`condition` 是查询数据的条件。 9. 如何在 MySQL 中创建索引? 可以使用以下命令在 MySQL 中创建索引: ``` CREATE INDEX index_name ON table_name (column1, column2, ...); ``` 其中,`index_name` 是要创建的索引的名称,`table_name` 是要创建索引的表的名称,`column1`、`column2` 等是要创建索引的列名。 10. 如何在 MySQL 中优化查询? 可以使用以下方法优化 MySQL 查询: - 创建索引:可以提高查询速度。 - 避免使用 SELECT *:只查询需要的列,可以减少查询时间。 - 避免在 WHERE 子句中使用函数:可以减少查询时间。 - 避免使用子查询:可以减少查询时间。 - 分页查询时使用 LIMIT:可以减少查询时间和减轻服务器负担。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值