数据库高级编程(十六)

SQL数据库

一、数据库的发展历史

二、相关概念

载体 - 数据表(表格) - 文件 - 0、1

三、数据库的设计过程(重点)

1、收集信息

座谈会,获取需求 - 文字

2、标识对象(名词)

也叫实体,它是相关信息的集合

 通俗讲,由多个信息描述的东西就是对象或叫实体
 
 帐号、密码、手机、邮箱、状态、身份证 - 用户

3、标识属性

属性用于描述对象的特征。 ​ 或者属性是实体对象关注的信息。

4、标识关系

实体与实体之间的关系 ​ 它是主外键约束的依据

 1:1  - 老公信息表 VS 老婆信息表
 1:M / M:1 - 用户 - 订单
 M:N   - 客户 - 商家
            - 老师 - 学生
 建立主外键的要点:
 1)1:1的关系中,外键放在哪张表都没问题(看需求)
 2)1:M的系统中,外键一般放在M的那边(降低数据的冗余)
 3)M:N的关系中,一般会创建一张中间表,分别存储两张表的外键(降低数据的冗余)
  M:N的关系中,肯定在不能彼此之间创建外键,应该创建一个中间表(s实体)

5、绘制E-R图

实体:矩形 ​ 属性:椭圆形 ​ 关系:菱形 ​ 连接:直线(标识映射关系)

6、把E-R图转换为数据表(关系表)

1.把实体名转换为表名 ​ 2.把属性转换为表的字段(列) ​ 3.标识主键 ​ 4.标识表间的关系(外键) - 通过外键,实现实体之间的映射关系

7、使用范式规范化数据表

=========================================================================

四、单表查询

一、表达式

操作数与操作符组合的式子,如: a + 100

二、基本查询

1、语法

select [distinct] [顶部条数| 聚合函数] 字段集合|* from 表名 [where 查询条件语句集合] [group by 分组字段列表] [having 过滤条件语句集合] 分组查询条件 [order by 排序字段集合 [asc | desc]]

2、查询全部字段数据

select * from 表名 ; select * from 学生信息 ;

3、局部字段查询

select 字段1,...,字段n from 表名 ;

select 学号,姓名,性别,出生日期 from 学生信息 ;

注意:在实际的开发中,一般使用局部字段查询,哪怕查询全部字段,不允许使用* - 性能

4、前N条数

select top n | top n percent ...

select top 5 * from 学生信息

select top 50 percent * from 学生信息

5、条件查询

select 字段集合|* from 表名 where 条件 ;

注意:条件一般是关系表达式或逻辑表达式

select * from 学生信息 where 性别='女'

select * from 学生信息 where 性别='女' and convert(varchar,家庭住址)='江西南昌'

-- 类型转换:convert(数据类型,字段|数据)

6、别名( as)

语法一:select 字段 [as] 别名 ... 语法二:select 别名=字段 ... 语法二:select ... from 表名 as 别名

select 学号 as 学生编号,姓名,性别 from 学生信息 select 学号 学生编号,姓名,性别 from 学生信息 select 学生编号=学号,姓名,性别 from 学生信息

select 学号 ,姓名,性别 from 学生信息 as stu select stu.学号 ,stu.姓名,stu.性别 from 学生信息 as stu

注意: 别名并不影响原来表字段的名称 别名也可以应用于表名,可以使用表别名引用表中的字段,语法为:别名.字段,常用于多表查询且重复字段名称

7、字符连接(+)

select * from 学生信息;

select 姓名 + 性别 from 学生信息

select 姓名 + 性别 as Xxx from 学生信息

8、排序查询

order by 字段 asc|desc

asc:升序(默认) desc : 降序

select * from 学生信息 order by 出生日期 desc

select * from 学生信息 order by 出生日期 asc

select * from 学生信息 order by 出生日期

9、聚合函数 - 统计数据 ● sum() : 求和 ● avg() : 平均值 ● max() : 最大值 ● min() : 最小值 ● count() : 记录数

 

select * from 成绩信息;

select sum(convert(float,分数)) as 总分 , avg(convert(float,分数)) as平均分 , max(convert(float,分数)) as 最高分 , min(convert(float,分数)) as 最低分 , count(*) as 考生人数 from 成绩信息;

 

10、筛选重复数据(distinct)

select distinct *|字段集合 from ...

select distinct 性别 from 学生信息 ;

11、分组查询

select 字段 from 表名 group by 字段 having 条件

思路:先分组,后查询(统计-结合聚合函数)

select 性别,count(姓名) as 人数 from 学生信息 group by 性别

要点: select后面跟着的字段必须满足两个条件,要么分组字段、要么使用聚合函数。

-- 错误的示范:家庭住址既不是分组字段,也没有使用聚合函数,语法错误 select 性别,count(姓名) as 人数,家庭住址 from 学生信息 group by 性别

select 性别,count(姓名) as 人数 from 学生信息 group by 性别 having 性别='女'

select 性别,count(姓名) as 人数 from 学生信息 where 性别='女' group by 性别

 

12、模糊查询

... where 字段 like 值 ...

 其中,值一般结合以下三个通配符使用
  _   :表示任意的1个字符
  % :表示任意的0个或多个字符
  [] :表示某区间
  [值1值2...]
  [值1-值2]

select * from 学生信息;

select * from 学生信息 where 家庭住址 like '河南%'

select * from 学生信息 where 家庭住址 like '%南%'

select * from 学生信息 where 家庭住址 like '_南__'

select * from 学生信息 where 出生日期 like '198[4-6]%' select * from 学生信息 where 出生日期 like '198[456]%'

-- 注意:范围只支持个位数 select * from 学生信息 where 出生日期 like '198[14-65]%' select * from 学生信息 where 出生日期 like '198[14565]%'

五、多表查询

当我们查询的数据,分布在不同的数据表时,那么我们就需要多表查询

1、等值查询

select 字段集合 from 表1,表2,...,表n where 条件 (主外键)

注意:条件一般是主键和外键的关联 - 主外键是建立两张表联系的桥梁

-- 主键表 create table 教师表 ( 编号 int identity(1,1) primary key not null , 姓名 char(30) , 性别 char(2) check(性别='男' or 性别='女') default '男', 专业 char(30) )

drop table 学生表 drop table 教师表

-- 外键表 create table 学生表 ( 学号 int identity(1,1) primary key not null , 姓名 char(30) , 性别 char(2) check(性别='男' or 性别='女') default '男', 身高 float , 学分 float ,

教师编号 int

)

insert into 教师表 values ('张三','男','计算机') insert into 教师表 values ('李四','男','日语') insert into 教师表 values ('王五','女','英语')

insert into 学生表 values ('学生一','男',1.5,50,1) insert into 学生表 values ('学生二','女',2.5,60,1) insert into 学生表 values ('学生三','男',3.5,70,2) insert into 学生表 values ('学生四','女',4.5,80,2) insert into 学生表 values ('学生五','女',6.5,90,NULL)

select * from 教师表 select * from 学生表

select * from 教师表,学生表 where 编号=教师编号

-- 根据需要,筛选需要的字段 select t1.姓名 as 老师姓名,t2.姓名 as 学生姓名,学分 from 教师表 as t1,学生表 as t2 where 编号=教师编号

-- 注意:连接的表中,如果存在同名的字段,则需要给表指定别名, 通过别名引用不同表的字段

 

2、内连接(联接)查询

-- 功能同等值连接

select 字段集合 from 表1 inner join 表2 on 条件(主外键|相同数据类型)

select * from 教师表 inner join 学生表 on 编号=教师编号

select t1.姓名 as 老师姓名,t2.姓名 as 学生姓名,学分 from 教师表 as t1 inner join 学生表 as t2 on 编号=教师编号

 

3、外连接查询

1)左外连接

select 字段集合 from 表1 left [outer] join 表2 on 条件(主外键|相同数据类型) select * from 教师表 inner join 学生表 on 编号=教师编号

select * from 教师表 left join 学生表 on 编号=教师编号

以左表为基础,查询左表所有的数据 如果右表能通过主外键正常连接,则就正常连接 如果右表没有数据与左表连接,则以NULL值表示

2)右外连接

select 字段集合 from 表1 right [outer] join 表2 on 条件(主外键|相同数据类型)

select * from 教师表 right join 学生表 on 编号=教师编号

select * from 学生表 right join 教师表 on 编号=教师编号

以右表为基础,查询右表所有的数据 如果左表能通过主外键正常连接,则就正常连接 如果左表没有数据与右表连接,则以NULL值表示

3)完全外连接

select 字段集合 from 表1 full [outer] join 表2 on 条件(主外键|相同数据类型)

select * from 学生表 full join 教师表 on 编号=教师编号

 以左表和右表为基础,两张表的数据都必须查询出来
  如果能连接,则正常连接
  如果不能连接,则以NULL表示

总结: 如果只关注主外键匹配的数据,则使用等值连接或内连接 如果关注某张表的全部数据,则使用外连接查询

4、交叉连接

--语法一 select 字段集合 from 表1 cross join 表2 select * from 教师表 select * from 学生表 select * from 教师表 cross join 学生表

--语法二 select 字段集合 from 表1,表2 select * from 教师表,学生表

5、自连接

select * from 表1,表1 where 条件 select * from 教师表 as t1,教师表 as t2 where t1.编号=t2.编号

 

 

六、子查询

1、概念

当一个查询是另一个查询的条件时,称为子查询。

2、实现

2.1、[NOT] IN

... where 字段 [NOT] IN (子查询|数值集合)

 select * from 学生信息 
 where convert(varchar,家庭住址)='河南商丘'
  or convert(varchar,家庭住址)='河南洛阳'
 
 select * from 学生信息
 where convert(varchar,家庭住址) in ('河南商丘','河南洛阳') ;
 
 select * from 学生信息
 where convert(varchar,家庭住址) not in ('河南商丘','河南洛阳') ;
 
 select * from 学生信息
 where 学号 in ('2005030101','2005020202') ;
 
 select * from 成绩信息 where 分数<60

select * from 学生信息 where 学号 in (select 学生编号 from 成绩信息 where 分数<60)

 

2.2、比较运算符 [any | some | all]

 

2.3、[NOT] EXISTS

select * from 学生信息 where not exists (select * from 学生信息 where convert(varchar,家庭住址)='珠海白蕉') and 性别='女'

 

2.4、特殊使用 - 常用

-- 某个查询结果,作为另一个查询的表来作用(子查询的结果必须指定一个别名) -- 在子查询中,也可以进行相关复杂的查询,如:多表查询

select 学号,姓名 from (select * from 学生信息) as t

===复习===

一、数据库的设计 -- 重点

第一:收集信息

第二:绘制E-R图

1)标识对象(实体) 2)标识属性(业务关注的数据) 3)标识对象(实体)之间的关系 1 : 1 - 外键放在哪边都行,看需求 1 : M - 外键一般放在多的那边 M : N - 建立一个中间实体(看需求),建立两1对多的关系

第三:转换为数据表

第四:使用三大范式修饰数据表

 

二、数据操作

1、增

2、删

3、改

4、查(复杂-业务)

1)基本查询
2)分组查询

select后面跟的字段必须是分组字段或者使用聚合函数的字段

 group by 字段1,... ,字段n
3)模拟查询 - like

% _ []

4)多表查询

4.1)等值连接、内连接 4.2)外连接 - 左、右、完全 4.3)交叉连接 4.4)自连接

实现多表查询的思路 第一:找到相关的数据表 第二:连接 - 根据主外键 - 选择连接的方式 第三:根据条件筛选数据

 

T-SQL编程

1、GO

它是一个批处理标记,把相同的逻辑语句组成成一个单元来编译执行,目的是为了提高效率。

 GO
 print 'hello'
 print 'world'
 GO

2、变量

内存中的某个存储空间,用于存放数据 一般结合数据类型来指定存储空间存放数据的种类 指定一个有意义的名称,便于访问

2.1)变量分类 - 局部变量

第一:定义变量

数据类型 变量名称 [ = 值]; var 数据类型 变量名称 ;

declare @变量名称 数据类型 [ = 初始值 ]

 

第二:给变量赋值

set 变量名称 = 值 ; select 变量名称 = 值 ; 区别:set只能赋具体的数据,而select可以把查询到的结果赋值给变量

declare @age int 
set @age = 18 
print @age 
GO

declare @age int 
select @age = 18 
print @age 
GO

declare @age int = 20
print @age
GO

-- 定义一个变量,用于存储‘张苗苗’的性别
declare @sex char(2)
select @sex=性别 from 学生信息 where 姓名='张苗苗'
print @sex
GO

select * from 学生信息;

-- 课堂练习:定义变量,用于存储‘张苗苗’的姓名、出生日期、家庭住址,打印输出

-- 定义变量
declare @name varchar(50)
declare @birth date
declare @home varchar(50)

-- 查询数据,把查询结果给变量赋值
select @name=姓名,@birth=出生日期,@home=家庭住址 
from 学生信息 where 学号='2005010102'

-- 打印输出
print '姓名:' + @name
print '出生:' + convert(varchar,@birth)
print '地址:' + @home

2.2)变量分类 - 全局变量

● C#、JS、Java: ○ 方法外定义的变量 ● T-SQL: ○ 系统变量,系统内置的变量,用户不能修改,只能使用读取; ○ 通过此全局变量可以获取相关的信息; ○ 特点:以“@@”开始

print @@version

@@error :用于记录上一条SQL语句的错误代码,从而做一些逻辑处理,比如常用于事务的处理 如果上一条SQL语句没有错误,则@@error返回0

print 'hello,world print @@error GO

最后,在T-SQL中提供了很多的全局变量(略)

3、程序控制

控制程序执行的流程(过程),有以下三种控制:

1、顺序控制语句 - 从上往下,一行一行执行

