前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql declare 语法_sql_declare等语法 | 学步园[通俗易懂]

mysql declare 语法_sql_declare等语法 | 学步园[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-24 11:04:25
3.4K0
发布2022-09-24 11:04:25
举报

大家好,又见面了,我是你们的朋友全栈君。

===sqlserver:—sql declare

–简单赋值

declare @a int

set @a=5

select @a

–使用select语句赋值

declare @user1 nvarchar(50)

select @user1=’张三’

select @user1

declare @user2 nvarchar(50)

select @user2 = Name from ST_User where ID=1

select @user2

—表变量

declare @t table

(

id int not null,

msg nvarchar(50) null

)

insert into @t values(1,’1′)

insert into @t values(2,’2′)

select * from @t

—select,set赋值的区别

http://www.xuebuyuan.com/37583.html

{

示例:

DECLARE @Variable1 AS int, @Variable2 AS int

/* 使用 SELECT */

SELECT @Variable1 = 1

/* 使用 SET */

SET @Variable2 = 2

select f1 into v1 from tab1

select f1,f2,f3 into v1,v2,v3 from tab1

说明:

1.SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值

SELECT @VAR1=’Y’,@VAR2=’N’

SET @VAR1=’Y’;SET @VAR2=’N’;

2.表达式返回多个值时,用SET将会出错,而SELECT将取最后一个值,如下:

SELECT @VAR1 = IsRight FROM Permission –将取最后一个值

SET @VAR1 = IsRight FROM Permission –将报错

3.表达式无返回值时,用SET将置变量值为NULL,用SELECT交保持变量值

SET @VAR1 = ‘初始值’

SELECT @VAR1 = IsRight FROM Permission –此时@VAR1为’初始值’

SET @VAR1 = (SELECT IsRight FROM Permission) –此时@VAR1为NULL

4.使用标量子查询时,如果无返回值,SET和SELECT一样,都将置为NULL,

SET @VAR1 = ‘初始值’

SELECT @VAR1 =(SELECT IsRight FROM Permission ) –此时@VAR1为NULL

SET @VAR1 = ( SELECT IsRight FROM Permission) –此时@VAR1为NULL

}

—sql exec执行语句

—区块sql

区块定义,常用

begin

……

end;

也可以给区块起别名,如:

lable:begin

………..

end lable;

可以用leave lable;跳出区块,执行区块以后的代码

局部变量的作用范围在它被声明的BEGIN … END块内

select newid() 随机选择记录

Print 向客户端返回用户信息

—sqlserver identity(int,1,1)

括号里面表示的意思是int类型,起始值为1,每次增量为1。

CREATE TABLE tb3(id int ,col int)

INSERT INTO tb3(col) VALUES(10)

INSERT INTO tb3(col) VALUES(20)

SELECT IDENTITY(int,100,2) as aid,* into #T3 FROM tb3

select * from #T3

CREATE TABLE tb1(id int IDENTITY(10,1),col int)

INSERT INTO tb1(col) VALUES(10)

INSERT INTO tb1(col) VALUES(20)

SELECT * FROM tb1

—sqlser

select GETDATE() 获取当前日期时间

–将test_no_cx中的记录批量插入到test_has_cx中

insert test_has_cx select * from test_no_cx

—sqlserver

create table Topics

(

topicID int identity primary key,

topicName varchar(50)

)

insert into Topics (topicName)

select ‘耐克’ union

select ‘彪马’ union

select ‘李宁’ union

select ‘安踏’ union

select ‘特步’ union

select ‘361°’

用一个表中的数据来更新另一个表中的数据:

(注意区分这里面涉及到了有3个表)

UPDATE titles –表1

SET titles.ytd_sales = t.ytd_sales + s.qty

FROM titles t, sales s –表2、表3

WHERE t.title_id = s.title_id

AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

(ERROR:该语句无效,因为区分错了表)

UPDATE titles

SET t.ytd_sales = t.ytd_sales + s.qty

FROM titles t, sales s

WHERE t.title_id = s.title_id

AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

@@ERROR : 返回最后执行的Transact-SQL语句的错误代码。没有错误则为零。

@@ROWCOUNT : 返回受上一语句影响的行数,任何不返回行的语句将这一变量设置为0。

SQL中@@ROWCOUNT函数:返回受上一语句影响的行数。

@ERROR,当前一个语句遇到错误,则返回错误号,否则返回0。

在每一条语句执行后都将被重置,如果将来使用需要将变量保存到局部变量中。

update SNS_TopicData set TopicCount=TopicCount+1 where Topic =’1′

if @@rowcount>0

begin

print ‘成功’

end

else

begin

print ‘失败’

end

===mysql:—mysql delimiter

delimiter

— 切换成以

为批处理结束符

delimiter ; — 切换成以;为批处理结束符

注意:

1.delimiter — 告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了

2.delimiter $$后面不需要加分号.

3.定义delimiter

后,就表示批处理解释执行的标识符是

,但是里面的语句还是不能漏掉分号,如一般的sql语句后面要加分号,end if等语句后面要加分号,declare语句后面要加分号…

—mysql DECLARE:

1.在外部不需定义,可直接引用@n.如: SET @a=1; SELECT @a;

2.在存储过程内部定义时不带@符号,如declare n int;

3.如果mysql直接在查询器中执行DECLARE @n INT;是会报错的,一个是因为不需要带@符号,另一个是declare语句不能直接在外部使用,可以放在存储过程中使用

—mysql数据库锁定机制:

MySQL各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表级锁定。

—limit 1

http://www.jb51.net/article/35774.htm

LIMIT 1适用于查询结果为1条(也可能为0)会导致全表扫描的的SQL语句。

前提是所查询的列不是索引列,如果查询的是索引列(包括主键查询)就不需要limit 1。

示例:

create table t_user(

id int primary key auto_increment,

email varchar(255),

password varchar(255)

);

SELECT * FROM t_user WHERE email=? LIMIT 1;

—mysql编码

http://www.cnblogs.com/zzwlovegfj/archive/2012/06/25/2560649.html

— mysql存储引擎

http://www.cnblogs.com/zzwlovegfj/archive/2012/07/11/2586929.html

===sql:

—TRUNCATE TABLE

(deletes only the data inside the table)

删除表中的所有行数据,但不会删除表定义

truncate table #Tmp –清空临时表的所有数据和约束

http://www.cnblogs.com/stublue/archive/2011/02/18/1958033.html

—主键关联与外键关联

主键关联是指的一个表的主键和另外一个表的主键关联

外键关联是指的一个表的主键和另外一个表的非主键关联

{

主键关联:

person_t:

person_id

address_id

address_t

address_id

address_name

他们通过 address_id 关联是外键关联

person_t:

person_id

persion_name

address_t

person_id

address_name

他们通过person_id 关联就是主键关联。

}

—分组查询

{

http://www.cnblogs.com/gaiyang/archive/2011/04/01/2002452.html

例如,有如下数据库表:

A B

1 abc

1 bcd

1 asdfg

如果有如下查询语句(该语句是错误的)

select A,B from table group by A

该查询语句的意图是想得到如下结果(当然只是一相情愿)

A B

1 abc

bcd

asdfg

右边3条如何变成一条,所以需要用到聚合函数,如下(下面是正确的写法):

select A,count(B) as 数量 from table group by A

这样的结果就是

A 数量

1 3

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组

SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2

group by xxx having count(*)>1

}

—全文索引

http://www.cnblogs.com/ericwen/archive/2008/09/04/1283998.html

在数据库中快速搜索数据,使用索引可以提高搜索速度,然而索引一般是建立在数字型或长度比较短的文本型字段上的,比如说编号、姓名等字段,如果建立在长度比较长的文本型字段上,更新索引将会花销很多的时间。如在文章内容字段里用like语句搜索一个关键字,当数据表里的内容很多时,这个时间可能会让人难以忍受。

在SQL Server中提供了一种名为全文索引的技术,可以大大提高从长字符串里搜索数据的速度,在本章里,将会对全文索引进行详细的介绍。

—全表扫描

—删除重复,只保留一条数据,没有主键{

SqlServer:

create table t_repeat(

age int,

remark varchar(20)

)

insert into t_repeat values(1,’aaa’),(1,’aaa’),(1,’aaa’),(1,’aaa’),(1,’aaa’),(1,’aaa’),(1,’aaa’)

1.先把数据表的去除重复的数据放到临时表中

SELECT DISTINCT * into #Temp from t_repeat

select * from #Temp

2.把数据表里的数据清空

truncate table t_repeat

3.把临时表里的数据插入到数据表里

insert into t_repeat select * from #Temp

4.删除临时表

drop table #Temp

———–

select distinct * into #t from tablename

truncate table tablename

select * into tablename from #t

}

{

删除重复数据

http://www.cnblogs.com/moss_tan_jun/archive/2011/07/29/2121167.html

2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

select identity(int,1,1) as autoID, * into #Tmp from tableName

select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID

select * from #Tmp where autoID in(select autoID from #tmp2)

最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

}

{

select * from tablename where id in (

select id from tablename

group by id

having count(id) > 1

)

}

—查询优化:

http://www.cnblogs.com/moss_tan_jun/archive/2011/04/26/2029886.html

http://www.cnblogs.com/moss_tan_jun/archive/2011/04/23/2025988.html(good)

http://www.cnblogs.com/moss_tan_jun/archive/2011/02/10/1950852.html

http://www.cnblogs.com/moss_tan_jun/archive/2011/02/10/1950848.html

http://www.cnblogs.com/mybluesky99/archive/2011/04/19/2020829.html

http://www.cnblogs.com/mybluesky99/archive/2011/04/19/2020848.html

—sql例子:

http://www.cnblogs.com/moss_tan_jun/archive/2011/04/23/2025986.html(自定义函数、游标)

http://www.cnblogs.com/moss_tan_jun/archive/2011/04/23/2025945.html(from子查询)

http://www.cnblogs.com/moss_tan_jun/archive/2011/01/15/1936182.html (游标、临时表)

===PL/SQL

PL/SQL(Procedure Language/Structuer Query Language)是Oracle对标准SQL规范的扩展,全面支持SQL的数据操作、事务控制等。PL/SQL完全支持SQL数据类型,减少了在应用程序和数据库之间转换数据的操作。

构成PL/SQL程序的基本单位是程序块。程序块由过程、函数和无名块3种形式组成,它们之间可以互相嵌套。

PL/SQL的运行工具有:SQL*Plus、PL/SQL developer

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171259.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档