码迷,mamicode.com
首页 > 数据库 > 详细

SQL

时间:2015-02-05 23:04:58      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

--增删改查、约束、聚合函数、分组、分组筛选、排序、类型转换、联合结果集
--备份、string函数、case end
select * from Test
insert into Test(Name,Age) values(‘tom‘,33)
--当我前面是Test的时候,除了ID不用给值,别的字段必须要给值
insert into Test values(‘tom‘,22,‘男‘,‘北京海淀‘)

--如果不指定要修改哪一行,会把所有的数据进行修改
update Test set Name=‘tom‘,Age=22 where ID=1

--下架Test表中Address这个列
alter table Test drop column Address

--给Test表添加Address列,还要数据类型
alter table Test Add Address nvarchar(10)

--查姓名和年龄
select Name as ‘姓名‘,Age as ‘年龄‘ from Test

--查询前十条数据
select top 10 * from Test

--查询年龄最小的两个人
select top 2 * from Test order by Age

--查询年龄最大的10%的学生
select top 10 percent * from Test order by Age desc

--主键表的ID在外键表中是一个普通的列
--如果部门下有人,部门是不能删除的,不想那么麻烦,就设置更新规则和删除规则的级联

--聚合函数(null值不参与聚合函数)
select COUNT(*) from Test
select * from TblScore
select MAX(tsmath) from TblScore
select top 1 tsenglish,tsmath from TblScore order by TSMath desc
select MIN(tsmath) from TblScore
select SUM(tsmath) from TblScore
select AVG(tsmath) from TblScore
select MAX(tsmath) as 最高成绩,
MIN(tsmath) as 最低成绩,
SUM(tsmath) as 总和,
AVG(tsmath) as 平均成绩 from TblScore

--between and和in
select * from student where TSAge between 20 and 30
select * from student where TClassId in(1,2,3)

--模糊查询(针对字符串进行操作)
select * from student
--查询姓张的
select * from student where TSName like ‘张%‘
--查询姓张的,只有两个子的
select * from student where TSName like ‘张_‘
select * from student where TSName like ‘张%‘ and LEN(TSName)=3
--中间有字母,三个字
select * from student where TSName like ‘张[a-z]%‘

--不能用TSEnglish=null
select * from TblScore where TSEnglish is null
select * from TblScore where TSEnglish is not null

--分组
select * from student
select tclassid as 班级的ID, COUNT(*) as 班级的人数 from student group by TClassId

--分组筛选
select tclassid as 班级的ID, COUNT(*) as 班级的人数 from student group by TClassId
having COUNT(*)>3

--类型转换
select ‘当前时间‘+CAST(GETDATE() as varchar(20))
select ‘当前时间‘+CONVERT(varchar(20),GETDATE(),120)

--联合结果集(列数相同,类型相同)
select ‘最高成绩‘ as 内容,MAX(tsmath) as 分数 from TblScore
union
select ‘最低成绩‘,MIN(tsmath) from TblScore
union
select ‘平均成绩‘,AVG(tsmath) from TblScore

--备份(把该表中的数据放到另一个表中)(约束不会复制过来)
select * into newnewStudent from student
--只拷贝表的结构(效率太低)
select * into new3student from student where 1<>1
--这种方式效率高
select top 0 * into new4student from student
--表已经存在
insert into new4student select * from student

--string函数
--LEN()字符串长度
--DATALENGTH()字节长度
--LOWER()小写
--UPPER()大写
--LTRIM(‘ 123 ‘)
--RTRIM(‘ 123 ‘)

--case end
select
数学成绩=
case
when TSEnglish>100 then ‘优‘
when TSEnglish>90 then ‘良‘
when TSEnglish>80 then ‘中‘
when TSEnglish>70 then ‘及格‘
when TSEnglish is NULL then ‘缺考‘
else ‘不及格‘
end

from TblScore

--第二个练习 1 2 3

use nononodeleteImportant
select * from user5

select *,
级别=
(
case
when level=1 then ‘骨灰‘
when level=2 then ‘大侠‘
when level =3 then ‘菜鸟‘
end
)
from user5
select * from t8

select (case when a>b then a else b end),(case when b>c then b else c end ) from t8


select * from MyOrders