print 'hello' print 'world'

2、条件控制语句

1)if语句

if (条件) begin

end else begin

end

注意: 使用begin ... end 替换高级语言中的{...} 如果只执行一行代码,则begin ... end可以省略不写

int age = 18 ;
if(age>=18) {
	Console.WriteLine("恭喜,您可以去网吧了!") ;
}
else 
{
	Console.WriteLine("报警!") ;
}
-- 课堂练习:判断张苗苗是否能去网吧
declare @age int = 28 
if (@age >= 18)
	print '恭喜,您可以去网吧!'
else 
begin 
	print '报警'
end
select * from 学生信息;

print getdate() ;

print year(getdate()) ;


-- 方法一
declare @age int
select  @age=year(getdate())-year(出生日期) 
from 学生信息 where 姓名='张苗苗'

if (@age >= 18)
	print '恭喜,您可以去网吧!'
else 
begin 
	print '报警'
end
GO

select * from 学生信息;

-- 方法二
declare @age int
declare @birth date

select  @birth=出生日期 from 学生信息 where 姓名='张苗苗'
set @age = year(getdate()) - year(@birth)

if (@age >= 18)
	print '您的年龄为:' + convert(varchar,@age) + ',恭喜,您可以去网吧!'
else 
begin 
	print '您未成年,报警'
end
GO

 

2)case语句 - switch

语法一:等值case

case 表达式|变量|字段 when 值1 then 结果1 when 值2 then 结果2 ... when 值n then 结果n else 默认其它 end

--注意:case语句必须返回一个结果

-- 判断今天是星期几,不同的星期,我们的早餐有不同的安排
declare @week int = 9
declare @result varchar(50)
set @result =
(
	case @week
		when 1 then '星期一,早餐吃面包'
		when 2 then '星期二,早餐吃面条'
		when 3 then '星期三,早餐吃汉堡'
		when 4 then '星期四,早餐吃小米粥'
		when 5 then '星期五,早餐吃鱼刺'
		when 6 then '星期六,早餐,午餐,晚餐一起吃'
		when 7 then '星期天,早餐吃螺母粉'
		else '你有毛病,哪有星期' + convert(varchar,@week)
	end
)
print @result
-- 课堂练习

-- 使用 等值case 判断张苗苗的性别,如果是男的, -- 则打印输出 张苗苗先生,否则 打印输出张苗苗女士

-- 方法一
declare @sex char(2)
declare @result varchar(50)
select @sex=性别 from 学生信息 where 姓名='张苗苗'
set @result = 
(
	case @sex 
		when '男' then '张苗苗先生'
		when '女' then '张苗苗女士'
		else '小妖精'
	end
)
print @result
GO



-- 方法二
declare @sex char(2)
select @sex=性别 from 学生信息 where 姓名='张苗苗'
print 
(
	case @sex 
		when '男' then '张苗苗先生'
		when '女' then '张苗苗女士'
		else '小妖精'
	end
)
GO

-- 方法三
select 
	case 性别 
		when '男' then '张苗苗先生'
		when '女' then '张苗苗女士'
		else '小妖精'
	end
from 学生信息 where 姓名='张苗苗'

-- 方法四
declare @result varchar(50)
select @result=
	case 性别 
		when '男' then '张苗苗先生'
		when '女' then '张苗苗女士'
		else '小妖精'
	end
from 学生信息 where 姓名='张苗苗'
print @result

GO

 

语法二:条件case
case 
	when 条件1 then 结果1 
	when 条件2 then 结果2
	...
	when 条件3 then 结果n
	else 默认其它
end

-- 注意:条件中对变量、表达式以及字段进行判断

 

declare @fenShu float = 90
print 
case 
	when @fenShu >= 0 and @fenShu<60 then '不合格' 
	when @fenShu >= 60 and @fenShu<70 then '合格'
	when @fenShu >= 70 and @fenShu<80 then '中等'
	when @fenShu >= 80 and @fenShu<90 then '良好'
	when @fenShu >= 90 and @fenShu<=100 then '优秀'
	else '分数非法'
end

课堂练习:参考以上案例,显示成绩信息表中分数的等级

select *,
	case 
		when 分数 >= 0 and 分数<60 then '不合格' 
		when 分数 >= 60 and 分数<70 then '合格'
		when 分数 >= 70 and 分数<80 then '中等'
		when 分数 >= 80 and 分数<90 then '良好'
		when 分数 >= 90 and 分数<=100 then '优秀'
		else '分数非法'
	end as 分数等级
from 成绩信息;

3、循环控制语句

注意: 在实际开发中,数据库一般专职于数据的存储 而相关的业务操作应该交给高级语言来实现(Java、C#)

系统函数

1.数学函数

1、abs(数值):求绝对值

print abs(-5)

--power(n,m):n的m次方
print power(2,3)

2、pi():求圆周率

print pi()

--round(浮点数,保留位数):指定某数据的保留位数(四舍五入)
--保留位数如果为正数,则对设置小数的保留位;
--如果为负数,则对整数进行控制保留位

3、小数部分四舍五入

print round(3.14559,2) ;

--整数部分四舍五入
print round(1265,-2)

4、rand():产生0-1的随机数

while(1=1)
print rand()*10+1

====================================================================

2、字符串函数

1、len(字符串|字段):求字符串的长度

select LEN(学号),* from 学生信息 print len('好好学习') print len('abc')

2、datalength(字符串|字段):返回数据的字节数

print datalength('好好学习') print datalength('abc')

3、left(字符串,n):截取字符串左边的n个字符

print left('好好学习,天天向上',4)

4、right(字符串,n):截取字符串右边的n个字符

print right('好好学习,天天向上',2)

5、substring(字符串,start,len):截取字符串,从start开始截取len个字符(start从1开始)

print substring('好好学习,天天向上',2,5)

6、upper(字符串):转化大写

print upper('abc123Abc')

7、lower(字符串):转化小写

print lower('abc123Abc')

8、space(n):生成n个空格

print 'abc' + space(5) + 'ddd'

9、replicate(字符串,n):复制字符串n次

print replicate('我好帅 ',10)

 

10、stuff('字符串1',start,len,'字符串2'):

--从start开始到len查询字符串1,并把查询到的字符串替换为字符串2 --注意:start从1开始 print stuff('好好学习,天天向上',1,2,'坏坏') print stuff('好好学习,天天向上',2,3,'坏')

--replace(str,oldstr,newstr):在str中,查询oldstr,查找到的oldstr替换为newstr --找不到,将原样输出 print replace('好好学习,好好向上','好好1','坏坏')

11、reverse(字符串):逆序字符串

print reverse('abcde')

12、ltrim(字符串),rtrim(字符串):

去掉字符串左边,右边的空格

print 'abc' + ' 1111' print 'abc' + ltrim(' 1111')

print '1111 ' + 'abc' print rtrim('1111 ') + 'abc'

print 'abc' + ' 1111 ' + 'abc' print 'abc' + rtrim(ltrim(' 1111 ')) + 'abc'

13、charindex('查找的字符','字符串'[,开始位置]):

--查找某个字符在字符串的下标索引位置 --如果查找不到字符串,则返回0

--查找字母l在字符串“hello,word”所在的下标索引 print charindex('l','hello,world')

--从下标索引5开始搜索 print charindex('l','hello,world',5)

print charindex('abc','hello,world')

14、patindex('模式','字符串'):

--返回字符串匹配某个模式的下标索引,找不到返回0 --模式支持:%、_、[]、[^]

print patindex('%123%','hello,123,i love you!')

print patindex('%1[1-5]3%','hello,193,i love you!')

15、str(浮点数,字符串长度,保留位置) : %m.nf

print str(3.14159,10,2)

print str(3.14659,10,2)

--字符串长度小于整数的长度,返'*'

print str(34444.14659,7,2)

print str(34444.14659,4,2)

--str:一般结合round函数使用

print str(round(3.14159,2),4,2)

16、char(整数):转换整数对象的ASCII码对应的字符

print char(35)

====================================================================

3、日期函数

1、getdate():获取当前的系统时间

print getdate()

2、datepart('模式','时间')

--模式有(P72):year,month,day....

print datepart(year,getdate()) print datepart(yy,getdate()) print datepart(yyyy,getdate())

print datepart(month,'2015-01-01')

print datepart(dayofyear,getdate()) print datepart(dd,getdate())

select 姓名, DATEPART(year,getdate()) - DATEPART(YEAR,出生日期) as 年龄 from 学生信息

3、datename('模式','时间')

--注:datename功能与datepart功能一样 --区别:datepart返回的是整数;datename返回的是字符串 print datepart(yy,'2015-01-01') -- 2015 print datename(yy,'2015-01-01') --'2015'

print datepart(yy,'2015-01-01') + '年' print datename(yy,'2015-01-01') + '年'

 

4、dateadd('模式',数值,时间)

--注:如果数值为正数:加法;如果数值为负数:减法 print dateadd(hour,20,getdate())

print datepart(hour,dateadd(hour,20,getdate()))

print dateadd(year,-20,getdate())

print dateadd(hour,20,'2015-05-09 2:05:56.555')

 

5、year(日期),day(日期),month(日期):获取时间的年份,日期,月份

print year(getdate()) print month(getdate()) print day(getdate())

6、datediff('模式','时间1','时间2'):时间2按着某模式减去时间1

print datediff(year,'1997-12-31',getdate())

print datediff(hour,'1997-12-31',getdate())

===================================================================

4、系统相关函数

print db_id() print db_name() print user_id('dbo')

5、其它函数

1、convert(转换的类型[(长度)],数据[,模式]):类型转换函数

select convert(varchar(20), getdate(), 120) select convert(varchar(10), getdate(), 120)

print getdate() print convert(varchar(50),getdate(),120)

print 2 + 'b'

2、row_number() over(order by 字段 [asc|desc]):

返回一个不断递增的整数值 -> 分页查询 --就是给某张表从1-N进行编号

select *,row_number() over(order by 学号) from 学生信息

select top 5 *,row_number() over(order by 性别 desc) as 编号 from 学生信息

--判断某字符串是否是合法的时间,合法返回1,不合法返回0 print isdate(getdate()) print isdate('abc') print isdate('2016-02-29')

3、isnull(表达式1,表达式2):判断表达式1是否为null.如果为null,则返回表达式2的值,否则返回表达式1的值

print isnull('aaa','bbb') print isnull(NULL,'bbb')

4、nullif(表达式1,表达式2):判断表达式1和表达式2是否相等,相等则返回null,否则返回表达式1的值

print nullif('aaa','bbb') print nullif('aaa','aaa')

5、isnumeric(表达式):如果表达式是数值(int,float,real,money),则返回1;否则返回0

print isnumeric('aa')

print isnumeric(3.14) print isnumeric(3)

6、coalesce(表达式1,...,表达式n):返回参数中第一个非NULL值

print coalesce(null,null,null,'aa',null,'bb',null) print coalesce(null,null,null,12,null,null,null) print coalesce(null,null) --参数中至少需要一个非空参数 print coalesce(12,222,22,142,1,152,162)

======================================================

改善数据库性能

-- 一、索引

-- 1.作用:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能。

-- 2.语法

/* create unique index <索引名> on <表名|视图> (<列名 [asc | desc]> [, ⋯ n ]) with fillfactor=0-100 */ select * from 学生信息

GO

-- 在学生信表中,针对姓名这个字段创建了一个非聚集索引

-- 第一:定义索引

create nonclustered index idx学生信息姓名 on 学生信息 (姓名) GO

-- 第二:使用索引

-- 1.隐式调用 - 注意,如果select 后面使用 ,则索引会失效 因此,在开发中,不能使用

select 学号,姓名,性别,出生日期,民族,所属班级,家庭住址 from 学生信息 where 姓名='张苗苗'

-- 2.显式调用

select 学号,姓名,性别,出生日期,民族,所属班级,家庭住址 from 学生信息 with (index=idx学生信息姓名)

-- 查看表中的索引信息 -- exec sp_helpindex 表名 exec sp_helpindex 学生信息

-- 3.删除索引

-- drop index 索引名 on 表名 drop index idx学生信息姓名 on 学生信息

select * from 学生信息

 

-- 二、视图

-- 1.定义:是一张虚拟的数据表

-- 2.优点

/* ● 集中用户使用的数据 ● 掩盖数据库的复杂性 ● 简化用户权限的管理 ● 重新组织数据 ● 不占物理存储空间,它只是一个逻辑对象 */

select * from 学生信息

-- 3、创建视图的步骤

/*

  1. 编写select语句

  2. 测试select语句

  3. 查询结果的正确性

  4. 创建视图

-- 第一:根据需求,编写查询语句

select * from 学生信息 where 出生日期 like '1985%'

-- 第二:创建视图,关联查询的结果

GO
create view view_1985
as
	select * from 学生信息 where 出生日期 like '1985%'
GO	

-- 第三:使用视图

-- 视图本质上是一张数据表,因此也可以做增、删、改、查的操作 -- 但是,一般只用于做查询操作, -- 由于视图并不是一张完整数据表,因此在做增、删、改操作时有可能会发生异常 -- 增、删、改操作还是回到对应的“基表”去操作

select * from view_1985 where 姓名='张苗苗';

*/

-- 语法 -- 每一个视图都对应一个或多个基表的查询 /* create view 视图名称 [WITH SCHEMABINDING] [WITH ENCRYPTION] as select语句 [WITH CHECK OPTION] */

-- 创建视图,用于显示学生信息的学号,姓名,性别 -- 1. 编写select语句 -- 2. 测试select语句 -- 3. 查询结果的正确性 select 学号,姓名,性别 from 学生信息

-- 4. 创建视图

GO create view view_student as select 学号,姓名,性别 from 学生信息 GO

select * from 学生信息

-- 视图的使用和数据表的使用是一样的,也可以进行增、删、改、查的操作 -- 但是,一般我们使用视图做查询操作,不建议做增、删、改操作

select * from 表名 | 视图 select * from view_student

-- 5.视图其它操作

---- 1、修改视图:

alter view 名称 as select 语句 GO alter view view_student as select 学号,姓名,性别,出生日期 from 学生信息 GO

select * from view_student

-- 2、删除视图

drop view 视图名称 ; drop view view_student ;

-- 3、查看视图信息

sp_help 视图名称

sp_help view_student

--4、 查看视图文本

sp_helptext 视图名称

sp_helptext view_student

 

-- 三、事务

-- 创建bank表(帐户)
create table bank
(
    customerName char(10) ,	-- 顾客姓名
    currentMoney money			-- 当前余额
)

-- 添加索引,当前余额至少1块
GO
alter table bank
   add constraint ck_currentMoney    
       check(currentMoney>=1)
GO

-- 添加两个用户
insert into bank(customerName,currentMoney)	values('张三',1000)
insert into bank(customerName,currentMoney)	values('李四',1)

select * from bank;

-- 实现转帐业务 - SQL语句怎么实现? - update
-- 转帐业务必须需要做两个操作,一个是转入,一个是转出

-- 转入
update bank set
	currentMoney = currentMoney + 1000
where customerName = '李四'

-- 转出
update bank set
	currentMoney = currentMoney - 1000
where customerName = '张三'

select * from bank ;

-- 1.概念

-- 事务: -- 事务就是用户要做的某个业务或某件事(转帐) -- 每一个事务一般都包含有多个操作(至少两个) - 转入、转出 -- 事务会把这些操作作为一个逻辑单执行,要么都执行、要么都不执行 -- 也就是说,事务背后的所有操作都成功执行,才成功完成这个事务 -- 只有一个操作失败,则整个事务都失败,而成功的操作怎么办呢?- 回滚

-- 2.如何实现事务操作

-- 开始事务:begin transaction -- 提交事务:commit transaction -- 回滚事务:rollback transaction -- 另外,结合全局变量@error判断操作是否失败

-- 开始事务(开始做转帐业务) begin transaction

-- 定义变量,用于接收操作是否失败(错误) declare @n int = 0

-- 转帐业务的第一个操作:转入 update bank set currentMoney = currentMoney + 100 where customerName='李四'

-- 记录上一个SQL语句是否发生错误 set @n = @n + @@ERROR

-- 转帐业务的第二个操作:转出 update bank set currentMoney = currentMoney - 100 where customerName='张三' -- 记录上一个SQL语句是否发生错误 set @n = @n + @@ERROR

-- 判断事务背后的操作是否都成功执行 if (@n=0) begin commit transaction end else begin rollback transaction end

select * from bank;

-- 思考,每次实现转帐业务都要执行以上那一坨代码,有没有办法优化一下呢? -- 存储过程

-- 3.事务的特性(ACID)

-- 原子性 -- 一致性 -- 隔离性 -- 持久性


3.存储过程

-- 一、概念

-- 存储过程:类似于函数,用于封装复杂的业务规则,如:转帐 -- 而函数一般用于封装实现某一个功能

-- 相同点:都有参数、返回值、一次定义,多次使用

-- 二、分类

-- 1、系统存储过程

-- 系统存储过程的名称都以“sp”开头或”xp”开头 -- 执行存储过程,通过 exec 命令执行

--创建数据库 create database test ;

--修改数据库名 exec sp_renamedb 'ok','test'

-- 查询当前数据库的相关表信息 exec sp_tables

-- 2、自定义存储过程(重点)

-- 说明:在以前,程序员通过编写存储过程来实现项目的相关业务 -- 但是,现在不建议这么做,因为考虑到程序的维护性以及扩展性 -- 而数据库只专注于数据的存储

--第一:创建存储过程

/*

create proc[edure] 存储过程名[等同于函数名] 输入参数 , [等同于参数] 输出参数 output [等同于返回值] as 存储过程的功能/业务实现[等同于函数体] go

 

输入参数(参数),语法如下: @参数名 数据类型 [=默认值]

输出参数(返回值),且使用output声明 @参数名 数据类型 output */

-- 第二:调用存储过程

/* 方式一:直接传值

[exec] 存储过程名 值1,值2...,[@变量 output]
注:不能缺少exec关键字(有返回值)

 

方式二:使用具体参数来指定

[exec] 存储过程名 @参数名=值1,@参数名=值2...,[@参数名=@变量 output]
顺序可以不一一对应

方式三:混合

*/

-- 课堂案例:定义存储过程,实现计算两个数的和,并返回 -- 第一:定义存储过程 GO create proc getHe @n1 int , @n2 int, @jieGuo int output as set @jieGuo = @n1 + @n2 go -- 第二:调用存储过程 -- 调用的方式一:直接传值 declare @jg int exec getHe 100,200,@jg output print @jg

-- 调用的方式二:使用具体参数来指定 GO declare @jg int exec getHe @n1=1,@n2=2,@jieGuo=@jg output print @jg

-- 参数顺序无所谓(不建议) declare @jg int exec getHe @jieGuo=@jg output,@n2=2,@n1=1 print @jg

-- 调用的方式三:混合使用(不建议) GO declare @jg int exec getHe 1,2,@jieGuo=@jg output print @jg

-- 4.存储过程 VS 函数

-- 1)语法不同

