20171107--SQL变量,运算符,存储过程

create database shujuku03
go
use shujuku03
go
create table jiaoshi--创建jiaoshi表--
(
    code int primary key,--code 列设置主键
    name varchar(20),
    kecheng varchar(20),
    sex varchar(10),
    riqi varchar(20),
)
go
create table xuesheng--创建xuesheng表,与jiaoshi表有关联
(
    xuehao int primary key,--xuehao列设置主键
    name varchar(20),
    banji varchar(10),
    sex varchar(10),
    Cnjs int references [dbo].[jiaoshi]([code]),--设置外键,与jiaoshi关联
    Majs int references [dbo].[jiaoshi]([code]),--
    Enjs int references [dbo].[jiaoshi]([code]),--
)
go
create table fenshu--创建fenshu表,与学生表有关联
(
    xuhao int references [dbo].[xuesheng]([xuehao]),--设置外键,与xuesheng关联
    yuwen decimal(10,2),
    shuxue decimal(10,2),
    yingyu decimal(10,2),
)
go
insert into jiaoshi values (1,‘刘欣欣‘,‘语文‘,‘女‘,‘1980-5-10‘)
insert into jiaoshi values (2,‘文祥‘,‘语文‘,‘女‘,‘1983-9-19‘)
insert into jiaoshi values (3,‘毕华‘,‘数学‘,‘男‘,‘1977-1-10‘)
insert into jiaoshi values (4,‘闻广华‘,‘数学‘,‘男‘,‘1979-5-10‘)
insert into jiaoshi values (5,‘张峰‘,‘英语‘,‘男‘,‘1984-5-10‘)
insert into jiaoshi values (6,‘李莉‘,‘英语‘,‘女‘,‘1986-7-7‘)
insert into xuesheng values (1,‘曹操‘,‘1班‘,‘男‘,1,3,5)
insert into xuesheng values (2,‘曹丕‘,‘1班‘,‘男‘,1,3,5)
insert into xuesheng values (3,‘司马懿‘,‘1班‘,‘男‘,1,3,5)
insert into xuesheng values (4,‘大乔‘,‘1班‘,‘女‘,1,3,5)
insert into xuesheng values (5,‘小乔‘,‘1班‘,‘女‘,1,3,5)
insert into xuesheng values (6,‘张飞‘,‘2班‘,‘男‘,2,4,6)
insert into xuesheng values (7,‘关羽‘,‘2班‘,‘男‘,2,4,6)
insert into xuesheng values (8,‘刘备‘,‘2班‘,‘男‘,2,4,6)
insert into xuesheng values (9,‘诸葛‘,‘2班‘,‘男‘,2,4,6)
insert into xuesheng values (10,‘貂蝉‘,‘2班‘,‘女‘,2,4,6)
insert into fenshu values (1,80,80,58)
insert into fenshu values (2,65,35,80)
insert into fenshu values (3,78,42,80)
insert into fenshu values (4,85,80,15)
insert into fenshu values (5,80,87,80)
insert into fenshu values (6,86,80,76)
--update fenshu set yuwen=16,shuxue=53,yingyu=46 where xuhao=6
insert into fenshu values (7,28,82,80)
insert into fenshu values (8,45,72,68)
insert into fenshu values (9,99,99,10)
insert into fenshu values (10,87,88,36)
use shujuku03

-------------------变量--------------------
--主要作用是 临时存储数据,以方便进行多个嵌套的查询等操作
--定义变量
--declare 变量名(必须以@开头) 数据类型
declare @ab varchar(20)
--赋值
set @ab=‘你好‘
--取值
select @ab
---以上三行需要一块执行,
declare @abc varchar(20) set @abc=‘你好‘ select @abc
--赋值 也可以结合查询语句来用:
declare @df varchar(20)
set @df=‘语文‘
select *from jiaoshi where kecheng=@df
--一般都需要加上 where 条件使用
--下面的过程只是给变量赋值的过程并不显示。
declare @df varchar(20)
set @df=‘语文‘
select @df=name from jiaoshi where code=1
--------------全局变量,系统变量--------------
--select print 都可使用
--返回SQLserver自上次启动以来的连接数,不管成功失败
print @@connections
select @@CONNECTIONS
--返回上一次执行SQL的语句中的错误,返回0表示没有错误
select @@ERROR
--返回当前用的是什么语言
print @@language
--受上一句命令影响的行数
print @@rowcount--默认返回int型,可以转化数据类型。用cast
select ‘影响了‘+CAST(@@ROWCOUNT as varchar(20))+‘行‘
--返回SQL的版本信息
print @@version
--转义字符,单引号‘
declare @zy varchar(20)
set @zy=‘123‘‘4560‘
print @zy
------------------运算符---------------
--+-*/%(取余数) 赋值运算符
declare @jia int
set @jia=1+2
set @jia=30%7--30除7取余数
print @jia
--比较运算符
--=,<,>,<=,>=,<>,!=,!>,!<
--<>,!=  不等于
select *from jiaoshi where code<>3
--逻辑运算符
--and,or,all,any,between,in,like,not,some,exists
--all 全部的条件满足。any,some满足任何一个条件
--not非,like像,exists存在
select *from xuesheng
--all 表示满足子查询中所有的条件,配合比较运算符使用
select *from xuesheng where Cnjs=all(select Cnjs from xuesheng where Cnjs=1and Majs=3)
--any 表示满足子查询中任何一个条件,配合比较运算符使用