select
销售员,
销售总金额=SUM(销售数量*销售价格),
称号=
(
case
when SUM(销售数量*销售价格)>6000 then ‘金牌‘
when SUM(销售数量*销售价格)>5500 then ‘银牌‘
when SUM(销售数量*销售价格)>4500 then ‘铜牌‘
else ‘铁牌‘
end
)
from MyOrders
group by 销售员

select * from test

select
number,
收入=
(
case
when amount>0 then amount else 0
end
),
支出=
(
case
when amount<0 then ABS(amount) else 0
end
)
from test

use MyItcast

 

select * from (select * from student where TSGender=1) as t where TSAge>20
--查询所有的英语成绩 并英语的成绩>90 --子查询做

select * from (select TSEnglish from TblScore) as te where TSEnglish>90

1.查询出班级中所有24岁的男生(子查询)

select * from (select * from student where TSGender=1) as stu where TSAge>24
2.查询出高一三班和高二二班的所有学生(子查询)

select * from TblClass
select * from student

select * from student where TClassId in
(select tclassid from TblClass where TClassName=‘黑马一期‘ or TClassName=‘黑马二期‘)

3.查询出的总人数,男同学多少人,数学平均成绩(子查询)

select
总人数=(select count(*) from student),
男同学的人数=(select COUNT(*) from student where TSGender=1),
数学的平均成绩=(select AVG(TSMath) from TblScore)


select (select max(tsenglish) from tblscore),(select min(tsenglish) from tblscore),(select avg(tsenglish) from tblscore)

 


select * from TblStudent as ts
where exists(select * from TblClass as tc where tc.tClassId=ts.TClassId and tc.tClassName=‘黑马一期‘)


--delete from student where sId in
--(select sId from student where sName=‘刘备‘ or sName = ‘关羽‘ or sName=‘张飞‘)
use myitcast
select * from student

 

--9条到16条的数据

select top 8 * from student where tsid not in
(select top 8 tsid from student )

 

use nononodeleteImportant
select * from Customers

--57 到 64

--每页7条数据 ,查 第三页的数据--练习

select top 7 * from student where tsid not in
(select top (2*7) tsid from student)

--编号
select 编号=ROW_NUMBER()over(order by tsid),* from student


--over按照哪一列进行排序 然后row_number()编号
select tsmath,名次=ROW_NUMBER()over(order by tsmath desc) from TblScore

 

 

 

select * from student

--每页三条 查第五页的
select * from
(select 编号=ROW_NUMBER() over(order by tsname desc),* from student)as newStu
where newStu.编号 between (5-1)*3+1 and 3*5

 

 

 

 


use nononodeleteImportant
select * from MyOrders
--每页9条数据 查询13页的
select 编号=ROW_NUMBER ()over(order by id),*from MyOrders
where 编号 between 12*9+1 and 9*13
select * from
(select 编号=ROW_NUMBER() over(order by id),* from MyOrders) as Orders
where 编号 between (13-1)*9+1 and 13*9

use MyItcast
select tsmath,名次=ROW_NUMBER()over(order by tsmath desc) from TblScore


select tsmath,名次=rank()over(order by tsmath desc) from TblScore


select tsid,tenglish,
名次=rank() over(order by tenglish desc)
from TblScore
order by tEnglish desc

--分区
select id,商品名称,行号=ROW_NUMBER() over(partition by 商品名称 order by id asc) from MyOrders
select *,数学考试排名=rank() over(order by tMath desc) from TblScore;

 

select *,数学考试排名=rank() over(order by tMath desc) from TblScore order by tscoreId asc;


--===========================================


select * from MyOrders

select
销售员,
销售总金额=sum(销售数量*销售价格)
from MyOrders
group by 销售员

select
*,
销售总金额=sum(销售数量*销售价格) over(partition by 销售员)
from MyOrders


--2.统计每个销售员(订单)的销售金额占总销售金额的百分比。

select * ,销售数量*销售价格,
百分比=销售数量*销售价格*1.0/SUM(销售数量*销售价格) over(partition by 销售员 )*100
from MyOrders
--要求:表中其他列数据也必须同时显示。即在最后追加两列数据(每个销售员的总销售金额,百分比)
--3.使用row_number()函数实现分页

 

--每页6 条 第四页

select * from
(select 编号=ROW_NUMBER() over(order by id),* from MyOrders) as ts
where ts.编号 between (4-1)*6+1 and 4*6
--25 4 --27
use MyItcast
select * from student
select * from UserLogin