create function 函数名称 (形参名称 as 数据类型,...) returns 返回值数据类型 begin <函数内容> return 表达式 end

-- 2)职责

● 函数一般用于实现某一个功能;(getdate()、power(2,3)) -- 不能被高级语言调用 ● 存储过程用来执行管理任务或应用复杂的业务规则(转帐) -- 高被高级语言调用 - JDBC

-- 3)返回值

● 函数必须有返回值 ● 存储过程可以无返回值,也可以有返回值,且可以返回多个数据

-- 4)T-SQL语句的支持

● 函数不支持print... ● 存储过程支持

-- 5)调用时,函数支持查询;而存储过程不支持查询 ● select sum(分数) from 表 ● exec 存储过程名 参数列表

-- 4、存储过程的维护操作

-- 1)删除存储过程

drop procedure 存储过程名称

drop proc getPeopleBySex

-- 2) 修改存储过程

alter proc[edure] 存储过程名[等同于函数名] 输入参数 ,[等同于参数] 输出参数 output [等同于返回值] as 存储过程的功能/业务实现[等同于函数体] go

-- 3)查询

sp_helptext 存储过程名称

sp_helptext addPeople

-- 4)修改

sp_rename '老的名称','新的名称'

sp_rename 'addPeople','insertPeople'

-- 5、触发器

/*

一、概念

触发器是一个特殊的存储过程,但是用户不能手动调用 - 地雷

触发点:
	DML触发器:当用户对某张表进行增、删、改操作时,触发器才会被调用   
	DDL触发器:同时,当用户对某张表或某个数据库进行定义时,也可以调用触发器  
地雷(触发器)埋在某张表中,触发的行为是:增、删、改

作用:触发器通常用于“强制”业务规则

二、分类

DDL - 数据定义语言,如建表,建库等操作 DML - 数据操作语言,如数据表的增、删、改等操作

三、语法

create trigger 触发器名 on { table | view } [WITH ENCRYPTION] {for | after | instead of} {[insert] [,] [update] [,] [delete]} as 触发器强制业务规则的实现 - 变量、程序控制语句、CRUD、事务

-- 触发器的命名规范:tri表名操作

*/

create table people ( username char(20) not null , [password] char(6) not null, sex char(2) check(sex='男' or sex='女'), age int , [weigth] float )

insert into people values ('张三','123456','男',19,234)

GO create trigger tri_people_insert on people for insert as print '添加数据' GO

select * from people;

-- instedad of : 替换

-- 当用户对某张进行进行增、删、改操作时,并不会真正的执行相应的操作 -- 而是被替换为触发器业务实现 GO create trigger tri_people_delete on people instead of delete as print '傻瓜,忽悠你的!' delete from people where username='张三'

-- 删除触发器

drop trigger tri_people_insert drop trigger tri_people_delete

GO create trigger tri_people_insert_delete_update on people after insert,delete,update as print '数据更新成功'

select * from people;

insert into people values ('李四','123456','男',23,111) update people set password='666666' where username='李四'

delete from people where username='张三'

 

/*

四、触发器两张特殊的数据表

当触发器被触发时,系统会在内存中创建两张临时表,分别叫inserted和deleted 当触发器执行完毕后,两张临时表就会被释放 注意:这两张表的结构与触发器绑定的表结构一致

inserted:存储当前添加的数据,同时存储修改之后的数据 deleted:存储当前删除的数据,同时存储修改之前的数据 -- 在触发器中,为什么需要这两张临时表呢? -- 目的是为了更好的实现强制业务规则(获取源数据)

*/
drop table people
create table people
(
	username char(20) not null ,
	[password] char(6) not null,
	sex char(2) ,
	age int ,
	[weigth] float
)

-- 定义触发器,实现对性别进行一些强制约束
GO
create trigger tri_people_check_sex
on people
for insert
as
	-- 结合事务操作
	begin transaction
	declare @sex char(2)
	-- 通过inserted表获取当前添加的数据 -- 注意:临时表只能在触发器中使用
	select @sex=sex from inserted
	-- 判断合法性
	if(@sex='男' or @sex='女' or @sex='妖') 
		commit transaction
	else
		rollback transaction

select * from people

insert into people values ('李四','123456','妖',23,111)

-- 课堂练习: -- 定义触发器,实现在添加数据时,如果年龄大于18岁,则体重必须大于60

GO
create trigger tri_people_check_age_weight
on people
for insert 
as
	-- 开启事务
	begin transaction
	declare @age int
	declare @weight float
	

-- 获取当前添加数据中的年龄和体重  -- 通过临时表 - inserted
select @age=age,@weight=[weigth] from inserted

-- 逻辑判断
if(@age>=18 and @weight>=60) 
	commit transaction
else if (@age<18)
	commit transaction
else 
	rollback transaction

select * from people;
insert into people values ('李四','123456','妖',20,30)

-- 定义触发器,实现在修改数据时,必须保证修改的体重差不能超过10
GO
create trigger tri_people_update
on people
for update
as
	-- 开启事务
	begin transaction
	

declare @beforeWeight int
declare @afterWeight int
declare @WeightCha int

-- 获取修改前的体重
select @beforeWeight=weigth from deleted

-- 获取修改后的体重 
select @afterWeight=weigth from inserted

-- 计算体重差,并判断
set @WeightCha = abs(@beforeWeight-@afterWeight)

if @WeightCha >=0 and @WeightCha<=10 
	commit transaction
else 
	rollback transaction

​		
select * from people 

update people set
	weigth = weigth + 5
where username='李四'
/*

项目实现

一、三个权限相关概念(项目实现)

1、用户

操作数据库的人,用户分为:登录用户和数据库用户

2、权限

控制用户能做什么? 数据定义语句权限; 对象操作权限; 列(字段)权限

3、角色

权限的集合 - 便于对权限进行管理

操作步骤

第一:创建用户(白白净净),什么都干不了 - 如何让用户能做一些事情呢? - 赋权

第二:授予用户相关的权限 或 角色

分类: 服务器角色 数据库角色 自定义角色

二、架构(Schema)

是一个容器,存放数据库相关的对象(数据库、数据表、视图、函数、存储过程、触发器等)

好处是:可以将数据库对象与数据库用户分离。所有的数据库对象隶属于某架构。

默认架构:dbo

三、操作

1、创建登录用户

sp_addlogin '用户名','密码','默认数据库'

课堂案例:创建登录用户zs,登录成功后,默认进入 test 数据库 sp_addlogin 'zs','123456','test'

 

2、授予数据库访问权限

第一:登录具体权限的用户,如sa

 

第二:进入数据库

use 数据库名

第三:授权

exec sp_grantdbaccess '服务器登录名'[,数据库用户名] use test exec sp_grantdbaccess 'zs'

3、取消用户访问数据库权限

use 数据库名 exec sp_revokedbaccess '服务器登录名'[,数据库用户名]

exec sp_revokedbaccess zs

4、更改默认数据库

exec sp_defaultdb '用户名','默认数据库'

exec sp_defaultdb 'zs','mul'

5、授予对象权限

grant <权限> on <对象> to <用户名或角色名> [with grant option]

其中, [with grant option]:为用户授予了将其获取的对象权限权限转授给其他人的能力。 权限有:all、select、insert、delete、references、update或者execute中的一个或多个,如果多个权限需要用逗号隔开,其中all代表所有的权限

grant select on bank to zs grant delete,insert on bank to zs

6、收回和拒绝对象权限

收回:revoke <权限> on <对象> to <用户名或角色> [cascade]

拒绝:deny <权限> on <对象> to <用户名或角色> [cascade]

revoke insert on bank to zs deny delete on bank to zs

 

7、角色管理

1)可以使用系统存储过程sp_addsrvrolemember来将登录用户加入服务器角色

exec sp_addsrvrolemember [@loginname=]'登录名',[@rolename=]'角色名'

sp_addlogin 'ls','123456','test'

exec sp_addsrvrolemember 'ls','sysadmin'

 

2)可以使用系统存储过程 sp_dropsrvrolemember 来将登录用户从服务器角色中删除

exec sp_dropsrvrolemember [@loginname=]'登录名',[@rolename=]'角色名'

exec sp_dropsrvrolemember 'ls','sysadmin'

 

3)创建数据库标准角色。

sp_addrole 角色名 [,角色所有者] 注意:默认情况下,创建的角色为dbo用户所拥有,但也可以通过第二个参数为角色指定所有者。

-- 创建班长角色 exec sp_addrole '班长'

 

4)分配权限到角色

grant insert,delete on bank to 班长

5)创建几个帐号

sp_addlogin 'ww','123456','mul' sp_addlogin 'zl','123456','mul'

exec sp_grantdbaccess 'ww' exec sp_grantdbaccess 'zl'

exec sp_addsrvrolemember 'ww','班长'

6)为某角色添加用户

sp_addrolemember 角色名,用户名

sp_addrolemember '班长','zl' sp_addrolemember '班长','ww'

 

*/

 

 

