SQL学习2

* SqlServer相比MySQLMySQL不支持事务处理,没有视图,没有存储过程和触发器,没有数据库端的用户自定义函数,不能完全使用标准的SQL语法

* 所以在这里我使用 SQL Server 2014 Management Studio来完成一些SQL Server的工作





T-SQL 编码

1:局部变量和全局变量

* 全局变量由系统提供且预先声明,通过在变量名前面添加“@@”符号区别于局部变量。用户只能使用全局变量不能修改全局变量的值。全局变量的作用范围是整个SQL Server系统

* 局部变量由用户自己定义,通过在变量名前面添加“@”符号区别于全局变量

例1:声明一个变量@testDateTime,将getdate()函数的值放入变量中,最后输出变量@testDateTime的值

declare @testDateTime varchar(30)
select @testDateTime = getdate()
select @testDateTime as ‘当前时间‘
go

运行结果

例2:声明一个变量@getAge,将mytestuser表里面id是2的字段的age的值放入变量@getAge中,最后输出@getAge的值

declare @getAge int
select @getAge = age from mytestuser where id=2
select @getAge as ‘2号的年龄‘
go

运行结果

2:使用运算符

例1:将表达式67%31的值赋给变量@result

declare @result int
select @result = 67%31
select @result as ‘结果‘
go

运行结果

例2:定义变量x和y,给变量赋值,然后求两个变量的与、或、异或的结果

declare @x int, @y int
set @x = 2
set @y = 7
select @x & @y as ‘与‘,
       @x | @y as ‘或‘,
       @x ^ @y as ‘异或‘

运行结果

例3:定义变量x和y,给变量赋值,然后求两个变量中较小的一个

declare @x int, @y int
set @x = 12
set @y = 7
if @x < @y
select @x as ‘小数据‘
else
select @y as ‘小数据‘

运行结果

例4:使用连接运算符(+)将两个字符串连接起来

--需要注意的是变量x的长度,如果长度不够,就不能完整的显示数据
declare @x varchar(70)
set @x = ‘米诺八慈‘+‘的‘+‘博客园‘
select @x as ‘数据连接的结果‘

运行结果

3:case语句

例1:如果年龄小于20岁显示“少年”,如果年龄在20岁到30岁之间显示“青年”,如果年龄在30岁以上显示“中年”

/*需要注意的是
1:在case和字段之间是有逗号隔开的
2:在when then之间不能使用&&表示并且,所以可以将条件倒置,以避免出现age<30&&age>20
*/
select name,age,
case
when age>30 then ‘中年‘
when age>20 then ‘青年‘
when age<20 then ‘少年‘
end as level
from mytestuser

运行结果

4:while表示循环

例1:显示字符串“米诺八慈”中的每一个字符以及其ASCII码

declare @position int,@str varchar(10)
set @position = 1 --需要注意的是在SQL里面字符串的从1开始取值
set @str = ‘米诺八慈‘
while @position <=DATALENGTH(@str)--这里的长度是8
    begin
        select SUBSTRING(@str,@position,1),
        ascii(SUBSTRING(@str,@position,1))
        set @position =@position+1
    end

运行结果

5:result语句

result可以从查询或过程中无条件退出,可在任何时候从过程、批处理或语句块中退出,而不执行result之后的语句

例1:通过存储过程求用户平均年龄

--删除存储过程
drop procedure mypro

--创建存储过程
create procedure mypro @num int
as return(select avg(age) from mytestuser where id < @num)

--创建查询
declare @avg int ,@number int
set @number = 4
exec @avg = mypro @number --将变量num的值传入存储过程并将存储过程的结果赋给变量avg
select @avg as ‘平均年龄‘ 

以上SQL语句一个一个的执行,执行创建查询的结果





用户自定义函数

例1:创建一个函数用于显示出较大的年龄的用户信息

--删除函数
drop function showMax
--创建函数
create function showMax(@id1 int,@id2 int) returns  varchar(50)  --函数名
--函数体
as
  begin
      declare @result varchar(50),@name1 varchar(10),@name2 varchar(10),@age1 varchar(10),@age2 varchar(10)
      select @age1 = age,@name1 = name from mytestuser where id = @id1
      select @age2 = age,@name2 = name from mytestuser where id = @id2
      if (@age1<@age2)
            set @result = @name2 +‘的年龄是:‘+ @age2
      else
            set @result = @name1 +‘的年龄是:‘+ @age1
      return @result
  end
/*
需要注意的是:
1:在函数名里面声明了id1和id2,在函数体里面就不需要声明可以直接使用了
2:必须要用@age1 varchar(10),@age2 varchar(10)将int类型转换成varchar类型,以便与@name2 +‘的年龄是:‘相连
*/
--使用函数
select dbo.showMax(3,4) as maxMess

运行结果





游标

游标实际上就是一种能从包括多条数据记录的结果集中每次提取一条记录的机制

1:游标的类型

1:T-SQL游标

主要用于T-SQL脚本,存储过程和触发器。主要用在服务器上,由客户端发送给服务器的T-SQL语句或批处理、存储过程、触发器中的T-SQL进行管理。不支持提取数据块或多行数据

