follow me learning sqlserver transql

时间:2022-04-26 02:48:27

create DATABASE 教务管理系统
on (
name=教务管理系统_data,
filename='E:\sql\教务管理系统_data.mdf ',
size=5mb,
maxsize=20mb

)
log on(

name=教务管理系统_log,
filename='E:\sql\教务管理系统_log.ldf',
size=2mb,
maxsize=10mb

)

create database myTest
on (
name=myTest_data,
filename='E:\sql\myTest_data.mdf ',
size=5mb,
maxsize=20mb

)
log on(

name=myTest_log,
filename='E:\sql\myTest_log.ldf',
size=2mb,
maxsize=10mb

)

<创建数据库快照》
create database student_info
on
(name=教务管理系统_data,filename='E:\sql\教务管理系统_data_snop.mdf '),
(name=shuju,filename='E:\sql\教务管理系统_data_snop2.mdf ')

as snapshot of 教务管理系统

《/创建数据库快照>

《还原数据库》
Restore database 教务管理系统
from database_snapshot ='student_info'

《?还原数据库》

《创建表>
use mysql
create table meng
(userNo int identity not null,
username nvarchar(10) null,
pohoto image null,
birthday dateTime null
)

use myTest
create table meng
(userNo int identity not null,
username nvarchar(10) null,
pohoto image null,
birthday dateTime null
)

</创建表>

<创建临时表>

<创建本地临时表>
create table #tempLocal
(
name1 varchar null,
age int null

)

可查询
select * from ##tempLocal

</创建本地临时表>

<创建全局临时表>
create table #tempLocal
(
name1 varchar null,
age int null

)

可查询
select * from ##tempLocal

</创建全局临时表>

</创建临时表>

将列设为标识字段将不需要插入该列,系统会自动生成记录,通过管理器设置
<创建表>
create table mytest2
(
id int primary key identity(3,1),--主键,自动+1 ,初始值为3
name varchar(20) unique not null,--不允许重复,不允许为空
Age tinyint,
notetime smalldatetime default getdate()
)
</创建表>
<更改数据表的结构>
alter table mytest2

alter COLUMN [notetime] smalldatetime not null

修改字段:
ALTER TABLE [表名] ALTER COLUMN [字段名] NVARCHAR (50) NULL

重命名表:(Access 重命名表,请参考文章:在Access数据库中重命名表)
sp_rename '表名', '新表名', 'OBJECT'

</更改数据表的结构>

<对数据表的重命名>
sp_rename 'mytest2', 'mytest'
</对数据表的重命名>

<数据表中增加字段>
alter table mytest2
add sex nvarchar(5) null
</数据表中增加字段>

<增加数据类型>
表->可编程性-》类型->用户自定义数据类型
</增加数据类型>

<三张表的创建>
1.
create table classInfo
(
className nvarchar(20) null

)

2.
create table GradeInfo
(
stuNo nvarchar(20) primary key not null,
id int identity(1,1),
chineseGrade int null,
java int null,
math int null,
english int null

)

3.
create table stuInfo2
(
stuNo nvarchar(20) primary key not null,
id int identity(1,1),
username nvarchar(20) null,
sex varchar(5) null,
birthday date null,
class nvarchar(20) null

)

</三张表的创建>

<select>

select * from tablename where a and b or c
select * from tablename where name like'x%'通配符以x开头
select * from tablename where name like '%x'

<排序>
SELECT * from myTest.dbo.mytest2 order by Age desc

SELECT * from myTest.dbo.mytest2 order by Age asc,id desc 先按照年龄按升序,年龄相同然后以id降序排列
SELECT * from myTest.dbo.mytest2 order by Age ,id desc 先按照年龄按降序,年龄相同然后以id降序排列
</排序>

select stuNo , max(english),AVG(java) from myTest.dbo.GradeInfo group by rollup (java,stuNo ,id ) having java>90 order by id desc

select * from stuInfo where class in('软工11001班','软工11002班')

</select>

<group by>
select AVG(Age),name from myTest.dbo.mytest2 group by rollup (name)
</group by>

<having>
select max(Age),AVG(Age) ,name from myTest.dbo.mytest2 group by rollup (name,Age) having Age>20
</having>

<where>
where 后+集合函数 是先where 后集合,所以where AVG(COLNUM)是错的,where 后分组的的,先where后统计
</where>