--


GIT

--------------------------------

做项目要用到的

layui 实现后台页面

bootstrap 实现前端页面

vant 实现移动端页面

vue 实现数据展示

javascript + css

jquery(ajax)实现前端与后端交互-异步请求(JSON字符串)

java Servlet 后端实现

前后端分离

ES基础语法 Vue Vant

五张表左右 + 几个业务 + 使用以上的技术

pull先拉看看有没有冲突 push推

 

打开码云账号 —— 创建仓库 —— 在idea创建同名项目(忽略文件——勾选第一个、windows、jetBrains、)—— 创建README.md —— 初始化(暂存、提交 —— Manage Remotes(添加远程地址) —— 创建分支(Git —— branch —— main —— New。。。) / 打开码云 —— 创建分支(全部设置为保护分支) —— 管理 —— 保护分支设置

组员克隆 —— (注意右下角的分支)

我的账号 ——

==========GitFlow工作流======

一、新建仓库(√ 初始化仓库) + 号 —— 新建仓库 —— 管理 —— 仓库成员管理 —— 开发者 —— 添加仓库成员 —— 邀请用户

二、创建本地仓库 $ git init work04

$ cd work04

$ echo GitFlow工作流的使用 > README.md

$ git status

$ git add . $ git commit -m '第一次提交'

$ git log

$ git remote add origin 远程仓库地址

$ git remote -v

$ git push -u origin master

三、创建分支 打开远程仓库 —— 分支 —— 新建分支(dev) —— 状态 —— 保护所有分支 —— 默认分支(dev)

四、各成员克隆远程仓库项目

$ cd ..

$ git clone 远程仓库地址()

$ cd work04

$ git log

$ git branch

五、各成员在各自本地仓库中,实现相关的操作 $ git checkout -b feature-login

$ ls

$ git log

$ echo 登录页面 > login.html

$ git status

$ git commit -m '完成登录页面的操作'

$ git log

$ git push -set-upstream origin feature-login

六、(账号)成员仓库

切换分支(feature-login)—— +Pull Request —— (编辑) 创建pull Request

七、(账号)我的仓库 Pull Request —— 审查通过 —— 测试通过 —— 接受Pull Request

八、

$ git switch dev

$ git log

$ git pull

$ git log

$ git checkout -b release-1.0.0

$ git log

$ ls

$ echo 登录功能的实现 > Login.java

$ git status

$ git add .

$ git commit -m '登录功能的实现'

$ git push --set-upstream origin release-1.0.0

$ git log

九、合并分支 (账号)成员仓库 —— +Pull Request —— (源分支) 点击要合并的分支 —— (目标分支)master —— (账号)我的仓库 —— Pull Request —— 审查通过 —— 测试通过 —— 合并分支 —— 接受Pull Request

十、打标签 我的仓库 $ git log

$ git pull

$ git log

$ git tag

 

 

 

 

 

 

 

-----------11.20 作业---------- $ git init lx

创建添加$ touuch {1..3}.txt 暂存 提交

重命名分支(main)

 

1、$ touch 1.html 2.html 3.html

2、$ echo ‘这是首页’ > 1.html

3、$ echo ‘这是后台页面’ > 2.html

$ git add .

$ git commit -m 'm1'

$ git log

创建 4、$ git branch feature_login

切换feature_login
$ git switch feature_login

创建添加
$ echo '这是登录界面' > login.html

5、$ echo '这是登录功能的实现' > login.java

暂存
$ git add .

提交
$ git commit -m 'f1'

日志
$ git log

查看
$ git branch

6、切换master $ git switch master

合并
$ git merge feature_login

日志
$ git log

编辑
$ vim 3.html

暂存
$ git add 3.html

提交
$ git commit -m 'mf'

日志
$ git log

7、$ vim login.java

============================================== 创建添加 暂存 提交 日志 查看 创建分支 切换testing 创建添加 暂存 提交 日志 查看 切换main 合并 日志 创建添加 暂存 提交 日志 切换 创建添加 编辑 状态 暂存 提交 日志 切换 查看cat 编辑 状态 暂存 状态 提交 日志

 

-------Git---- 红色 并没有放在暂存区,没有提交 绿色 已经放在暂存区,已经提交成功

 

 

1、创建一个指定名称的版本库 $ git init cms

$ ls 查看

$ cd cms

2、配置帐号和邮箱

$ git config --local user.name lss

$ git config --local user.email lss@qq.com

$ git config --local --list 查看

删除 $ git config --local --unset user.email

3、创建文件的同时,输入相关的内容

: 覆盖内容 $ echo 111 > 1.txt

$ echo 222 > 2.txt

$ echo 333 > 3.txt

4、查看文本文件内容 $ cat 1.txt 2.txt 3.txt

5、查看状态 $ git status

6、暂存文件,把修改的文件添加到暂存区中 多个文件添加 $ git add .

7、查看状态 $ git status

8、提交更新,把暂存区中的的文件信息形成一个快照永久性存储到 Git 仓库目录 $ git commit -m '添加三个文件,初始化项目'

9、查看日志 $ git log

10、 修改,追加内容

$ echo 好好学习,天天向上 >> 3.txt 或者 $ vim 3.txt

11、 $ git diff 或者

$ git diff HEAD

12、 $ git add .

$ git diff --cached

13、删除文件 $ rm 3.txt $ git add .

$ git rm 3.txt

14、检出文件 $ git checkout HEAD 3.txt

15、在git中,删除文件 $ git rm 3.txt

16、修改,追加

$ echo 天天向上 >> 2.txt

17、查看状态,删除 $ git status

$ rm 2.txt

18、 $ mv 2.txt 好好学习,天天向上.txt

$ git add 好好学习,天天向上.txt

$ git commit -m '在下一个版本中,文件名称已经修改'

或者 $ git mv 2.txt 好好学习,天天向上.txt $ git commit -m '在下一个版本中,文件名称已经 修改'

或者 $ mv 2.txt 好好学习,天天向上.txt

$ git commit -a -m '在下一个版本中,文件名称已经修改'

19、 $ git reset --hard HEAD^

$ git log 查看

20、 $ git reflog

$ git reset --hard 版本号

---------------作业步骤---------- 1、导入网上插件 https://v3.bootcss.com/ -- 入门 -- 基本模板

jquery-1.12.4.js 文件

2、html 导航条

栅格系统(网页头) 1)图片 2)输入框

轮播图片

 

 

 

 

================================= idea打不开,双击没反应的解决方案 找到脚本 jetbra-1126574a2f82debceb72e7f948eb7d4f616ffddf文件 —— jetbra文件——scripts文件——install-current-user.vbs

------------作业步骤----------- 1、product_list.html product_list.css product_list.js

2、创建数据库

3、实体类(entity) 1)字段 2)属性

3、Dao接口-增删改查 Dao接口实现类 --增删改 步骤: // 第一:定义要操作数据库的SQL语句 // 第二:获取连接对象 // 第三:预编译SQL语句,实例化语句对象 // 第四:填充数据 // 第五:执行SQL语句,并接收执行的结果 // 第六:对象结果进行处理 // 第七:关闭相关的对象

4、ResponseData ·字段: 1)响应代码(如:200、500、或其它根据业务自定义代码

2)响应信息 3)响应的数据

·属性

·方法: 1)无参构造方法 2)带参构造方法

5、BaseServlet 1)成功响应的封装 - 默认 2)重载方法 - 封装所有的成功响应信息 3)错误响应的封装 - 默认 4)重载方法 - 封装所有的错误响应信息 5)响应客户端 - 打印输出 JSON 字符串

6、Servlet // 第一:获取客户端发送的数据(合法性的验证) // 第二:加工处理(业务处理) - 如果业务复杂,则抽象业务对象来处理 // 第三:把数据转为 JSON 字符串 // 第四:打印输出 - 响应客户端


------登录—注册作业步骤------- 1、前端页面(登录、登录错误、注册、注册成功) ·login.html ·error.jsp ·register.html ·reg_suc.jsp 2、工具包(util) ·DBUtil 3、实体对象(entity) ·UserInfo 4、数据访问对象(dao) ·UserInfoDao 5、数据访问对象实现类 ·UserInfoDaoImpl 6、业务(service)(可省) 7、业务实现类(可省) 8、封装服务器响应的数据 - API 接口 - 礼盒 ·ResponseData 9、所有 Servlet 的父类 - 封装公共方法 BaseServlet 10、异步请求实现检查用户是否已经被注册-->注册成功 ·AjaxCheckUserServlet 11、Servlet包 ·LoginServlet ·RegisterServlet

 

 

 


1、创建数据库 2、创建前端登录页面 3、工具包(util) 4、实体对象(entity) 5、数据访问对象(dao) 6、数据访问对象实现类(每做完一项就要测试) 7、业务(service) 8、业务实现类 9、Servlet包

 

=============================== 一、安装 二、创建 JavaWeb项目 1、新建项目 File菜单——New——Project

2、添加WEB支持 设置——Project Structure(项目结构) —— Modules(模块)—— 选中项目 —— + —— web

3、配置Tomcat Web服务器 1)添加Tomcat: Select Run/Debug Configurations —— Tomcat Server —— Local —— Server —— Configurations —— Tomcat Home

2)添加 Tomcat 依赖 设置——Project Structure(项目结构) —— Modules(模块)—— 选中项目 —— Dependencies —— + ——Choose Libraries —— 选中Tomcat

4、编写代码

1)web:编写前端代码

2)src : 编写后端Java代码 编写 Util、Servlet程序

5、添加第三方的 jar 文件 1)web —— WEB INF —— 创建lib目录 —— 粘贴jar文件

2)设置——Project Structure(项目结构) —— Modules(模块)—— 选中项目 —— Dependencies —— + —— JARs or Directories ——选中jar文件

3)设置——Project Structure(项目结构)—— Artifacts —— + —— Web Application:Exploded ——From Modules(创建Artifact)——选中项目——Output Layout —— lib —— 如果Tomcat中没有jar文件,双击或右击,把jar文件发布到Tomcat中

6、把 Artifact 部署到 Tomcat中 Select Run/Debug Configurations —— Edit Configurations —— Deployment —— + —— Artifact 注意:部署成功后,一般需要修改项目的上下文路径

三、IDEA的设置 1、显示工具条 View —— Toolbar

2、解决Tomcat日志乱码 三个方法 1)寻找Tomcat所在的位置,在Tomcat目录下找到conf logging.properties —— 检查确保都是UTF-8编码

2)IDEA中JVM的虚拟机的编码方式设置为UTF-8 Help —— Edit Custom VM Options —— 添加 -Dfile.encoding=UTF-8

3)Tomcat配置 Select Run/Debug Configurations —— 选中Tomcat——Server—— VM options——添加-Dfile.encoding=UTF-8

3、过滤文件 设置—— Settings —— Editor —— File Types—— ignored Files and Folders —— + —— 添加 *.iml

 

 

 

错误:

1、idea打不开,双击没反应的解决方案

idea打不开,双击没反应的解决方案
找到脚本
jetbra-1126574a2f82debceb72e7f948eb7d4f616ffddf文件 —— jetbra文件——scripts文件——install-current-user.vbs

2、java: 错误: 不支持发行版本 19

设置—— Settings ——Build, Execution, Deployment——Java Compiler

 

步骤:

一、安装

二、创建 JavaWeb项目

1、新建项目

File菜单——New——Project

2、添加WEB支持

设置——Project Structure(项目结构) —— Modules(模块)—— 选中项目 —— + —— web

3、配置Tomcat Web服务器

1)添加Tomcat: Select Run/Debug Configurations —— Tomcat Server —— Local —— Server —— Configurations —— Tomcat Home

2)添加 Tomcat 依赖 设置——Project Structure(项目结构) —— Modules(模块)—— 选中项目 —— Dependencies —— + ——Choose Libraries —— 选中Tomcat

4、编写代码

1)web:编写前端代码

2)src : 编写后端Java代码 编写 Util、Servlet程序

5、添加第三方的 jar 文件

1)web —— WEB INF —— 创建lib目录 —— 粘贴jar文件

2)设置——Project Structure(项目结构) —— Modules(模块)—— 选中项目 —— Dependencies —— + —— JARs or Directories ——选中jar文件

3)设置——Project Structure(项目结构)—— Artifacts —— + —— Web Application:Exploded ——From Modules(创建Artifact)——选中项目——Output Layout —— lib —— 如果Tomcat中没有jar文件,双击或右击,把jar文件发布到Tomcat中

6、把 Artifact 部署到 Tomcat中

Select Run/Debug Configurations —— Edit Configurations —— Deployment —— + —— Artifact 注意:部署成功后,一般需要修改项目的上下文路径

三、IDEA的设置

1、显示工具条

View —— Toolbar

2、解决Tomcat日志乱码

三个方法 1)寻找Tomcat所在的位置,在Tomcat目录下找到conf logging.properties —— 检查确保都是UTF-8编码

2)IDEA中JVM的虚拟机的编码方式设置为UTF-8 Help —— Edit Custom VM Options —— 添加 -Dfile.encoding=UTF-8

3)Tomcat配置 Select Run/Debug Configurations —— 选中Tomcat——Server—— VM options——添加-Dfile.encoding=UTF-8