--not 可以结合 in like exists 使用,表示不在某个范围,不像某个值,不存在。not不可单独使用

--查询 二班学生数学成绩大于所有一班学生成绩的人的信息
select *from xuesheng where (banji=‘2班‘ and xuehao in(
select xuhao from fenshu where shuxue>(
select MAX(shuxue) from fenshu where xuhao in(
select xuehao from xuesheng where banji=‘1班‘)))

---------一元运算符
--正号(+),负号(-),负号使用时需要加括号,否则当做减号用

-----------------优先级-----------------------
--  *,/,%
-- 正负,+,-
-- =,<,>,<=,>=,<>,!=,!>,!<
-- not
-- and,or,between
-- all,any,some,in,like,exists
-- =
------------------------------------
begin--开始
--中间可以写任何语句块
select *from jiaoshi
end--结束
-------------------------------
--if,else
declare @bian int
set @bian=10
if @bian>5
--当if..else中间跟随多个语句时 需要用 begin..end括起来
begin
    print ‘你好!‘
    print ‘你好啊!‘
end
else
    print ‘不好!‘
--练习  数学分数最高
select *from xuesheng where xuehao in (select xuhao from fenshu where shuxue=(select max(shuxue) from fenshu))

declare @shuxue decimal(18,2)
select @shuxue=MAX(shuxue) from fenshu
declare @xuehao int
select @xuehao=xuhao from fenshu where shuxue=@shuxue
declare @sex varchar(20)
select *from xuesheng where xuehao=@xuehao
if @sex=‘男‘
print ‘男同学‘
else
print ‘女同学‘
--------------------------------------
--wnile 循环 begin..end 相当于大括号,表示语句的开始和结束
declare @shu int
set @shu=85
while @shu<95
begin
    print ‘很好,‘+cast(@shu as varchar(10))
    set @shu=@shu+1
    if @shu=93
    break
    if @shu>87 and @shu<90
    begin
        continue
    end
    print ‘ 123‘
end
-------------------------------------
--try...catch
-------------------------------------------
--闻广华  教的班级中数学大于80的学生,如果超过3个则print达标,否则不达标
select *from jiaoshi
select xuhao from fenshu where shuxue>=80
select COUNT(*) from xuesheng where Majs=(select code from jiaoshi where name=‘毕华‘) and xuehao in (select xuhao from fenshu where shuxue>=80) group by banji
declare @n int
select @n=COUNT(*) from xuesheng where Majs=(select code from jiaoshi where name=‘闻广华‘) and xuehao in (select xuhao from fenshu where shuxue>=80)
if @n>3
    print ‘合格‘
else
    print ‘不合格‘
-----------------存储过程---------------
create procedure proc1
as
select *from xuesheng
go
--不管执行是否成功都会有一个返回值,返回0表示成功
--可编程性-存储过程-存储过程名-右键-执行存储过程
------------------------------------------
--执行命令,有返回值,但需要定义变量来接受
execute proc1
--定义变量接受返回值
declare @fanhui int
exec @fanhui=proc1
select @fanhui as 返回值
----------------------修改存储过程-----------------------------
alter proc proc1--alter(修改),proc(存储过程),proc1(存储过程名)
as
begin
declare @n int
select @n=COUNT(*) from xuesheng where Majs=(select code from jiaoshi where name=‘闻广华‘) and xuehao in (select xuhao from fenshu where shuxue>=80)
if @n>3
    print ‘合格‘
else
    print ‘不合格‘
end
go
exec proc1
----------------------带参数------------------------------
alter proc proc_js
@name varchar(20)
as
begin
    declare @jscount int,@kc varchar(20),@geshu int
    select @jscount=COUNT(*) from jiaoshi where name=@name
        if @jscount=0
    begin
        print ‘没有这个老师‘
    end
        else
    begin
        select @name=name,@kc=kecheng from jiaoshi where name=@name
            if @kc =‘数学‘
        begin
            select @geshu=count(*) from fenshu where xuhao in (
            select xuehao from xuesheng where Majs=(select code from jiaoshi where name=@name)
            ) and yuwen>=80
        end
            if @kc =‘语文‘
        begin
            select @geshu=count(*) from fenshu where xuhao in (
            select xuehao from xuesheng where Cnjs=(select code from jiaoshi where name=@name)
            ) and shuxue>=80
        end
            if @kc =‘英语‘
        begin
            select @geshu=count(*) from fenshu where xuhao in (
            select xuehao from xuesheng where Enjs=(select code from jiaoshi where name=@name)
            ) and yingyu>=80
        end
            if @geshu>=3
        begin
            print ‘达标‘
        end
            else
        begin
            print ‘不达标‘
        end
    end
end
exec proc_js ‘闻广华‘
--------输入学号,判断是否结业,只有1门课及格或更少\不结业  ,2门课及格/结业  ,3门课及格/结业并优秀

alter proc xs_jieye
@xuehao int
as
begin
    declare @yuwen int,@yingyu int,@shuxue int,@xh int,@ges int ,@name varchar(20)
    select @name=name from xuesheng where xuehao=@xuehao
    select @xh=MAX(xuehao) from xuesheng
    select @yuwen=COUNT(*) from fenshu where yuwen>60 and xuhao=@xuehao
    select @shuxue=COUNT(*) from fenshu where shuxue>60 and xuhao=@xuehao
    select @yingyu=COUNT(*) from fenshu where yingyu>60 and xuhao=@xuehao
    set @ges=@yuwen+@shuxue+@yingyu--课程一共有几门及格
        if @xh<@xuehao--判断输入是否正确
    begin
        print ‘没有学生信息‘
    end
        else
    begin
            if @ges=3
        begin
            print @name+‘同学‘
            print ‘恭喜你!成功结业了,而且成绩很优秀!‘
        end
            if @ges=2
        begin
            print @name+‘同学‘
            print ‘成绩合格可以结业了‘
                if @yuwen=0
            begin
            print ‘但是你的语文成绩不及格,需要多加复习!‘
            end
                if @shuxue=0
            begin
            print ‘但是你的数学成绩不及格,需要多加复习!‘
            end
                if @yingyu=0
            begin
            print ‘但是你的英语成绩不及格,需要多加复习!‘
            end
        end
            if @ges<=1
        begin
            print @name+‘同学‘
            print ‘不好意思,你的课程超过2门不及格,不能结业!‘
        end
    end
end
exec xs_jieye 10
select name,yuwen,shuxue,yingyu from xuesheng join fenshu on xuehao=xuhao
---------------------------------------------------------------
create proc xs_2
@xuehao int
as
begin
    declare @geshu int ,--主要变量,用来判断几门课及格
    @xue int ,--用来判断输入是否有误
    @name varchar(20),--用来接收学生姓名
    @yu int ,@shu int,@ying int--用来判断哪一门没有及格
    set @geshu=0--主要变量,需要赋值
    --以下是判断课程是否及格
        if (select yuwen from fenshu where xuhao=@xuehao)>=60
    begin
        set @geshu=@geshu+1
        set @yu=1--语文及格
    end
        if (select shuxue from fenshu where xuhao=@xuehao)>=60
    begin
        set @geshu=@geshu+1
        set @shu=1--数学及格
    end
        if (select yingyu from fenshu where xuhao=@xuehao)>=60
    begin
        set @geshu=@geshu+1
        set @ying=1--英语及格
    end
    select @xue=MAX(xuehao) from xuesheng--查询学号的最大值
    select @name=name from xuesheng where xuehao=@xuehao--查询学生的名字
        if @xue<@xuehao and @xuehao<=0--判断输入的学号是否有误
    begin
        print ‘没有学生信息‘
    end
        else
    begin
            if @geshu=3
        begin
            print @name+‘同学‘
            print ‘恭喜你!成功结业了,而且成绩很优秀!‘
        end
            if @geshu=2
        begin
            print @name+‘同学‘
            print ‘成绩合格可以结业了‘
                if @yu!=1
            begin
            print ‘但是你的语文成绩不及格,需要多加复习!‘
            end
                if @shu!=1
            begin
            print ‘但是你的数学成绩不及格,需要多加复习!‘
            end
                if @ying!=1
            begin
            print ‘但是你的英语成绩不及格,需要多加复习!‘
            end
        end
            if @geshu<=1
        begin
            print @name+‘同学‘
            print ‘不好意思,你的课程超过2门不及格,不能结业!‘
        end
    end
end
exec xs_2 10
-----------------------使用return返回值得存储过程--------------------------------
create proc xs_3
@xuehao int
as
begin
    declare @geshu int --主要变量,用来判断几门课及格
    set @geshu=0--主要变量,需要赋值
    --以下是判断课程是否及格
        if (select yuwen from fenshu where xuhao=@xuehao)>=60 set @geshu=@geshu+1
        if (select shuxue from fenshu where xuhao=@xuehao)>=60 set @geshu=@geshu+1
        if (select yingyu from fenshu where xuhao=@xuehao)>=60 set @geshu=@geshu+1
    return @geshu
end
--定义变量接收执行的存储过程的返回值
declare @zhi int
exec @zhi=xs_3 10
print @zhi
--可以设默认值,   (default)
create proc cun01
@sum int=10
as
begin
    set @sum=@sum+8
    return @sum
end

declare @zhi1 int
exec @zhi1=cun01 default--(没有参数,使用默认值)
print @zhi1
-----------------------1-n的和--------------------------
drop proc he
create proc he
@sum int
as
begin
    declare @shu int =0,@i int =0
        while @i<=@sum
    begin
        set @shu=@i+@shu
        set @i=1+@i
    end
    return @shu
end
go
declare @he11 int
exec @he11=he 10
print @he11
时间: 2024-08-10 01:42:33

20171107--SQL变量,运算符,存储过程的相关文章

SQL专题之------------存储过程

今天来讲解一下sqlserver的存储过程,我一般习惯先从一个最简单的例子开始,然后再介绍他的语法,最后会举出一些常用和典型的存储过程 1.先看一个简单地例子,形成一个印象 假设有这样一张表People 我要写一个登录的存储过程,我们先来看看验证登录的sql语句,非常简单select count(*) from People where userName='xxxx' and password='xxxx',如果返回结果大于1,就证明用户存在,否则用户不存在 下面这个就是登录的存储过程 1 Cr

SQL Server中存储过程 比 直接运行SQL语句慢的原因

问题是存储过程的Parameter sniffing 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1. 存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2. 经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete时),可将此复杂操作用

