复试华工--SQL语句
1 数据库连接
首先要打开SQL Server Browser——在重启SQL Server(MSSQLSERVER)——使TCP/IP协议启动成功。
去下面链接下载jar包,我的jdk是1.8的,所以下载sqljdbc42.jar的包。
下载jar包
然后进入eclipse界面,找到的当前工程文件,点击右键,选中properties->Java Build Path->Libraries->add external jars->找到我们刚刚下载到的sqljdbc42.jar类库,添加即可。
注意需要把数据库的身份验证改为SQL Server和Windows身份验证模式,同时修改sa管理员的密码。再点击“状态”下的“已启用”
右击数据库——点击“权限”——点击“查看服务器权限”——点击“安全性”,修改身份验证模式。
在对象资源管理器中的“安全性”下找到登录名sa,右击修改密码,再点击“状态”,使“登录”下选择已启用
2 数据库连接代码
public class DBUtil {
static String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
static String user = "数据库用户"; //我这里是sa超级管理员
static String password = "密码";
static String url = "jdbc:sqlserver://localhost:1433;database=数据库名称";
static {
try {
Class.forName(driverName);
System.out.println("获取驱动成功");
} catch (ClassNotFoundException e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("获取驱动失败");
}
}
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接成功");
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("数据库连接失败");
}
return conn;
}
}
3 考试中数据库操作的SQL语句
3.1 统计大科室的病人人数
注:要想进行统计查询每个大科室的人数,单纯使用聚集函数难以表达,这种查询要进行分组,再应用聚集函数。带group by子句的select语句执行效果:首先对from子句中的表计算笛卡尔积,再根据where的条件得到查询的中间结果。然后,按照group by子句指定的一个或多个列对中间结果分组,在这些列上的值相等的元组分为一组;计算聚集函数。
select [Department].[DeptName], sum([Group].[Number])
from [Department], [Group]
where [Department].[DeptNo] = [Group].[DeptNo]
group by [Department].[DeptName]
3.2 统计每月的病人数目
select [Month], sum([Number]) as [Numbers]
from [Group]
group by [Month]
3.3 三个表查询
order by可以对记录进行有序输出,desc为降序输出,asc或者默认是升序输出
根据病人姓名模糊查询,[Patient].[PName] = '%输入字%'
%可以与零个或者多个字符进行匹配,_下划线只能与单个字符进行匹配
select [Department].[DeptName], [Group].[GroupName], [Patient].[PName]
from [Department], [Group], [Patient]
where [Department].[DeptNo] = [Group].[DeptNo] and [Group].[GroupNo] = [Patient].[GroupNo] and [Department].[DeptName] = '内科' and [Group].[GroupName] = '心内科'
order by [Department].[DeptName] desc, [Group].[GroupNo] ,[Patient].[PName] desc
3.4 增删改就不写了
3.5 显示最多病人人数和最小病人人数的记录
(要求找出最多病人人数和最少病人人数的记录,界面只显示找出的记录,而隐藏其他的记录)
这个比较难想一点,要用union并集,将两条记录并在一起
select *
from [Group]
where [Number] = (select max([Number]) from [Group])
union
select *
from [Group]
where [Number] = (select min([Number]) from [Group]);
4 还有个工具类Utils
public class StringUtil {
public static boolean isEmpty(String str) {
if(str == null || "".equals(str.trim())) {
return true;
}
else {
return false;
}
}
}
4.1 关于如何判断输入的字符串是否为数字
使用正则表达式
private boolean isNumeric(String str){
Pattern pattern = Pattern.compile("[0-9]*");
return pattern.matcher(str).matches();
}
5 一些其他语句
5.1 向基本表增加新的列,删除已存在列
alter table [表名] add [列名] 类型 列约束
alter table [Score] add [Grade] int check([Grade]>=0 and [Grade]<=150)
alter table [表名] drop [列名] {cascade|restrict}