3、过滤文件 设置—— Settings —— Editor —— File Types—— ignored Files and Folders —— + —— 添加 *.iml

前端开发三大基础知识

1、HTML:结构化页面 + 添加相关的网页内容(文字、图片、表格、表单)

语法一:双标记

<开始标记 属性1="值" ... 属性N="值"> ​ 内容 ​ </结束标记>

<font size="7" color="red" align="center">
    好好学习,天天向上
</font>

语法二:单标记

<开始标记 属性1="值" ... 属性N="值"/>

 


..

说明: 1)标记也叫标签 2)不同的标记都会有默认的样式 3)不同的标记都会有相应的属性,用于丰富标记的样式 4)编写网页,就是定义各个标记,并保存为一个以html为后缀的文件 5)各个标记存在以下几个关系 兄弟关系(并列关系) 父子关系(嵌套关系) 6)最后,学习并熟悉各个标记以及其属性

2、CSS :修饰网页内容,让网页更加漂亮、专业、人性化、增强可操作性

在CSS中,提供了非常丰富的属性,便于开发者修改网页内容 ​ 每个属性可以理解某种颜色。

语法: 选择器 { 属性1:属性值 ; ... 属性N:属性值 ; }

注意:在CSS中,同时也提供了非常丰富的选择器,便于选中页面的内容

使用方式

1)内联式

作用范围:作用于当前的标记 ​ 优势:优先级最高 ​ !important -> 提高优先级

<开始标记 style="属性1:值;...;属性N:值"> ​ 内容 ​ </结束标记>

2)嵌入式

作用范围:作用于当前的网页

<style>
    选择器 {
        属性1:属性值 ;
        ...
        属性N:属性值 ;
    }
</style>

3)外部式

作用范围:作用于当前整个网站(一个网站下包含多个网页) ​ 一次定义,多处的使用 ​ 实现css和html的分离,提高代码的维护性

操作步骤:

第一:创建一个以css为后缀的文件
第二:在css文件中,定义相关的样式

选择器 { ​ 属性1:属性值 ; ​ ... ​ 属性N:属性值 ; ​ }

第三:在页面中引入css文件

<link href="路径/xxx.css" type="text/css" rel="stylesheet"/>

路径:相对路径(常用)、绝对路径

 

导入式

作用:合并多个样式(样式文件)

最后,学习并熟悉各个CSS属性

 

3、JavaScript

实现页面的动态效果,增强人机的交互性,让用户的体验更加的好 实现表单数据合法性的验证

最后,学习并熟悉具体的JS语法

用法

1)内联式
2)嵌入式
<script>
    // js代码,只作用于当前页面
</script>
3)外部式

作用范围:作用于整个网站 ​ 好处:实现js和html的分离,提高代码的维护性

第一:创建一个以js为后缀的文件

 

第二:编写js代码

根据需求编写代码

第三:在页面中,引入js文件
    <script src="路径/xxx.js" type="text/javascript"></script>

注意:在引入js的script标签中,不要编写js代码

4、在三剑客中,一般我们的开发步骤为

第一:使用HTML结构化页面

第二:使用CSS美化页面

第三:使用JS实现页面的动态效果

5、DOM操作

1)DOM(Document Object Model) - 文档对象模式 - 操作文档的相关对象集合

程序使用 DOM 可以对网页中的内容进行操作(增、删、改、查)

在DOM中,HTML页面中所有的内容都称之为节点,主要有以下几种: 元素节点(1):font 属性节点(2):color、size 文本节点(3):好好学习

好好学习

 

2)操作步骤

第一:选择要操作的节点(内容)

document.getElementById(): ​ 根据ID属性获取页面中唯一的节点

document.getElementsByName(): ​ 根据 name 属性获取页面中的节点集合(数组)

document.getElementsByTagName(): ​ 根据标签名称获取页面中的节点集合(数组)

document.getElementsByClassName(): ​ 根据 class 属性获取页面中的节点集合(数组)

注意:节点与节点之间存在以下关系 ​ 父子关系(嵌套关系) ​ 兄弟关系(并列关系)

有时候,我们选择节点时, ​ 需要通过这些关系来间接的选择某些节点

通过关系获取节点的API有以下几个:

1)父节点

parentNode:获取当前节点的父节点(唯一) ​ parentElement:获取当前节点的父元素节点(唯一)

2)子节点

childNodes:获取当前节点的子节点(0个或多个)

firstChild:获取当前节点的第一个子节点 ​ lastChild:获取当前节点的最后一个子节点

firstElementChild:获取当前节点的第一个元素子节点 ​ lastElementChild:获取当前节点的最后一个元素子节点

大坑:在HTML代码中,回车换行也是一个文本节点

3)兄弟节点

previousSibling:获取当前节点的上一个节点(哥哥) ​ nextSibling:获取当前节点的下一个节点(弟弟)

previousElementSibling:获取当前节点的上一个元素节点(哥哥) ​ nextElementSibling:获取当前节点的下一个元素节点(弟弟)

 

4)属性节点

attributes:获取当前节点的属性节点集合

 

第二:使用节点相关的属性和方法进行相关的操作

注:节点是一个对象

3)DOM操作的相关方法 -- 实现页面内容的“动态”更新 - ajax

元素节点对象.setAttribute("属性名称","属性值"): ​ 给某个元素节点,动态的添加属性和属性值

元素节点对象.removeAttribute("属性名称"): 移除某个元素节点的指定属性

var 变量 = 元素节点对象.getAttribute("属性名称"): 获取某个元素节点的指定属性的属性值

document.createElement("标签名称"):创建元素节点

document.createTextNode("文本内容"):创建文本节点

元素节点对象.createAttribute("属性名称"):创建属性节点

父元素节点对象.appendChild(节点对象):添加子节点(父子) 父元素节点对象.insertBefore(新节点,目标节点):添加新节点在目标节点之前(兄弟)

var 克隆的节点对象 = 元素节点对象.cloneNode(bool):克隆节点(复制节点)

removeChild(childName):移除节点 replaceChild(newChild,oldChild):替换节点,把 oldChild替换为newChild

 

最后,自学一下emmet语法:提高 编写 HTML 和 CSS 效率。 https://docs.emmet.io/abbreviations/syntax/ https://www.jianshu.com/p/5416e3315f6e


JQuery

一、概述

JQ是对原生 JavaScript 代码封装的JavaScript库 ;

特点:快速、小巧、功能丰富 ;

口号:写更少的代码,做得更多的功能 ;

归根到底,JQ 还是 JavaScript!

二、使用

1、下载

官网:http://jquery.com

● 未压缩:jquery-1.12.4.js,容量大,加载速度相对比较慢,一般用于学习或需要查看源码 ● 压缩:jquery-1.12.4.min.js ,容量小,加载速度快,一般应用在生产环境下

2、各版本的JQ

● 1.x版本:兼容ie678,使用最为广泛的,官方只做bug维护,功能不再新增。因此一般项目来说,使用1.x版本就可以了,最终版本:1.12.4 ● 2.x版本:不兼容ie678,很少人使用,官方只做bug维护,功能不再新增。如果不考虑兼容版本低的浏览器可以使用2.x,最终版本:2.2.4 ● 3.x版本:不兼容ie678,只支持最新的浏览器。除非特殊要求,一般不会使用3.x版本的,很多老的jQuery插件不支持这个版本。目前该版本是官方主要更新维护的版本。目前最新版本:3.5.1

3、操作步骤

第一:在 HTML 页面中,引入 js 文件

第二:使用 JQ

说明: JQ是对原生 JavaScript 代码的封装 ; 它提供非常丰富的API给程序员使用,使编写代码时更加的简单、高效 ;

注意: 后面我们要学习的是 JQ 提供的各种 API(对象及相关的方法)

 

三、窗体加载 VS 文档加载

1、语法不同

window.onload = function() {
}

$(document).ready(function(){

}) ;

2、执行时机不同

前者必须等待网页中所有的内容加载完毕后(包括图片)才能执行;

后者是在网页所有DOM元素载入就绪时就执行(可能DOM元素关闭的东西并没有加载完,如图片)。

3、编写个数不同

前者不能同时编写多个,否则后面的会替换前面的;

后者可以编写多个,会执行多个。

4、简化写法

前者没有简写;

后者可简写

$(function(){

}) ;

​ $(document).ready(function(){ ​ }) ;

四、原生JS对象和JQ对象

1、原生 DOM 对象

通过JavaScript中的DOM API操作获得的元素对象,如document.getElementById...

2、JQquery对象

通过JQuery包装Dom对象后产生的对象,$(dom对象)、$(选择器)

注意: DOM对象和JQuery对象只能各自访问自己的方法; JQ对象一般比原生对象更加强大或操作方便,它经过了JQ的二次封装

3、DOM对象与JQuery对象的相互转换

1)Jquery对象 转换为 DOM对象 方法一: var 原生DOM对象 = JQ对象[下标] ;

方法二: var 原生DOM对象 = JQ对象.get(下标) ;

2)DOM对象 转换为 Jquery对象

var JQ对象 = $(原生DOM对象)

五、基本选择器

1、选择器

选择页面中要操作的节点对象; ​ 在JQ中,和CSS一样,也提供了非常多的选择器,便于选择要操作的节点对象

2、分类

1)ID选择器

语法:$("#ID名称") ​ 特点:返回唯一的一个节点对象

2)类选择器

语法:$(".Class名称") ​ 特点:可能返回多个节点对象,使用数组存储并返回

3)标记选择器

语法:$("标签名称") ​ 特点:可能返回多个节点对象,使用数组存储并返回

4)组合选择器

语法:$("S,S,...,S"),其中S表示其它选择器 ​ 特点:可能返回多个节点对象,使用数组存储并返回

5)通配选择器

语法:$("*") ​ 特点:可能返回多个节点对象,使用数组存储并返回

六、包装集管理

1、概念

包装集就是一个存储多个JQ对象的数组

2、常用API方法 -- 增强选择

1.获取包装集的容量大小

包装集对象.length ​ 包装集对象.size()

2.返回包装集某个子元素的下标索引

var index = 包装集对象.index(子对象);

3.把匹配的内容,添加到包装集中

包装集对象.add(JQ对象或包装集)

4.排除

包装集对象.not(JQ对象或包装集)

5.过滤

包装集对象.filter(JQ对象或包装集|回调函数) ;

    包装集对象.filter(function(index){
        return 条件 ;
    }) ;

 

6.slice(start[,end]):返回下标索引从 start 开始,到 end 结束的元素集合

原则: ​ 下标索引从0开始 ​ 包头不包尾

将匹配元素集合缩减为指定范围的子集。


JQuery DOM操作

一、DOM概念

DOM,文档对象模式。它是一些API对象或方法的集合, ​ 程序员使用这些API对象或方法可以很方便的对网页中的内容进行 ​ 增、删、改、查的操作。

二、分类

原生JavaScript的DOM操作 ​ JQuery的DOM操作 - 更加方便、简单、高效

三、具体操作 - 就是学习JQ提供的对象(方法或属性)

1、节点操作

1)创建节点

语法:$(html)

$(html)方法会根据传入的html标记字符串,创建一个DOM对象, ​ 并将此DOM对象包装成JQuery对象后返回。

2)插入节点
2.1)以父子关系的方式添加

以最后一个子元素的方式添加 ​ 父节点.append(子节点) ​ 子节点.appendTo(父节点)

以第一个子元素的方式添加 ​ 父节点.prepend(子节点) ​ 子节点.prependTo(父节点)

2.2)以兄弟关系的方式添加

哥哥节点.after(弟弟节点) ​ 弟弟节点.insertAfter(哥哥节点) ​ before() ​ insertBefore()

3)删除节点

● remove():还支持选择性删除,如$("ul li").remove("li[title!=one]") ; ​ ● detach():与 remove() 相同,但删除节点的事件,附加数据等会保留下来。 ​ ● empty():清空节点,包括此节点的所有后代节点

4)复制节点

clone(true | false):复制节点,可传boolen值,若为真,则该节点的事件也被复制

5)替换节点
    replaceWith()
    replaceAll()

6)包裹节点:将某个节点用其他标记包裹起来。
    wrap():将各个匹配的元素使用某个元素来包裹
    wrapAll():将所有匹配的元素用一个元素来包裹
    wrapInner():子元素被包裹

 

2、属性操作

prop() / removeProp() - 一般用于操作原生属性 ​ attr() / removeAttr() - 一般用于操作扩展属性

<font color="red" size="7" face="隶书" xxx="yyy"></font> 其中,font标签的原生属性有:color、size、face 扩展属性有:xxx

1)设置属性

元素节点.prop("属性名称","属性值"); ​ 元素节点.attr("属性名称","属性值");

2)获取属性值

var 属性值 = 元素节点.prop("属性名称"); ​ var 属性值 = 元素节点.attr("属性名称");

3)删除属性

元素节点.removeProp("属性名称"); ​ 元素节点.removeAttr("属性名称");

3、样式操作

1)设置样式

prop() / attr() ​ css()

2)追加样式

addClass(类名)

3)移除样式

removeClass(类名)

4)切换样式

toggleClass(类名)

5)判断是否含有某个样式

hasClass("类名")

4、内容操作

1)设置内容

元素节点.text("内容") ; // 是纯文本内容,innerText ​ 元素节点.html("内容") ; // 可以包含HTML,innerHTML

2)获取内容

var 变量 = 元素节点.text() ; ​ var 变量 = 元素节点.html() ;

5、表单操作

1)设置 value 属性值

元素节点.val(值) ;

2)获取 value 属性值

元素节点.val() ;

 

6、遍历节点

1)children()

获取匹配元素的子元素集合

2)next([selector])

获取匹配元素后面紧邻的同辈元素

对比:prev + next

3)nextAll([selector])