SQL Server创建存储过程(转载)

什么是存储过程? q       存储过程(procedure)类似于C语言中的函数 q       用来执行管理任务或应用复杂的业务规则 q       存储过程可以带参数,也可以返回结果 q       存储过程可以包含数据操纵语句.变量.逻辑 控制语句等 存储过程的优点 (1)执行速度快. 存储过程创建是就已经通过语法检查和性能优化,在执行时无需每次编译. 存储在数据库服务器,性能高. (2)允许模块化设计. 只需创建存储过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次.存储

SQL Server中存储过程比直接运行SQL语句慢的原因

原文:SQL Server中存储过程比直接运行SQL语句慢的原因 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1.       存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2.       经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query

Oracle实践--PL/SQL基础之存储过程

PL/SQL基础之存储过程 存储过程:过程是用于完成特定任务的子程序(代码的集合) /* 子程序的优点:1.模块化,将程序分解为逻辑模块: 2.可重用性,可以被任意数目的程序调用: 3,可维护性,简化维护操作: 4.安全性:通过设置权限,使数据更安全 */ --存储过程1,打印HelloWorld create or replace procedure my_pro is --用于声明一些变量 v_string varchar2(20) :='helloworld!'; begin dbms_o

变量,存储过程,触发器,事务-索引等