select * from student,UserLogin
select * from TblClass,student--笛卡尔积
--缺点
--三大范式---
--表连接查询 是从这个大的笛卡尔积中 进行筛选

 

 

--查询这个学生的时候能不能把这个学生所在的班级的名字也显示出来
select * from student
inner join TblClass on student.TClassId=TblClass.TClassId
--内联
select student.TSId,TSName,TSGender,TClassName,student.TClassId,TblScore.TSEnglish from student
inner join TblClass on student.TClassId=TblClass.TClassId
inner join TblScore on student.TSId=TblScore.TSId


--查询这个学生在哪个班级,他(她)的考试成绩

 


--查询年龄超过20岁的学生的姓名、年龄及所在班级

select TSName,TSAge from student
inner join TblClass on student.TClassId=TblClass.TClassId
where TSAge>20--不要这样做,千万不要这么做


--查询所有学生(参加及未参加考试的都算)及成绩

--参加考试
--select * from student
--inner join TblScore on student.TSId=TblScore.TSId

--所有的(参加和没参加的 都查询了)
select * from student
left join TblScore on student.TSId=TblScore.TSId

select * from student
right join TblScore on student.TSId=TblScore.TSId

--没参加考试
select * from student
left join TblScore on student.TSId=TblScore.TSId
where TblScore.TSId is null


--查询所有参加考试的,english分数不为null学生姓名、年龄及成绩
select * from student
inner join TblScore on student.TSId=TblScore.TSId
where TSEnglish is not null
--练习3:查询所有学生(参加和未参加考试)的学生姓名、年龄、成绩,如果没有参加考试显示缺考,如果小于english&math60分显示不及格

select
姓名=TSName,
年龄=TSAge,
英语成绩=
case
when TSEnglish is null then ‘缺考‘ else CONVERT(nvarchar(10),TSEnglish)
end
,
数学成绩=
case
when TSMath is null then ‘缺考‘ else CONVERT(nvarchar(10),TSMath)
end
,
是否及格=
case
when TSEnglish>60 and TSMath>60 then ‘及格‘ else ‘不及格‘
end
from student
left join TblScore on student.TSId=TblScore.TSId


use nononodeleteImportant

select * from TblArea

 

select
t1.AreaId,
t1.AreaName,
t2.AreaName
from TblArea as t1
inner join TblArea as t2 on t1.AreaPId=t2.AreaId
--表连接

create view vw_myStus
as
select tSName,tSGender,tSAge,tClassName,tEnglish from TblStudent
inner join TblClass on TblStudent.tSClassId=TblClass.tClassId
inner join TblScore on TblStudent.tSId=TblScore.tSId

--视图主要是为了查询

--表怎么用视图就怎么用
select * from vw_myStus

 


select * from MyOrders


create view vw_ors
as
select 购买人,
总金额=SUM(销售数量*销售价格)
from MyOrders
group by 购买人

select * from vw_ors

 


--先声明 再赋值 再使用

declare @num int =10
select @num
--print @num

declare @name nvarchar(10)
set @name=‘马伦‘;
print @name

--数据库声明变量 declare @名字 类型 如果想赋值 可以直接赋值 或者是通过 set赋值


--没答对呀 --
--declare @age int
--set @age=10
--print @age
--select @age+1
--print @age

--select @age=@age+1
--print @age


declare @num int=10, @score int
set @num=@num+10

set @score=@score*100
print @score

select * from TblScore

declare @num int
--select @num=tMath from TblScore
set @num=(select tMath from TblScore)--严禁的
select @num

insert into TblStudent values(‘fsafasf‘,‘fsfdsf‘)
--查询的是刚刚的执行的错误消息值
select @@ERROR

--事务
print ‘服务器名称: ‘+@@SERVERNAME

select @@VERSION


--select @num=tMath from TblScore


declare @name nvarchar(10)=‘龌蹉‘

if(@name=‘好帅‘)
begin
print ‘原来是小杨‘
end
else
begin
print ‘原来是小赵‘
end

 

--计算平均分数并输出,如果平均分数超过60分输出成绩最高的三个学生的成绩,否则输出后三名的学生


--作业
declare @avg int =0
set @avg=(select AVG(tMath) from TblScore)
if(@avg>60)
begin
select top 3 * from TblScore order by tMath desc
end
else
begin
select top 3 * from TblScore order by tMath asc
end

