JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
答:MVC是Model-View-Controller的简写。Model 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), View 是应用的表示面(由JSP页面产生),Controller 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
?Public String translate (String str) {
???String tempStr = "";
???try {
?????tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
?????tempStr = tempStr.trim();
???}
???catch (Exception e) {
?????System.err.println(e.getMessage());
???}
???return tempStr;
?}
?select * from employee order by deptid desc,salary
创建表:
???????mysql> create table employee921(id int primary key auto_increment,name varchar(5
0),salary bigint,deptid int);
插入实验数据:
mysql> insert into employee921 values(null,'zs',1000,1),(null,'ls',1100,1),(null
,'ww',1100,1),(null,'zl',900,1) ,(null,'zl',1000,2), (null,'zl',900,2) ,(null,'z
l',1000,2) , (null,'zl',1100,2);
编写sql语句:
()select avg(salary) from employee921 group by deptid;
()mysql> select employee921.id,employee921.name,employee921.salary,employee921.dep
tid tid from ?employee921 where salary > (select avg(salary) from employee921 where ?deptid = tid);
???效率低的一个语句,仅供学习参考使用(在group by之后不能使用where,只能使用having,在group by之前可以使用where,即表示对过滤后的结果分组):
mysql> select employee921.id,employee921.name,employee921.salary,employee921.dep
tid tid from ?employee921 where salary > (select avg(salary) from employee921 group by deptid having deptid = tid);
()select count(*) ,tid
from (
select employee921.id,employee921.name,employee921.salary,employee921.deptid tid
from ? employee921
where salary >
? (select avg(salary) from employee921 where ?deptid = tid)
) as t
group by tid ;
另外一种方式:关联查询
select a.ename,a.salary,a.deptid
?from emp a,
????(select deptd,avg(salary) avgsal from emp group by deptid ) b
?where a.deptid=b.deptid and a.salary>b.avgsal;
?存储过程(Stored Procedure)是一组为了完成特定功能的 SQL 语句集,经编译后存
储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执
行它。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个
单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明
变量、有条件执行以及其它强大的编程功能。存储过程在创建时即在服务器上进行编译,所
以执行起来比单个 SQL 语句快。?
存储过程的优点:(1)存储过程只在创造时进行编译,以后每次执行存储过程都不需
再重新编译, 而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行
速度; (2) 当对数据库进行复杂操作时(如对多个表进行 Update, Insert, Query, Delete 时) ,
可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用;(3)存储过
程可以重复使用,可减少数据库开发人员的工作量;(4)安全性高,可设定只有某此用户才
具有对指定存储过程的使用权。?
存储过程的缺点:(1)如果更改范围大到需要对输入存储过程的参数进行更改,或者
要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调
用, 等等, 这时候估计比较繁琐了。 (2) 可移植性差。 由于存储过程将应用程序绑定到 SQL?
Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。
触发器是数据库中由一个时间触发的特殊的存储过程,他不是由程序条用也不是手工启动的。触发器的执行可以由对一个表的insert,delete, update等操作来触发,触发器经常用于加强数据的完整性约束和业务规则等等。
触发器可以对其他表进行查询,也可以包含复杂的SQL语句。他么主要用于强制服从复杂的业务规则或者要求。例如可以利用触发器根据客户当前的帐户状态来控制是否允许插入新的订单。
触发器也可以用于强制引用完整性,以便在多个表中添加,删除或者更新数据时,保留这些表之间的关系。
name?? kecheng?? fenshu
张三???? 语文?????? 81
张三???? 数学?????? 75
李四???? 语文?????? 76
李四???? 数学?????? 90
王五???? 语文?????? 81
王五???? 数学?????? 100
王五???? 英语?????? 90
准备数据的sql代码:
create table score(id int primary key auto_increment,name varchar(20),subject varchar(20),score int);
insert into score values
(null,'张三','语文',81),
(null,'张三','数学',75),
(null,'李四','语文',76),
(null,'李四','数学',90),
(null,'王五','语文',81),
(null,'王五','数学',100),
(null,'王五 ','英语',90);
提示:当百思不得其解时,请理想思维,把小变成大做,把大变成小做,
答案:
A: select distinct name from score? where? name not in (select distinct name?from?score?where score<=80)
B:select distince name t1 from score where 80< all (select score from score where name=t1);
一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.
答:select a.name, b.name
from team a, team b
where a.name < b.name
请用SQL语句实现:从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。请注意:TestDB中有很多科目,都有1-12月份的发生额。
AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。
数据库名:JcyAudit,数据集:Select * from TestDB
准备数据的sql代码:
drop table if exists TestDB;
create table TestDB(id int primary key auto_increment,AccID varchar(20), Occmonth date, DebitOccur bigint);
insert into TestDB values
(null,'101','1988-1-1',100),
(null,'101','1988-2-1',110),
(null,'101','1988-3-1',120),
(null,'101','1988-4-1',100),
(null,'101','1988-5-1',100),
(null,'101','1988-6-1',100),
(null,'101','1988-7-1',100),
(null,'101','1988-8-1',100);
--复制上面的数据,故意把第一个月份的发生额数字改小一点
insert into TestDB values
(null,'102','1988-1-1',90),
(null,'102','1988-2-1',110),
(null,'102','1988-3-1',120),
(null,'102','1988-4-1',100),
(null,'102','1988-5-1',100),
(null,'102','1988-6-1',100),
(null,'102','1988-7-1',100),
(null,'102','1988-8-1',100);
--复制最上面的数据,故意把所有发生额数字改大一点
insert into TestDB values
(null,'103','1988-1-1',150),
(null,'103','1988-2-1',160),
(null,'103','1988-3-1',180),
(null,'103','1988-4-1',120),
(null,'103','1988-5-1',120),
(null,'103','1988-6-1',120),
(null,'103','1988-7-1',120),
(null,'103','1988-8-1',120);
--复制最上面的数据,故意把所有发生额数字改大一点
insert into TestDB values
(null,'104','1988-1-1',130),
(null,'104','1988-2-1',130),
(null,'104','1988-3-1',140),
(null,'104','1988-4-1',150),
(null,'104','1988-5-1',160),
(null,'104','1988-6-1',170),
(null,'104','1988-7-1',180),
(null,'104','1988-8-1',140);
--复制最上面的数据,故意把第二个月份的发生额数字改小一点
insert into TestDB values
(null,'105','1988-1-1',100),
(null,'105','1988-2-1',80),
(null,'105','1988-3-1',120),
(null,'105','1988-4-1',100),
(null,'105','1988-5-1',100),
(null,'105','1988-6-1',100),
(null,'105','1988-7-1',100),
(null,'105','1988-8-1',100);
答案:
select distinct AccID from TestDB
where AccID not in?
(select TestDB.AccIDfrom TestDB,
?(select * from TestDB where AccID='101') as db101
where TestDB.Occmonth=db101.Occmonth and TestDB.DebitOccur<=db101.DebitOccur
);