获取匹配元素之后所有的同辈元素

对比: prev ~ siblings

4)prev([selector])

获取匹配元素前面紧邻的同辈元素

5)prevAll([selector])

获取匹配元素之前所有的同辈元素

6)siblings([selector])

获取匹配元素前后氖的同辈元素

7)parent([selector])

获取匹配元素的上一级父元素

8)parents([selector])

获取匹配元素的父元素,包括所有的祖先元素

9)closest()

从元素本身开始,逐级向上级元素匹配,并返回最先匹配的元素

10)slice(start,[end])

获取匹配元素,下标索引从start到end的子集。

● slice(n):获取匹配元素下标索引从0到n的子集 ● slice(start,end):获取匹配元素下标索引从start到end的子集 ● slice(-n): 获取匹配元素下标索引从末尾开始选择到n的子集

事件与动画

一、概念

浏览器在打开到关闭的这个过程中, ​ 用户在浏览器所做的操作就是事件。

在 PC 端中,事件主要有以下三大类:

1.鼠标事件

单击(onclick) ​ 双击(ondblclick) ​ 经过(onmouseover) ​ 离开(onmouseout) ​ 移动(onmousemove) ​ 滑轮(onwheel) ​ ...

2.键盘事件

键盘按下(onkeydown) ​ 键盘弹起(onkeyup) ​ ...

3.窗体事件

加载事件(onload) ​ ...

响应:每一个事件的背后都会有相应响应,一般我们使用函数来实现 也就是说:每个事件的背后都有一个函数

目标对象:事件所作用的对象

二、绑定事件

1、bind(type,[data],fn)

type:表示事件的类型,在原生事件属性中去除on,click ​ data:表示数据 ​ fn:事件背后的函数

元素节点.bind(事件类型,function(){

}) ;

2、on(events,[selector],[data],fn)

可以给动态创建的节点绑定事件

父元素节点.on(事件类型,动态生成的节点,function(){
})

3、one(type,[data],fn)

4、简写绑定事件

元素节点.事件方法(function(){
}) ;

三、解绑事件

1、unbind() -- bind

2、off() -- on

四、合成事件

在JQ中,提供了一些API方法,把多个事件合成在一起,便于用户使用

1.hover :合成鼠标经过和离开
    元素节点.hover(鼠标经过,鼠标离开) ;

2、toggle() : 合成显示和隐藏

3、trigger("事件类型") :事件触发

五、事件对象

1、概念

事件对象(event)对所有事件的概括或描述 ​ 事件对象必须存在相关的属性和方法,可以对事件进行相关的操作

张三 李四 - 具体事件,如单击、双击

学生          -          事件对象

2、事件对象常用的属性和方法

目标对象:事件所作用的对象

目标对象:event.target

鼠标相对页面的坐标:event.pageX/eveng.pageY

鼠标的键类型:event.which

阻止事件冒泡:event.stopPropagation()

阻止默认行为:event.preventDefault()

课堂练习: 实现右键单击,弹出自定义菜单!

六、动画相关操作

1、动画基础相关的方法

width() / height()

offset()

position()

scrollTop()/scrollLeft()

2、常用动画

3、自定义动画

七、创建对象 - 文件标记法 - JSON格式的字符串 - 数据传输

var 对象名称 = {
        属性名称1 : 值,
        ...
        属性名称N : 值
    } ;

其中,值可以是任意数据类型 数值型 - 整数、浮点数 布尔型 - true | false 字符串 - "字符串" | '字符串' undefined null 数组 - [值1,...,值N] 对象 - {}

函数 - function() {}

复习

1.JQuery基本操作 - ch01 - ch05

ch01 - 入门 - 原生JS对象,JQ对象,$(),包装集(数组)

ch02 - 选择器 - 选择要操作的“节点”

ch03 - DOM(文档对象模式) - API对象(方法、属性)

ch04 - 事件 - 浏览器 - 动画

ch05 - 常用工具 - 常用方法

2.Ajax实现异步操作 - ch06(重点)

3.前端框架-BootStrap(BS) - ch07

常用工具方法

注意:工具方法都是使用$(工厂对象)访问,语法:$.xxxx() ;

1、$.trim(数据) :去除左右空格

2、$.isArray(数据) :判断数据是否为数组

3、$.isFunction() : 判断数据是否为函数

4、[var 对象 = ]$.extend(对象1,对象2,...对象N) : 扩展对象

把第二个参数到最后一个参数的对象,扩展到第一个参数的对象中 ​ 另外,extend方法返回最终扩展的对象 ​ 但一般直接使用第一个参数的对象 ​ 说明:在JQ自定义插件中,需要使用到此方法

5、$.getScript("路径/xxx.js") : 动态加载脚本(JS)

注意:必须在WEB服务器(Tomcat)下运行 ​ 安装插件:live server

6、$.each - 遍历数组或对象

1)遍历数组

$.each(数组名称,function(下标,元素){ ​ }) ;

2)遍历对象

$.each(对象名称,function(属性名称,属性值){ ​ }) ;

课堂练习: ​ 姓名 年龄 性别 班级 成绩 ​ ... ​ ... ​ ...

要求: ​ 1)把数据封装为对象 ​ 2)定义三条数据(三个对象),使用数组存储 ​ 3)加载数据按钮绑定单击事件 ​ 4)循环遍历数组,在表格中添加三行,并添加相应的数据

7、$.grep() - 过滤数组

$.grep(数组名称,function(数组元素,下标索引){

}) ; ​ 区别: ​ filter() - 过滤包装集(数组-JQ对象) ​ $.each()

8、$.inArray() - 查找数组是否存在某个元素,并返回下标,不存在则返回-1

var 下标 = $.inArray("查找内容",数组)

常用操作(补充)

1、is - 匹配元素

根据选择器、DOM元素或 jQuery 对象来检测匹配元素集合, ​ 如果其中至少有一个元素符合这个给定的表达式就返回true, ​ 否则返回false

 

2、map - 将一组元素转换成其他数组(不论是否是元素数组)

3、has - 判断是否拥有指定后代元素

4、end - 回到最近的一个"破坏性"操作之前。即,将匹配的元素列表变为前一次的状态。

5、find(向下找) VS closest(向上找)

 

 

 

IDEA的基本使用

一、 安装

二、 创建Java项目

1、 新建项目

File菜单 New Project

 

 

2、 打开项目的方式

 

 

3、 编写代码

创建包、接口、类

 

4、 运行程序

右键 Run …

 

三、创建 JavaWeb项目

1、创建 Java 项目(同上)

 

2、添加WEB支持

选中项目 Project Structure(项目结构) Modules(模块)

 

 

3、编写代码

src : 编写后端Java代码(接口、类、Servlet) à 实现业务逻辑

web:编写前端代码(html、css、js、JQuery、LayUI、BootStrap、Vue、Vant、…)à 用户可操作的界面(漂亮、体验好、操作方便) à 等同于Eclipse中的WebApp

 

注意:此时不能编写Servlet代码(继续往下操作)

 

4、配置Tomcat Web服务器

1)编辑配置

 

 

2)添加Tomcat

 

 

3)配置 Tomcat 安装目录

 

 

4)添加 Tomcat 依赖

 

5)编写 Servlet程序

6)创建Artifact

 

 

7、把 Artifact 部署到 Tomcat中

 

 

注意:部署成功后,一般需要修改项目的上下文路径

 

 

四、IDEA的设置

1、显示工具条

 

作业:

单表查询

--1、在"学生信息"表中,查询所属班级为20050402的学生信息,显示所有字段的学生信息

 select * from 学生信息 where 所属班级 ='20050402'

--2、在"辅导员信息"表, 显示格式为:姓名,性别年龄,籍贯,联系电话,年龄由高到低显示。

 select 姓名 ,性别+convert(nvarchar,年龄) as 性别年龄,籍贯,联系方式 
 from 辅导员信息 order by 年龄 desc

--3、在"教师信息"表中,查询所有字段的教师信息

 select  * from 教师信息

--4、在"教师信息"表中,查询籍贯为陕西(陕西宝鸡、陕西西安)的教师信息,要求显示所有字段

 select  * from 教师信息 
 where 籍贯 like '陕西%'

--5、在"教师信息"表中,查询年龄在20到30之间的教师信息,显示所有字段的信息

 select * from 教师信息
 where 年龄>=20 and 年龄<=30
 
 select * from 教师信息
 where 年龄 between 20 and 30

--6、在"教师信息"表中,查询最年轻的五名教师信息,要求显示所有字段

 select top 5 * from 教师信息
 order by 年龄 asc

--7、在"教师信息"表中,查询最年轻的那一名女教师信息,显示格式为:姓名,性别,年龄,联系电话

 select top 1 姓名,性别,年龄,联系电话 from 教师信息
 where 性别='女'
 order by 年龄 asc

--8、在"成绩信息"表中,对课程编号为1的成绩进行统计,显示格式为:总分、平均分、最高分、最低分、考生人数

 select  SUM  (CONVERT(float,分数)) as 总分,
 avg(CONVERT(float,分数)) as 平均分,
 max (CONVERT(float,分数)) as 最高分,
 min (CONVERT(float,分数)) as 最低分,
 count (*) as 考生人数
 from 成绩信息
 where 课程编号=1

--9、在"课程信息"表,显示选修的课程,显示格式为:课程编号,课程名称,是否必修,同时要求按课程编号升序排序

 select 课程编号,课程名称,是否必修 from 课程信息
 order by 课程编号*1
 
 select 课程编号,课程名称,是否必修 from 课程信息
 order by convert(int,课程编号)

--10、在"班级信息"表中,查询辅导员03所带班级的学生总人数, --显示格式为:学生总数

 select sum(班级人数) as 学生总数 from 班级信息
 where 辅导员='03'

--11、在"班级信息"表中,统计各辅导员所带班级的学生总人数,显示格式为:辅导员编号,学生总数

 1、第一种理解
 select * from 班级信息
 
 select 辅导员 as 辅导员编号,sum(班级人数) as 学生总数
 from 班级信息
 group by 辅导员
 
 2、第二种理解
 select 辅导员 as 辅导员编号,count(班级人数) as 学生总数
 from 班级信息
 group by 辅导员

====================================================================

多表查询

--1、查询“张苗苗”在哪个班,显示格式为:学号、姓名、班级名称

 use 学生成绩管理系统
 select 学号,姓名,所属班级 from 学生信息 left join 班级信息  on 学号=班级编号  
  where 姓名='张苗苗'
 
 -- 第一:找到查询数据所关联的数据表
 select * from 学生信息
 select * from 班级信息
 
 -- 第二:把这些关联的数据表进行连接查询 - 主外键 - 各种连接方式都操作一遍
 -- 注意:如果没有主外键,则需要找到相关中间表
 
 select * from 学生信息,班级信息 where 班级编号=所属班级
 
 -- 第三:根据查询条件,进行数据的筛选
 select 学号,姓名,班级名 as 班级名称
 from 学生信息,班级信息
 where 班级编号=所属班级 and 姓名='张苗苗'

--2、查询外语系各班的班级名称,班级人数

 select * from 班级信息
 select * from 系别信息
 
 select 班级名 as 班级名称,班级人数 from
 班级信息 inner join 系别信息
 on 所属系别=系别编号
 where 系别名称='外语系'

 

--3、查询分数是90-95分的学生学号,姓名,性别,分数

 select * from 学生信息;
 select * from 成绩信息;
 
 select 学号,姓名,性别,分数 from 学生信息
 left join 成绩信息 on 学号 = 学生编号
 where 分数 >= 90 and 分数 <= 95

--4、查询“张苗苗”在哪个班哪个系,显示格式为:学号、姓名、系别名称、班级名称

 select * from 学生信息;
 select * from 系别信息;
 select * from 班级信息;
 
 select 学号,姓名,系别名称,班级名 as 班级名称 from 学生信息
  left join 班级信息 on 所属班级=班级编号
  left join 系别信息 on 所属系别=系别编号
 where 姓名='张苗苗'
 
 select 学号,姓名,系别名称,班级名 as 班级名称 from 班级信息  
 inner join 学生信息
 on 所属班级 = 班级编号
 inner join 系别信息
 on 所属系别 = 系别编号
 where 姓名 = '张苗苗'

--5、查询各个系的编号,系名,"实际"学生人数

 select * from 系别信息
 select * from 班级信息
 select * from 学生信息
 
 -- 注意:
 -- count(*) :统计所有记录数
 -- count(字段):统计所有记录数,但忽略统计字段为NULL的数据(一般使用主键)
 -- 可以使用多个字段分组
 
 select 系别编号,系别名称,count(学号) as 人数 from 系别信息
  left join 班级信息 on 系别编号=所属系别
  left join 学生信息 on 班级编号=所属班级
 group by 系别编号,系别名称
 
 select * from 系别信息
  left join 班级信息 on 系别编号=所属系别
  left join 学生信息 on 班级编号=所属班级
 
 
 
 -- 第一种实现
 select 系别编号 , 系别名称 , sum(班级人数) as 学生人数 from 系别信息 as a
 inner join 班级信息 as c on a.系别编号=c.所属系别
 group by 系别名称 , 系别编号

--6、查询各辅导员的带班数量:辅导员编号,辅导员姓名,带班数量

 select * from 辅导员信息
 select * from 班级信息
 
 select * from 辅导员信息 left join 班级信息 on 辅导员编号=辅导员
 
 -- 注意:在此案例中,必须使用外连接,且使用count(字段)
 select 辅导员编号,姓名 as 辅导员姓名,count(班级编号)  as 带班数量
 from 辅导员信息
  left join 班级信息 on 辅导员编号=辅导员
 group by 辅导员编号,姓名
 
 