--事务
select * from bank
begin transaction
declare @Error int
set @Error=0
update bank set balance=balance-1000 where cId=1
set @Error=@Error+@@ERROR
update bank set balance=balance+1000 where cId=2
set @Error=@Error+@@ERROR
if(@Error<>0)
begin
--错误
rollback transaction
end
else
begin
--成功
commit transaction
end

--存储过程,列出服务器上所有的数据库
exec sp_databases

--列出数据库上所有的表(当前数据库)
exec sp_tables

--列出表上所有的列名
exec sp_columns bank

--写一个存储过程计算两个数的和
create proc usp_GetSum
@num1 int,
@num2 int
as
begin
select @num1+@num2
end

--调用上面的方法,必须先把存储过程运行一下,才能调用
--第一种方式
declare @n1 int=10,@n2 int=20
exec usp_GetSum @num1=@n1,@num2=@n2

--第二种方式
exec usp_GetSum 10,11

--创建一个存储过程计算两个数的差
create proc usp_TwoNumSub
@num1 int,
@num2 int,
@result int output--调用的时候也要output输出
as
begin
set @result=@num1-@num2
end

--调用
declare @res int
exec usp_TwoNumSub 5,2,@res output
select @res

select * from student
--写一个存储过程,查询姓张的并且年龄大于10的,返回条数,运行以后就不能修改了(也可以修改)
create proc usp_stuByNameAndAge001
@name nvarchar(10),
@age int,
@count int output
as
begin
set @count=(select COUNT(*) from student where TSName like @name+‘%‘ and TSAge>@age)
select * from student where TSName like @name+‘%‘ and TSAge>@age
end

declare @res int
exec usp_stuByNameAndAge001 ‘吕‘,10,@res output
select @res

--存储过程提分
select * from TblScore
create proc usp_tblscoreAdd
@scoreLine int=60,
@addScore int =2,
@i int output
as
begin
set @i=0
--总人数
declare @sumPerson int =(select COUNT(*) from TblScore)
--不及格的人数
declare @l int=(select COUNT(*) from TblScore where tMath<@scoreLine)
while(@l>@sumPerson/2)
begin
update TblScore set tMath=tMath+@addScore--提分
--再次获取不及格的人数,进行判断
set @l =(select COUNT(*) from TblScore where tMath<@scoreLine)
set @i=@i+1
end
end

declare @count int
exec usp_tblscoreAdd 60,2,@count output
select @count

--存储过程分页
create proc usp_pageStudent
@page int,--第几页
@count int,--每页多少条
@sumPage int output--总页数
as
begin
--总页数
set @sumPage=(ceiling((select COUNT(*) from TblStudent)*1.0/@count))
--查询数据
select * from
(select 编号=ROW_NUMBER() over(order by tsid),* from TblStudent)as t
where t.编号 between (@page-1)*@count+1 and @page*@count
end

declare @t int
exec usp_pageStudent 4,6,@t output
select @t

--存储过程查询项目
select * from student
create proc usp_selectAllStudent
as
begin
select * from student
end

exec usp_selectAllStudent

create proc usp_updateOneStudent
@name nvarchar(10),
@id int
as
begin
update student set TSName=@name where TSId=@id
end

exec usp_updateOneStudent ‘张飞飞‘,3


--删除学生表中的数据时,把删除的这个数据,存放到我的新表中(触发器)
--先创建一个新表
select top 0 * into studentNew from student
select * from studentNew
--创建一个触发器
create trigger tr_studentTR on student
after delete
as
begin
insert into studentNew select * from deleted
end
--删一天数据
select * from student
delete from student where TSId=27

--视图
select * from TblStudent
select * from TblClass
select * from TblScore
--创建视图,只让看ID,姓名,性别
create view vw_TblstudentInfo
as
select tSId,tSName,tSGender from TblStudent
--查看视图
select * from vw_TblstudentInfo

 

--创建视图
create view vw_TblStudent_TblClass_TblScore
as
select tblstudent.tSId,tSName,tSGender,tSAddress,tSPhone,tSAge,tSBirthday,tSCardId,tSClassId,tClassName,tClassDesc,tScoreId,tEnglish,tMath from TblStudent
inner join TblClass on TblStudent.tSClassId=TblClass.tClassId
inner join TblScore on TblStudent.tSId=TblScore.tSId
--查询视图
select * from vw_TblStudent_TblClass_TblScore

 

SQL

标签:

原文地址:http://www.cnblogs.com/bidianqing/p/4276009.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!