<grouping>
获取产生的空值
select max(Age) ,GROUPING(Age) S1 from myTest.dbo.mytest2 group by rollup (Age )
</grouping>

<compute >
use myTest

select username,stuNo from stuInfo group by username,stuNo compute count(username )
</compute>

<内连接查询 内连接把两个表中的数据连接生成第三个表,在第三个表中仅包含那些满足连接条件的数据行。
在连接中使用inner join 连接运算符,如果在Join关键字前面没明确指定连接类型,那么默认的连接类型是内连接>

use myTest

select a.username as'姓名' from stuInfo a inner join GradeInfo b on a.stuNo=b.stuNo on b.java >85

</内连接查询>

<外连接查询 在外连接中,不仅包括那些满足的条件的数据,而且某些不满足条件的数据也会显示在结果集中。
也就是说,外连接中只限制其中一个表的数据行,而不限制另外一个表中的数据,有三种方式:
left outer join --左连接是对连接条件中左边的表不加限制
right outer join--右连接是对连接条件中右边的表不加限制
full outer join--全连接是对连接条件中左右两边边的表不加限制

>
<left outer join>
select a.username as'姓名' ,b.stuNo as '成绩学号' from stuInfo a left outer join GradeInfo b on a.stuNo=b.stuNo and b.java >85

</left outer join>

<right outer join>
select a.username as'姓名' ,b.stuNo as '成绩学号' from stuInfo a left outer join GradeInfo b on a.stuNo=b.stuNo and b.java >85

</right outer join>

<full outer join>
select a.username as'姓名' ,b.stuNo as '成绩学号' from stuInfo a full outer join GradeInfo b on a.stuNo=b.stuNo and b.java >85

</full outer join>

</外连接查询>

<子查询>

select username from stuInfo where class=(
select className from classInfo where className='软工11002班' //clasa后面是'=',所以子查询(select className
from classInfo where className='软工11002班')
返回的必须是一个值,不能是多个值,还有>,<也是
)

select username from stuInfo where class in(
select className from classInfo //in后面是个集合
)

<exists 如果内层的查询结果不为空,则外层的where 的子条件为ture 即第一个where查询的条件为真,相当于select class from stuInfo,否则第一个where查询的条件为假>

select class from stuInfo where exists(
select className from classInfo
)

select stuNo from stuInfo where exists(
select * from GradeInfo
)

</exists>

</子查询>

<联合查询>
<存储查询结果>
select class into class from stuInfo where username='孟志军'
</存储查询结果>

<if...else begin...end>

if(select AVG(java) from GradeInfo)>80

begin
print 'Bucuo'
print '不错哦'

end
else
if exists(select * from classInfo where className='软工11003班')
print '后来--Bucuo'
print '懂得--不错哦'

</if...else begin...end>

<case ..when 返回第一个为true的表达式(若为true将不继续判断),若没有一个表达式为真则返回Null>

select username ,
case class
when '软工11001班' then 'uername:软工1001班'
when '软工11002班' then 'uername:软工1002班'
when '软工11003班' then 'uername:软工1003班'
end as '班级'
from stuInfo

select stuNo ,
case
when AVG(english)>80 then 'uername:软工1001班'
when AVG(math)>80then 'uername:软工1002班'
when AVG(chineseGrade)>80 then 'uername:软工1003班'
end as '班级'
from GradeInfo
group by stuNo

</case ..when>

<cast>
select cast (count(java) as nvarchar(10)) meng ,
CAST(AVG(english) as int) english2

from GradeInfo
</cast>

<over>

select max(java) max_java ,rank() over (order by math) meng_rowNow ,ROW_NUMBER() over (order by math) wo from GradeInfo group by math

select * from(
select max(java) max_java ,rank() over (order by math) meng_rowNow ,ROW_NUMBER() over (order by math) wo
from GradeInfo group by math
)hahh where meng_rowNow=3 and hahh.max_java=(select MAX(java) from GradeInfo)

select * from(
select className , ROW_NUMBER() over(order by className) r from classInfo )t
where t.r>0
<over>

</联合查询>

<insert ...select>
insert into classInfo (className) select className FROM classInfo where className is not null
</insert...select>

<delete 删除最后十行>
delete top(10) classInfo from (
select * from(
select className , max(ROW_NUMBER() over(order by className )) r from classInfo )t
where t.r>0
)z where z.r>10
<delete>