--7、查询各个系的学生总分数:系名称,总分

 select * from 系别信息
 select * from 成绩信息
 -- 注意:找到相关的表为:系别信息和成绩信息,但是这两张表不能连接,因此需要找相关的中间表
 select * from 班级信息
 select * from 学生信息
 
 select 系别名称 as 系名称, sum(convert(float,分数)) as 总分 from 系别信息 as a
  inner join 班级信息 as b  on a.系别编号 = b.所属系别
  inner join 学生信息 as c  on b.班级编号 = c.所属班级
  inner join 成绩信息 as d  on c.学号 = d.学生编号
 group by 系别名称
 
 select * from 系别信息
 select * from 成绩信息

-- 8.查询学生及其所在班级的信息,显示格式为:学号,姓名,性别,班级名,班级人数

 -- 第一:找查询涉及的相关数据表
 select * from 学生信息
 select * from 班级信息
 
 -- 第二:连接数据表 - 主外键 - 连接方式
 
 -- 第三:根据条件筛选数据
 
 use 学生成绩管理系统;
 select * from 班级信息
 
 select 学号,姓名,性别,班级名,班级人数 from 学生信息
  left join 班级信息 on 所属班级 = 班级编号

-- 9.查看各系的班级信息,显示的格式为:系别名称,班级名,班级人数 按班级人数降序排序

 select * from 系别信息 
 select * from 班级信息
 
 select 系别名称,班级名,班级人数 from 系别信息 left join 班级信息
 on 系别编号 = 所属系别
 order by 班级人数 desc

-- 10.查询学生所有课程的成绩,显示的格式为:学生编号,考试编号,课程名称,分数要求:根据学生编号升序排序

 select * from 成绩信息
 select * from 课程信息
 
 select 学生编号,考试编号,课程名称,分数 from
 成绩信息 a inner join 课程信息 b
 on a.课程编号=b.课程编号
 order by 学生编号 asc

-- 11.查询学生所有课程的成绩,显示的格式为:学生编号,考试类型,课程名称,分数 要求:先按学生编号升序排序,后按考试类型升序排序

 select * from 成绩信息
 select * from 课程信息
 select * from 考试安排
 
 select 学生编号,考试类型,课程名称,分数 from 成绩信息 t1
  inner join 课程信息 t2 on t1.课程编号=t2.课程编号
  inner join 考试安排 t3 on t1.考试编号=t3.考试编号
 order by 学生编号 asc , 考试类型 asc
 
 
 
 select B.学生编号,C.考试编号 ,考试类型, 课程名称,分数  from 学生信息 A
 left join 成绩信息 B  on A.学号 = B.学生编号
 left join 考试安排 C on B.考试编号 = C.考试编号
 left join 课程信息 D on D.课程编号 = B.课程编号
 order by 考试编号  asc,考试类型 asc

-- 12.查看辅导员带班的数量,显示格式为:辅导员编号,辅导员姓名,带班数量要求:辅导员编号升序排序

 select * from 班级信息
 select * from 辅导员信息
 
 select 辅导员编号,姓名 as 辅导员姓名,count(班级编号) as 带班数量
 from 辅导员信息 left join 班级信息 on 辅导员编号=辅导员
 group by 辅导员编号,姓名
 order by 辅导员编号 asc
 
 select 辅导员编号,姓名 辅导员姓名,COUNT(班级编号) 带班数量 from 辅导员信息 left join 班级信息 on 辅导员编号=辅导员
 group by 辅导员编号,姓名
 order by 辅导员编号*1

-- 13.查询学生的各科的成绩,显示格式为:学号,姓名,考试编号,课程名称,分数 要求:按课程名称升序,考试编号升序,分数降序查询

 select * from 学生信息
 select * from 成绩信息
 select * from 课程信息
 
 select 学号,姓名,t2.考试编号,课程名称,分数 from 学生信息 t1
  inner join 成绩信息 t2 on 学号=学生编号
  inner join 课程信息 t3 on t2.课程编号=t3.课程编号
 order by 课程名称 asc,t2.考试编号 asc,分数 desc

-- 14.把老师信息与辅导员信息两张表的数据合并在一张表中,显示的格式为:姓名,性别,年龄,民族,籍贯,联系电话

 -- union : 合并数据,查询字段的数量必须一致 + 数据类型必须匹配 + 意义要一样
 
 select 姓名,性别,年龄,民族,籍贯,联系方式 from 辅导员信息
 union all
 select 姓名,性别,年龄,民族,籍贯,联系电话 from 教师信息

-- 15.统计各个学生的成绩的总分,显示的格式为:学号,姓名,总成绩,要求如下:根据学号升序排序

 select * from 学生信息;
 select * from 成绩信息;
 -- isnull(参数一,参数二) :如果参数一为NULL,则返回参数二的值
 select 学号,姓名,isnull(sum(convert(float,分数)),0) as 分数 from 学生信息
  left join 成绩信息 on 学号=学生编号
 group by 学号,姓名
 
 select 学号,姓名,sum(CONVERT(float,分数)) as 总成绩
 from 学生信息 as a
 inner join 成绩信息 as b on a.学号 = b.学生编号
 group by 学号,姓名
 order by 学号 asc

====================================================================

子查询

 ### -- 1.查询与张苗苗同乡的学生信息  要求:使用子查询实现
 
 -- 注意:=只能匹配一个值,而in可以匹配多个值
 select * from 学生信息
 where convert(varchar,家庭住址) in (
  select convert(varchar,家庭住址) from 学生信息 where 姓名='张苗苗'
 )
 
 

-- 2.查询成绩没有合格的学生信息 要求:使用子查询实现

 select * from 学生信息  where 学号 in (
  select distinct 学生编号 from 成绩信息 where 分数<60
 )

====================================================================

T-SQL编程

1、查询

一、使用T-SQL创建用户信息表,有以下三个字段

     姓名
  年龄
  性别,只能是男或女
 
 create table 用户信息表
 (
  姓名 varchar(50) ,
  年龄 int,
  性别 char(2) check(性别='男' or 性别='女')
 )
 

二、添加数据,如下所示

	insert into 用户信息表 values ('张三',18,'男') ;
	insert into 用户信息表 values ('李四',19,'妖') ;
要求:
	判断是否执行添加成功,如果成功,则打印输出“添加成功”,
	否则打印输出“添加失败”
	
	if( @@error=0 ) 
		print '添加成功'
	else 
		print '添加失败'

 

三、查询用户信息,显示格式为:

 

	姓名 年龄 性别 角色
	张三	5	男	先生
	李四	17	女	女士
	王五	35	男	先生 
delete from 用户信息表

insert into 用户信息表 values ('张三',5,'男') ;
insert into 用户信息表 values ('李四',17,'女') ;
insert into 用户信息表 values ('王五',35,'男') ;

select *,
	case 性别 
		when '男' then '先生'
		when '女' then '女士'
		else '未知'
	end as 角色
from 用户信息表

四、查询用户信息,显示格式为:

	姓名 年龄 性别    年龄阶段
​	张三	5	男		童年
​	李四	17	女		少年
​	王五	35	男		青年
​	赵六	50	女		 
​	田七	70	女		老年 
​	
​	幼儿:0岁—2.5岁
​	童年:2.5岁—6岁
​	少年:6岁—17岁
​	青年:17岁—40岁
​	壮年:40—66岁
​	老年:66岁以后。

​	
​	insert into 用户信息表 values ('赵六',50,'男') ;
​	insert into 用户信息表 values ('田七',70,'女') ;

​	select *,
​		case 
​			when 年龄>0 and 年龄<=2.5  then '幼儿'
​			when 年龄>2.5 and 年龄<=6  then '童年'
​			when 年龄>6 and 年龄<=17  then '少年'
​			when 年龄>17 and 年龄<=40  then '青年'
​			when 年龄>40 and 年龄<=66  then '壮年'
​			when 年龄>66  then '老年'
​		end as 年龄阶段
​	from 用户信息表

--2、 定义一个变量,用于存储‘张苗苗’的性别

declare @sex char(2)
select @sex=性别 from 学生信息 where 姓名='张苗苗'
print @sex
GO

select * from 学生信息;

-- 3、定义变量,用于存储‘张苗苗’的姓名、出生日期、家庭住址,打印输出

-- 定义变量
declare @name varchar(50)
declare @birth date
declare @home varchar(50)

-- 查询数据,把查询结果给变量赋值
select @name=姓名,@birth=出生日期,@home=家庭住址 
from 学生信息 where 学号='2005010102'

-- 打印输出
print '姓名:' + @name
print '出生:' + convert(varchar,@birth)
print '地址:' + @home

--4、判断张苗苗是否能去网吧

-- 方法一
declare @age int
select  @age=year(getdate())-year(出生日期) 
from 学生信息 where 姓名='张苗苗'

if (@age >= 18)
	print '恭喜,您可以去网吧!'
else 
begin 
	print '报警'
end
GO

select * from 学生信息;

-- 方法二
declare @age int
declare @birth date

select  @birth=出生日期 from 学生信息 where 姓名='张苗苗'
set @age = year(getdate()) - year(@birth)

if (@age >= 18)
	print '您的年龄为:' + convert(varchar,@age) + ',恭喜,您可以去网吧!'
else 
begin 
	print '您未成年,报警'
end
GO

-- 5、判断今天是星期几,不同的星期,我们的早餐有不同的安排

declare @week int = 9
declare @result varchar(50)
set @result =
(
	case @week
		when 1 then '星期一,早餐吃面包'
		when 2 then '星期二,早餐吃面条'
		when 3 then '星期三,早餐吃汉堡'
		when 4 then '星期四,早餐吃小米粥'
		when 5 then '星期五,早餐吃鱼刺'
		when 6 then '星期六,早餐,午餐,晚餐一起吃'
		when 7 then '星期天,早餐吃螺母粉'
		else '你有毛病,哪有星期' + convert(varchar,@week)
	end
)
print @result


-- 6、使用 等值case 判断张苗苗的性别,如果是男的,则打印输出 张苗苗先生,否则 打印输出张苗苗女士

-- 方法一
declare @sex char(2)
declare @result varchar(50)
select @sex=性别 from 学生信息 where 姓名='张苗苗'
set @result = 
(
	case @sex 
		when '男' then '张苗苗先生'
		when '女' then '张苗苗女士'
		else '小妖精'
	end
)
print @result
GO



-- 方法二
declare @sex char(2)
select @sex=性别 from 学生信息 where 姓名='张苗苗'
print 
(
	case @sex 
		when '男' then '张苗苗先生'
		when '女' then '张苗苗女士'
		else '小妖精'
	end
)
GO

-- 方法三
select 
	case 性别 
		when '男' then '张苗苗先生'
		when '女' then '张苗苗女士'
		else '小妖精'
	end
from 学生信息 where 姓名='张苗苗'

-- 方法四
declare @result varchar(50)
select @result=
	case 性别 
		when '男' then '张苗苗先生'
		when '女' then '张苗苗女士'
		else '小妖精'
	end
from 学生信息 where 姓名='张苗苗'
print @result

GO

--7、显示成绩信息表中分数的等级

 

select *,
	case 
		when 分数 >= 0 and 分数<60 then '不合格' 
		when 分数 >= 60 and 分数<70 then '合格'
		when 分数 >= 70 and 分数<80 then '中等'
		when 分数 >= 80 and 分数<90 then '良好'
		when 分数 >= 90 and 分数<=100 then '优秀'
		else '分数非法'
	end as 分数等级
from 成绩信息;

====================================================================

系统函数

-- 1.在学生信息表中,查询学生的信息,显示的字段为:学号,姓名,性别,出生日期,年龄,要求如下:年龄要求必须满周岁

select 学号,姓名,性别,出生日期 from 学生信息

select 学号,姓名,性别,出生日期, 
	year(getdate()) - year(出生日期) as 年龄
from 学生信息

select 学号,姓名,性别,出生日期, 
	datediff(year,出生日期,getdate()) as 年龄
from 学生信息

-- 返回最小整数
print floor(36.1)

select 学号,姓名,性别,出生日期, 
	floor(datediff(DY,出生日期,getdate()) / 365.25) as 年龄
from 学生信息


-- 2.在学生信息表中,统计陈姓的数量,显示格式为:姓,数量

 select left(姓名,1) as  姓,count(*) as 数量 
 from 学生信息
 where 姓名 like '陈%'
 group by left(姓名,1)
 
 -- 3.在成绩表中,查询各课程的平均分,要求如下:保留一位小数
 select 课程编号,round(avg(convert(float,分数)),1) as 平均分
 from 成绩信息
 group by 课程编号
 order by 课程编号*1

-- 4.查询姓李且名字只有一个字的学生信息,如李三

 select * from 学生信息 where rtrim(姓名) like '李_'
 
 ### -- 5.自定义函数,实现判断某年是润年或平年
 
 -- 第一:定义函数
 GO
 create function isRunNian (@year  as  int)
 returns  char(4)
 begin
  declare @jieGuo char(4) = '平年'
 
 
 if (@year % 4=0 and @year%100!=0 or @year%400=0 )
  set @jieGuo = '润年'
 
 return @jieGuo
 
 end
 GO
 -- 第二:调用函数
 print dbo.isRunNian(2000)

-- 6.自定义函数,实现对学生信息表实现分页查询

-- 第一:定义函数

GO
create function  selectByPager (@currentPage as int,@pageCount as int)
returns  table
	return select * from 
	(
		select *, row_number() over(order by 学号 asc) as rownumber
		from 学生信息
	) as t 
	where rownumber between (@currentPage-1)*@pageCount+1 and @currentPage * @pageCount
GO
-- 第二:调用函数 - 必须以查询表格的方式调用
select * from dbo.函数名([实参形表]) ;
select * from dbo.selectByPager(1,5) ;