2:API游标

主要哦用在服务器上

3:客户游标

主要是当在客户机上缓存结果集时使用

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------由于T-SQL游标和API游标使用在服务器端上,也叫作服务器游标或后台游标。客户端游标又被称为前台游标

服务器游标包含:静态游标、动态游标、只进游标、键集驱动游标4种类型

2:游标的5种操作

声明游标 --> 打开游标 --> 读取游标 --> 关闭游标(如果不关闭游标,其他人就可以进入,非常危险) --> 释放游标

时间: 2024-08-26 09:52:12

SQL学习2的相关文章

Oracle之PL/SQL学习笔记

自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家批评指正. PL/SQL定义:PL/SQL是由Oracle开发,专门用于Oracle的程序设计语言. PL---Procedural Language. SQL—Structure QueryLanguage.PL/SQL包括过程化语句和SQL语句     PL/SQL的单位:块. 一个块中可以嵌套

SQL 学习日志01

查看一个数据库的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' (select * from 表名 where 条件) 查看一张表的表结构: sp_help table_name(表名)  获取的信息比较全 sp_columns table_name(表名) 创建数据库: use master go create database test01(数据库名) 删除数据

SQL 学习日志02

SQL数据类型 1.字符类型 char   --定长字符数据   如 char(12)  这字段就会占用12字节的空间,无论这个字段只填写了2个字节.一般在可确定这字段长度时选用,如sex字段(因只有男和女两项可选)就可用 char(2). varvhar   --可变长字符数据  如varchar(50) 这字段最大只能填写50字节,按实际填写的字节存储.一般在不确定这字段长度时使用,如 Smail字段(因邮箱的长度不确定) 就可用varchar(50). text    --用来存储大量非统

TERADATA SQL学习随笔&lt;一&gt;

最近在TERADATA环境学习SQL.在这里记录一下学习中查过的知识点,作为备案. 目录: 关于SQL学习及所用在线数据库 表联合 (join) SQL子查询 在select时创建新字段 (as, case when) 数据分组 (group by + 聚合函数count, sum, avg等) 利用over (partition by)进行数据分组并创建新字段 样本选择 1.关于SQL学习及所用在线数据库 之前有看过一些SQL学习的书.但如果从学习效率来说,跟着书学习SQL,不如直接看生产环境

SQL学习笔记:选取第N条记录

Northwind数据库,选取价格第二高的产品. 有两种方法,一个是用Row_Number()函数: SELECT productname FROM (SELECT TOP 2 productname, Row_Number() OVER (ORDER BY unitprice desc) AS rownum FROM Products) AS tbl WHERE rownum = 2; 另一种是对子语句的的结果再进行排序: SELECT top 1 productname FROM (SELE

SQL学习_查询重复数据和连接多个表数据的方法

进行数据库测试时需要根据不同场景查询数据,以便验证发现的问题是否为脏数据引起的.记录一下最近常用的查询方法: 1. 查询表中重复数据(id不同,多个字段值相同) select P1.* from project as P1, project as P2 where P1.id<>P2.id and P1.ProjectId=P2.ProjectId and P1.ServiceTypeId=P2.ServiceTypeId and P1.Rank=P2.Rank 2.连接多个表数据 selec

SQL 学习日志03

添加表内容: insert into table_name (字段1,字段2,...) values (值1,值2,....) 查询表内容: select * from table_name select 字段1,字段2 from table_name select top 10 * from table_name select * from table_name where 字段=值 select * from table_name where 字段<>值 select * from tab

PL/SQL学习

资料1 -- Created on 2014/8/20 declare -- Local variables here i integer; begin i := 12; -- Test statements here DBMS_OUTPUT.put_line(i); end; 资料2 declare cursor s is select * from city_app.city_server; s_ s%rowtype; begin open s; fetch s into s_; DBMS_

sql学习笔记1

参考: 1.<SQL学习指南> 2.慕课网,SQL学习基础 提纲: 第二章 创建和使用数据库 2.1 创建MYSQL数据库 2.2 使用mysql命令行工具 2.3 MySQL数据类型 2.3.1 字符型数据 2.3.2 数值型数据 2.3.3 时间数据 2.4 表的创建 2.4.1 第一步:设计 2.4.2 第二步:精华 2.4.3 第三步:构建SQL方案语句 2.5 操作和修改表 2.5.1 插入数据 2.5.2 更新数据 2.5.3 删除数据 2.6 导致错误的语句 2.6.1 主键不唯

sql学习笔记2

<SQL学习指南>第9章 子查询 参考:leetcode 2 ---------------------- 9.1 啥是子查询 9.2 子查询的类型 基于结果集的类型:单行/单列,单行/多列,多行/多列 完全独立的(非关联子查询).引用包含语句中的列(关联查询) 9.3 非关联子查询 前面讲的都是非关联的,可以的单独执行而不需要引用包含语句中的任何的内容.我们遇到的大多数的子查询都是这种类型,但是更新或者 删除语句会经常遇到关联子查询. 另外一个特点,前面的子查询除了是非关联的外,返回的都是一