--SELECT TOP 3 Name,Age,Gender FROM View_Student WHERE GROUP having ORDER BY id DESC ----在最终生成用户想要的数据之后,才进行排序,如果不得不排序,那么就尽可能吧消耗减到最小 --ALTER VIEW View_Student --AS --SELECT * FROM dbo.Student DECLARE @num INT --赋值,取值 --赋值两种方式:set select SET @num=100 S

SQL SERVER 系统存储过程

Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储过程在创建时即在数据库服务器上进

sql Sever的存储过程如何转换为mysql

总体来说,sql sever和Mysql的存储过程的思路都是一样的,但是在语法和结构上还是有很大的区别的.1. 在mysql中写存储过程所有的dbo都要去掉.2. 在sql sever中查询分析器直接用create PROCEDURE就可以,但是在mysql中必须用DELIMITER$$来开头,因为在mysql中认定“:”为结束符号,所以我们必须要改变结束符号, $$的意思就是在后续的运行过程中如果碰到$$,那么就 可以认定程序结束了,在最后的end 后面加上$$ 就可以了!DELIMITER$

sql Sever的存储过程转换为mysql的

总体来说,sql sever和Mysql的存储过程的思路都是一样的,但是在语法和结构上还是有很大的区别的.1. 在mysql中写存储过程所有的dbo都要去掉.2. 每一个sql语句后面都需要加上:否则报错:4. 再说参数,在MSSQL中我们一般会这么定义参数 CREATE PROCEDURE PROC_ST (@operator varchar(300), @ProcDate datetime, @ErrorLog varchar(8000) OUTPUT) 但是在mysql中这种格式是不可以的

SQL Server 的存储过程

Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储过程在创建时即在数据库服务器上进