--row_number() over(order by 字段 [asc|desc]):返回一个不断递增的整数值 -> 分页查询
--就是给某张表从1-N进行编号

select * from 
(
	select *, row_number() over(order by 学号 asc) as 序号
	from 学生信息
) as t 
where 序号 between (当前页数-1)*每页记录数+1 and 当前页数 * 每页记录数

-- 第二:调用函数
	dbo.函数名称(实参列表)

===================================================================

改善数据库性能

视图

-- 1、创建视图,实现在学生信息表中,查询1985年出生的学生

--第一种方法
GO
alter view view_student
as
	select * from 学生信息 where  datepart(yy,出生日期) = 1985
GO

select * from view_student

--第二种方法
-- 第一:根据需求,编写查询语句
select * from 学生信息 where 出生日期 like '1985%'

-- 第二:创建视图,关联查询的结果
GO
create view view_1985
as
	select * from 学生信息 where 出生日期 like '1985%'
GO
	
-- 第三:使用视图
-- 视图本质上是一张数据表,因此也可以做增、删、改、查的操作
-- 但是,一般只用于做查询操作,
-- 由于视图并不是一张完整数据表,因此在做增、删、改操作时有可能会发生异常
-- 增、删、改操作还是回到对应的“基表”去操作

select * from view_1985 where 姓名='张苗苗';

 

-- 2、创建视图,实现查询张苗苗的姓名,性别,民族,出生日期,年龄

--第一种方法
GO
alter view view_student 
as
	select 姓名,性别,民族,出生日期,floor(datediff(dy,出生日期,getdate())/365.25) as 年龄 from 学生信息 
GO

select * from view_student


--第二种方法
GO
create view view_age
as 
	select 姓名,性别,民族,出生日期,year(getdate()) - year(出生日期) as 年龄 from 学生信息
GO

select * from view_age;

 

-- 3、创建视图,实现查询出生日期是1985-1986年的全部学生信息

GO
alter view view_student--年份:year(getdate()-year(出生日期))
as
	select * from 学生信息 where  
	datepart(yy,出生日期) = 1985 or datepart(yy,出生日期) = 1986
GO

select * from view_student

 

-- 4、创建视图,实现查询分数是90-95分的学生学号,姓名,性别,分数

GO
alter view view_student
as
	select 学号,姓名,性别,分数 from 学生信息 
		inner join 成绩信息 on 学号 = 学生编号
	where 分数 >= 90 and 分数 <= 95 
GO

select * from view_student

 

-- 5、创建视图,实现查询各个系的编号,系名,学生人数

 

GO
alter view view_student
as
	select 系别编号 as 编号,系别名称 as 系名,sum(班级人数) as 学生人数 from 系别信息
		inner join 班级信息 on 系别编号 = 所属系别
	group by 系别编号,系别名称

GO

select * from view_student

 

-- 6、创建视图,实现查询各辅导员的带班数量:辅导员编号,辅导员姓名,带班数量

GO
alter view view_student
as
	select 辅导员编号,姓名 as 辅导员姓名,count(班级编号) as 带班数量 from 辅导员信息
		inner join 班级信息 on 辅导员编号 = 辅导员
	group by 辅导员编号,姓名
GO

select * from view_student

 

-- 7、创建视图,实现查询平均分大于85的学生信息

use 学生成绩管理系统

GO
alter view view_student
as
	select 学号,姓名,性别,所属班级,avg(convert(float,分数)) as 平均分 from 学生信息
		inner join 成绩信息 on 学生编号 = 学号
	group by 学号,姓名,性别,所属班级
	having avg(convert(float,分数)) >85
	
GO

select * from view_student

 

-- 8、创建视图,实现查询各个系的学生总分数:系名称,总分

GO
alter view view_student
as
	select 系别名称 as 系名称,sum(convert(int,分数)) as 总分 from 学生信息
		left join 班级信息 on 班级编号 = 所属班级
		left join 系别信息 on 所属系别 = 系别编号
		left join 成绩信息 on 学生编号 = 学号
	group by 系别名称	
GO

select * from view_student

 

-- 9、创建视图,实现查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分

GO
alter view view_student
as
	select k.课程编号 as 课程ID,max(分数) as 最高分,min(分数) as 最低分 from 成绩信息 as c
		left join 课程信息 as k on c.课程编号 = k.课程编号
	group by k.课程编号	
GO
select * from view_student

 

-- 10、创建视图,实现查询课程编号1的成绩大于课程编号2的成绩的学生信息,要求使用两种方法实现:(自连接、子查询)

 select * from 系别信息
 select * from 班级信息
 select * from 辅导员信息
 select * from 学生信息
 select * from 成绩信息
 select * from 课程信息
 
 --自连接
 --第一种方法
 GO
 alter view view_student
 as
 select A.学号,A.姓名,A.性别,A.出生日期,A.民族,A.所属班级,A.家庭住址 from 学生信息 A inner join 学生信息 B on A.学号=B.学号
  where A.学号 in (
           select a.学生编号 from
              (select 学生编号, 分数 from 成绩信息 where 课程编号=1) as a,
              (select 学生编号, 分数 from 成绩信息 where 课程编号=2) as b
               where a.学生编号 = b.学生编号 and a.分数 >= b.分数 )
 Go
 
 select * from view_student              
 
 --第二种方法
 create view view_abc
 as
  select t1.学生编号,t1.课程编号 as 课程1,t1.分数 as 分数1
  ,t2.课程编号 as 课程2,t2.分数 as 分数2
  from 成绩信息 as t1
  inner join 成绩信息 as t2 on t1.学生编号=t2.学生编号
  where t1.课程编号=1 and t2.课程编号=2 and t1.分数>t2.分数
  and t1.考试编号=t2.考试编号 ;
 GO
 
 select * from view_abc
 
 
 --子查询
 GO
 alter view view_student
 as
  select * from 学生信息
  where 学号 in (
           select a.学生编号 from
              (select 学生编号, 分数 from 成绩信息 where 课程编号=1) as a,
              (select 学生编号, 分数 from 成绩信息 where 课程编号=2) as b
               where a.学生编号 = b.学生编号 and a.分数 >= b.分数
  )
 Go
 
 select * from view_student

存储过程

--11、定义存储过程,实现转帐业务的封装

 
 --一、创建表
 create table bank
 (
    customerName char(10) , -- 顾客姓名
    currentMoney money -- 当前余额
 )
 
 --二、添加索引,当前余额至少1块
 GO
 alter table bank
    add constraint ck_currentMoney    
        check(currentMoney>=1)
 GO
 
 --三、添加两个用户
 insert into bank(customerName,currentMoney) values('张三',1000)
 insert into bank(customerName,currentMoney) values('李四',1)
 
 --四、创建存储过程
 create proc banks
 
  --1、定义变量
  @out_name varchar(50) ,
  @in_name varchar(50) ,
  @money money ,
  @result varchar(50) output
 as
     --2、开始事务(开始做转帐业务)
  begin transaction
 
  --3、定义变量,用于接收操作是否失败(错误)
  declare @n int=0
         
  --4、转帐业务的第一个操作:转入
         update bank set
  currentMoney=currentmoney+@money
  where customerName=@in_name
 
  --5、记录上一个SQL语句是否发生错误
  set @n=@n+@@error
 
         --6、转帐业务的第二个操作:转出
     update bank set
          currentMoney=currentmoney-@money
     where customerName=@out_name
     
     --7、记录上一个SQL语句是否发生错误
         set @n=@n+@@error
 
  --8、判断事务背后的操作是否都成功执行
        if(@n=0)
 begin
         set @result='转帐成功'
  commit transaction
 end
  else
 begin
  set @result='转帐失败'
  rollback transaction
 end
 
 --五、定义变量
 declare @jg varchar(50)
 
 --六、调用存储过程
 exec banks '张三','李四',1000,@jg output
 
 --七、打印
 print @jg

-- 12、定义一个存储过程,实现向people表添加一条记录

 GO
 create proc addPeople
  @name  char(20),
  @pass char(6),
  @sex char(2),
  @age int,
  @weight float
 as
  insert into people values (@name,@pass,@sex,@age,@weight)
 go
 
 addPeople '喜洋洋','123123','男',3,20

--13、 定义一个存储过程,实现根据用户名删除people表中的记录

 GO
 create proc delPeople
  @name char(20)
 as
  delete from people where username=@name
 GO
 
 delPeople '喜洋洋'

-- 14、定义存储过程,实现修改people表中的数据

GO
create proc updatePeople
	@name char(20),
	@pass char(6),
	@sex char(2),
	@age int,
	@weight float
as
	update people set
		password=@pass,
		sex=@sex,
		age=@age,
		[weigth]=@weight
	where username=@name
GO

updatePeople @age=20,@name='孙a ',@weight=50,@sex='男',@pass=666666

select * from people;

-- 15定义存储过程,实现按性别查询people表中的数据

GO
create proc getPeopleBySex
	@sex char(2)
as
	select * from people where sex=@sex
GO	

getPeopleBySex '女'

-- 16、输入性别,返回该性别的年龄总和和平均年龄

 GO
 create procedure tongJiBySex
  @sex char(2),
  @zongNianLing int output ,
  @pingJunNianLing int output
 as
  select @zongNianLing=sum(age),@pingJunNianLing=avg(age)
  from people where sex=@sex
 GO
 
 declare @znl int
 declare @pjnl int
 -- 注意:如果存储过程有输出参数,那么必须使用 exec 关键字调用
 exec tongJiBySex '男',@znl output,@pjnl output
 print @znl
 print @pjnl
 
 

触发器

 -- 定义表transInfo描述用户的交易行为信息
 if OBJECT_ID('transInfo') is not null
 drop table transInfo
 
 GO
 create table transInfo(
  cardID varchar(10) , --交易账户号
  transType varchar(10), --交易类型(转入、转出)
  transMoney money, --交易金额
  transDate datetime --交易时间
 )
 GO
 
 -- 1001 0001 转入 100 xx
 
 create table backupTable(
  cardID varchar(10) ,    --交易账户号
  transType varchar(10), --交易类型(转入、转出)
  transMoney money, --交易金额
  transDate datetime --交易时间
 )
 
 -- 定义表 bank描述银行的用户账户信息.
 if OBJECT_ID('bank') is not null
 drop table bank
 
 GO
 create table bank(
  cardID varchar(10) primary key, --银行卡号
  customerName varchar(20) not null, --客户姓名
  currentMoney money check(currentMoney>1) --当前金额
 )
 GO
 
 insert into bank(cardID,customerName,currentMoney) values('1001 0001','张三',2000)
 insert into bank(cardID,customerName,currentMoney) values('1001 0002','李四',1000)
 
 

-- 17、向交易信息表(transInfo)添加数据时,用户帐户表(bank)的数据要进行相应的更新

 select * from transInfo;
 select * from bank;
 
 insert into transInfo values ('1001 0001','转入',1000,getdate()) ;
 
 update bank set
  currentMoney = currentMoney ? ?
 where cardId=?
 
 GO
 create trigger tri_transinfo_insert
 on transInfo
 for insert
 as
  -- 定义变量,接收当前添加的交易信息(inserted)
  declare @cardId varchar(10)
  declare @transType varchar(10)
  declare @money money
 
 
 select @cardId=cardID,@transType=transType,@money=transMoney
 from inserted
 
 -- 判断是转入还是转出
 if (@transType='转入')
  update bank set
  currentMoney = currentMoney + @money
  where cardId=@cardId
 else
  update bank set
  currentMoney = currentMoney - @money
  where cardId=@cardId

 

-- 18、当删除交易信息表时,要求自动备份被删除的数据到表backupTable中 。提示:需要创建的backupTable与transInfo表结构一样

 
 select * from transInfo;
 select * from backupTable;
 select * from bank;
 
 delete from transInfo where cardID='1001 0001'
 
 insert into backupTable values (?,?,?,?)
 
 GO
 alter trigger tri_transinfo_delete
 on transinfo
 for delete
 as
  -- 在 deleted 表中,把删除的数据,添加到备份表中
  insert into backupTable
  select * from deleted

 

-- 19、跟踪用户的交易(修改bank表),交易金额超过20000元,则取消交易,并给出错误提示。

 GO
 create trigger tri_bank_update
 on bank
 for update
 as
  -- 开启事务
  begin transaction
 
 
 declare @beforeMoney money
 declare @afterMoney money
 
 -- 获取修改后的金额
 select @afterMoney=currentMoney from inserted
 -- 获取修改前的金额
 select @beforeMoney=currentMoney from deleted
 
 -- 计算交易金额差
 if(abs(@afterMoney - @beforeMoney) >= 20000)
  rollback transaction
 else
  commit transaction
 
 select * from transInfo;
 select * from bank;
 
 insert into transInfo values ('1001 0001','转出',10000,getdate()) ;

项目实现

-- 创建一个角色(学习委员),对 Xxx表 拥有 增、删、改、查操作 -- 创建两个用户,并赋予 学习委员 角色 -- 分别使用这个用户登录,测试是否具有相关的权限 -- 最后,从学习委员角色中,删除其中的一个用户,再次登录测试

 -- 创建学习委员角色
 exec sp_addrole '学习委员'
 
 --分配权限到角色
 grant insert ,delete,update on bank to 学习委员
 --创建几个帐号
 sp_addlogin 'ww',1000,'CustomDB'
 sp_addlogin 'yy',1000,'CustomDB'
 
 exec sp_grantdbaccess 'ww'
 exec sp_grantdbaccess 'yy'
 
 exec sp_addsrvrolemember 'ww','学习委员'
 
 --为某角色添加用户
 sp_addrolemember '学习委员','ww'
 sp_addrolemember '学习委员','yy'
 

 


posted @   一只菜喵程序媛  阅读(179)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示