MSSQL种种写法的频率难点

(2)赋值时:SELECT @a=NaaSET
@a=Naa_________________________________上边二种办法,哪一类办法效能高?

图片 1图片 2代码

sqlserver字符串拆分(splitState of Qatar方法汇总

 转载

–方法0:动态SQL法 declare @s varchar(100),@sql varchar(1000)
set @s=’1,2,3,4,5,6,7,8,9,10′
set @sql=’select col=”’+ replace(@s,’,’,”’ union all select
”’)+””
PRINT @sql
exec (@sql)

 

if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[f_splitSTR]’) and xtype in (N’FN’, N’IF’,
N’TF’))
drop function [dbo].[f_splitSTR]
GO
–方法1:循环截取法 CREATE FUNCTION f_splitSTR(
@s   varchar(8000State of Qatar,   –待分拆的字符串
@split varchar(10卡塔尔(قطر‎     –数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
 DECLARE @splitlen int
 SET @splitlen=LEN(@split+’a’)-2
 WHILE CHARINDEX(@split,@s)>0
 BEGIN
  INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
  SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,”)
 END
 INSERT @re VALUES(@s)
 RETURN
END
GO

 

if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[f_splitSTR]’) and xtype in (N’FN’, N’IF’,
N’TF’))
drop function [dbo].[f_splitSTR]
GO
–方法2:使用一时性分拆扶植表法
CREATE FUNCTION f_splitSTR(
@s   varchar(8000卡塔尔(قطر‎,  –待分拆的字符串
@split varchar(10卡塔尔(قطر‎     –数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
 –成立分拆处理的帮助表(客户定义函数中只可以操作表变量State of Qatar
 DECLARE @t TABLE(ID int IDENTITY,b bit)
 INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b

 INSERT @re SELECT SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)
 FROM @t
 WHERE ID<=LEN(@s+’a’)
  AND CHARINDEX(@split,@split+@s,ID)=ID
 RETURN
END
GO

 

if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[f_splitSTR]’) and xtype in (N’FN’, N’IF’,
N’TF’))
drop function [dbo].[f_splitSTR]
GO
if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[tb_splitSTR]’) and
objectproperty(id,N’IsUserTable’)=1)
drop table [dbo].[tb_splitSTR]
GO
–方法3:使用永世性分拆帮衬表法 –字符串分拆帮忙表
SELECT TOP 8000 ID=IDENTITY(int,1,1) INTO dbo.tb_splitSTR
FROM syscolumns a,syscolumns b
GO
–字符串分拆管理函数
CREATE FUNCTION f_splitSTR(
@s     varchar(8000卡塔尔国,  –待分拆的字符串
@split  varchar(10State of Qatar     –数据分隔符
)RETURNS TABLE
AS
RETURN(
 SELECT col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) as
varchar(100))
 FROM tb_splitSTR
 WHERE ID<=LEN(@s+’a’)
  AND CHARINDEX(@split,@split+@s,ID)=ID)
GO

 

–方法4:利用sql server2005的OUTER APPLY

CREATE FUNCTION [dbo].[ufn_SplitStringToTable]
(
  @str VARCHAR(MAX) ,
  @split VARCHAR(10)
)
RETURNS TABLE
    AS
RETURN
    ( SELECT    B.id
      FROM      ( SELECT    [value] = CONVERT(XML , ‘<v>’ +
REPLACE(@str , @split , ‘</v><v>’)
                            + ‘</v>’)
                ) A
      OUTER APPLY ( SELECT  id = N.v.value(‘.’ , ‘varchar(100)’)
                    FROM    A.[value].nodes(‘/v’) N ( v )
                  ) B
    )

 

备注表达:

方式4必得在sql server2006下才足以运维

Mysql数据库笔记,mysql数据库

出错记录:
1、mysql服务运转不了,进度意外终止 1067
   错误展现:can not connect to mysql server on local hosts(1061卡塔尔国
   消逝措施:原本是自己傻逼把原先的MySQL数据库给删掉了

2、服务已经起步,不过输入密码时 进不去
不当呈现:E奥迪Q3RO翼虎 1045 <28000>:Access denied for user’root’@’locahost'<using password:YES>
化解方法:

3、

暗中认可端口号:3306

把mysql的bin目录增添到情状变量中就足以在自由目录下都得以打开bin目录了。

事情发生此前见到的[email protected]那么些是因为外人改了提示符:
mysql>prompt \[email protected] \h \d>
\u表示近来客商 \h表示服务器名称 \d表示这段日子数据库

MySQL语句标准:

最重要字和函数名称全体大写;
数据库名称、表的称呼、字段的称呼全体大写;
SQL语句必需以分好结尾。

加中括号表示可以总结  
体现当前版本;
mysql>SELECT VERSION();
来安妥前时刻;
mysql>SELECT NOW();
显示当前客商;
mysql>SELECT USER();

纠正原始密码:

开荒命令提醒符分界面, 实践命令: mysqladmin -u root -p password 新密码
实践后提示输入旧密码达成密码改善, 当旧密码为空时直接按回车键确认就可以。

开始:

//成立数据库:
MySQL>CREATE DATABASE (IF NOT EXISTS卡塔尔(قطر‎ case;
//彰显已经存在的数据库;
MySQL>SH0W DATABASES;
//重命名数据库名称
先关闭数据库,然后找到文件夹所在目录,改良文件夹名称。
//显示有些数据库;
MySQL>SHOW CREATE DATABASE case;

//校勘数据库编码为utf8;
MySQL>ALTER DATABASE case CHATACTER SET=utf8;

//删除数据库:
MySQL>DROP DATABASE case;

修改和删除

改革暗中认可值: ALTELacrosse TABLE TB_NAME ALTER 字段名 SET DEFAULT 默认值; ALTER
TABLE TB_NAME ALTER 字段名 DROP DEFAULT ;
改良表名
ALTER TABLE 表名 RENAME TO 新名;
改正字段名
ALTE本田CR-V TABLE 表名 CHANGE 旧字段 新字段 新字段数据类型
改正字段数据类型
ALTE奥迪Q3 表名 MODIFY 属性名 数据类型
充实字段
ALTER TABLE 表名 ADD 字段1 字段1的条件 [FIRST | AFTER 字段2];
去除字段
ALTER TABLE 表名 DROP 字段;
改善字段的排列地点:
ALTEEnclave TABLE 表名 MODIFY 字段1 字段1数据类型 FI凯雷德ST|AFTE讴歌MDX 字段2;
改善表的存放引擎:
ALTER TABLE 表名 ENGINE=引擎名
充裕主键约束: ALTESportage TABLE 表名 ADD P福睿斯IMATiguanY KEY (外键名卡塔尔(قطر‎ 删除却键节制:
ALTE科雷傲 TABLE 表名 DROP FOREIGN KEY (外键别称State of Qatar 改过数据表的名称:
ALTER  TABLE table_name RENAME TO new_table_name
去除记录:
delete from users where id=1;
改进记录:
update 表名 set 字段=新值 where 条件;
update users set id=1 whers sex=1;

表字段的改善:
扩张字段
ALTER table tb_name ADD column_name 属性 地方;        
  //扩张八个字段,默以为空
alter table user add COLUMN new2 VARCHARAV4(20卡塔尔(قطر‎ NOT NULL;  //扩张三个字段,暗许不可能为空
去除字段
alter table user DROP COLUMN new2;                //删除三个字段

alter table user DROP column1,column2;                        //删除多列

校正多少个字段
alter table user MODIFY new1 VARCHAPRADO(10卡塔尔;            //改过三个字段的花色
alter table user CHANGE new1 new4 int;              //改进三个字段的名目,那时候早晚要再度内定该字段的品类

第二章: 1、数据类型: 整型:
TINYINT -2^7->2^7-1
SMALLINT -2^15->2^15-1
MEDIUMINT -2^23->2^23-1
INT -2^31->2^31-1
BIGINT -2^63->2^63-1

浮点型:
FLOAT[(M,D)] m代表总位数,d代表小数点后位数
DOUBLE[(M,D)]

光阴日期型:(领悟State of Qatar
YEAR 1个字节
TIME 3
DATE 3
DATETIME 8
TIMESTAMP 4

字符型:
CHAR(M) 0<=M<=255
VARCHAR(M)
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
ENUM(‘value1,’value2’…)
SET(‘value1′,’value2’,,,)

2、数据表的操作
开垦数据库:
USE test(数据库名称)  
制造数据表:
CREATE TABLE (IF NOT EXISTS) table_name<数据表名字>(column_name<依照项目大小鲜明的列名>data_type<数据类型>,..卡塔尔

mysql>USE TEST;
>CREATE TABLE tb1(
>username VARCHAR(20),
>age TINYINT UNSIGNED,<unsigned意思是不用负数>
>salary FLOAT(8,2卡塔尔国 UNSIGNED <float(8,2State of Qatar的情趣是一齐有8位数,在那之中型Mini数点后有2位卡塔尔>
>);

查阅数据表列表
SHOW TABLES FROM test;

翻开数据表布局
SHOW COLUMNS FROM TB1;

插入记录INSERT
INSERT [INTO] tb1_name [(col_name,,,)] VALUES(val,,,)
INSERT TB1 (username ,salary) VALUES (‘tom’,26,919.3);
插入的也得以是算式举个例子:33-2 要么函数式:MD5(‘342’State of Qatar
也足以二遍插入多条记下,记录间用,分开就能够。

笔录查找SELECT
SELECT * FROM TB1_NAME

3、空值与非空

NULL 字段值可以为空  NOT NULL 字段防止为空

创造表,设定有些量空与非空
>CREATE TABLE TB2(
>username VARCHAR(20) NOT NULL,
>age TINYINT UNSIGNED NULL,
>);

>INSERT TB2 VALUES(NULL,20);
<将报错说username不可为空>

4、自动编号(AUTO_INCREMENT)不能用char类型

机动编号,且需与主键组合使用
暗许意况下,开始值为1,每一次的增量为1;

5、主键节制(PHavalIMA酷威Y KEYState of Qatar

每张数据表只存在多少个主键
主键保险记录的独一性
主键自动为not null

几个字段联合主键:
PRIMARY KEY(username,age);

>CREATE TABLE TB2(
>id SMALLINT UNSIGNED  PRIMARY KEY AUTO_INCREMENT,

AUTO_INCREMENT(自动依次增加State of Qatar必得和P纳瓦拉IMA奥德赛Y K奥迪Q3Y一齐使用,而PENVISIONIMA科雷傲Y KEY则不必然要和AUTO_INCREMENT一齐使用

>username VARCHAR(20) NOT NULL,
>);

>SHOW COLUMNS FROM TB3;

6、独一节制(UNIQUE KEY卡塔尔

唯一约束
独一节制可以确定保障记录的唯一性
独一约束的字段可感觉NULL
每张数据表能够存在多个独一约束
与主键的不一样:一张数据表只好有二个主键,而UNIQUE KEY能够有多少个能够NULL
>CREATE TABLE TB4(
>id SMALLINT UNSIGNED AUTO_INCREMENT P宝马X5IMAKugaY KEY,<自动编号字段>
>username VARCHAR(20) NOT NULL UNIQUE KEY,
>age TINYINT UNSIGNED
>);

插入记录:INSERT TB4(username,age卡塔尔国 VALUES(‘TOM’,23State of Qatar;
当再一次写入相通的笔录时,将唤起错误,因为username用了unique节制。简单的说那几个节制在多少表里能够有多个。

7、暗中同意约束(DEFAULT卡塔尔(قطر‎

默认值
当插入记录时,如果未有猛烈为字段赋值,则自动授予暗中认可值。
>CREATE TABLE TB5(
>id SAMLLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
>username VARCHAR(20) NOT NULL UNIQUE KEY,
>sex ENUM(‘1′,’2′,’3’) DEFAULT ‘3’
>);

验证:
INSERT TB5(username)VALUES(‘TOM’);
将发掘自动给sex赋值3了。

8、外键节制

要求:
表与表之间的链接
父表和子表必需选拔相同的贮存引擎(InnoDB卡塔尔(قطر‎,而禁绝接纳一时表:
外键列和参照列必需持有相识的数据类型。个中数字的尺寸或是不是有号子位必需一律;而字符     的长短则足以不一致
外键列和参照列必需成立索引。假如外键列不设有索引的话,MySQL将电动创造索引。

CREATE TABLE provinces(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL
);
查阅数据表的引擎:show create table provinces;
CREATE TABLE users(
id SMALLINT UNSIGNED PRIMARU KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL,
//增加省份的话能够不用增添字段,只要加上关系表省份的号子就能够
pid SMALLINT UNSIGNED, 
FOREIGN KEY(pid)REFERENCES provinces(id)
);

查看索引:SHOW INDEXES FROM provinces\G;
SHOW INDEXES FROM users\G;

外键约束的参数:

CASCADE:从父表删除或更新且自动删除或更新字表中非凡的行
SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL,即便选取该选项,必得保险子表列未有一点点名NOT NULL
TEST宝马X3ICT(约束、节制State of Qatar:圮相对父表的去除或更新操作
NO ACTION:规范的SQL的主要字,在MySQL中REST宝马X5ICT雷同。

为自动编号的字段赋值

能够挥洒成default 或许null
创建表:
CREATE TABLE users(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
password VARCHAR(32) NOT NULL DEFAULT 123,
age TINYINT UNSIGNED NOT NULL,
sex BOOLEAN
);
插入记录:
INSERT users VALUES(NULL,’Jack’,159357,20,1);

9、

图片 3

图片 4

出错记录:
1、mysql服务运行不了,进度意外终止1067
错误展现:cannotconnecttomysqlserveronlocalhosts(1061State of Qatar化解办法:…

(3卡塔尔国取前几条数据时set ROWCOUNT 2 select * from tb order by fdselect Top
2 * from tb order by
fd_________________________________上边二种艺术,哪个种类方式功效高?

SELECT PlanId,sK=count(CASE CallRecordId WHEN ‘K’ then CallRecordId end),
    sN=count(CASE CallRecordId WHEN ‘N’ then CallRecordId end),
    sNull=count( CASE isnull(CallRecordId,”) WHEN ” then ‘1’ end)
FROM Age_AssignedNum GROUP BY PlanId 

时不常能够蒙受这种景况:用分裂的SQL写法能够达到规定的标准同等的指标。爱钻牛角的人就想搞明白,诚然结果一致,但到底孰优孰劣?上边是本身列出的片段,请兄弟们请教。也请兄弟们将你们境遇的近乎难点一并列出。

图片 5图片 6代码

(1State of Qatar二回插入多条数据时:CREATE TABLE tb(ID int, 名称 NVARCHAPRADO(30State of Qatar, 备注
NVARCHA奥迪Q7(1000卡塔尔国卡塔尔(قطر‎INSERT tbSELECT 1,DDD,1UNIONALLSELECT
1,5100,DUNIONALLSELECT 1,5200,E

CREATE TABLE [tb] (Id INT ,postId INT )
INSERT INTO [tb] 
SELECT 2788 , 45753530 UNION ALL 
SELECT 6417 , 46862065 UNION ALL 
SELECT 61773 , 47407456 UNION ALL
SELECT 61773 , 47436468 UNION ALL
SELECT 61773 , 47448259 UNION ALL 
SELECT 61773 , 47474393 UNION ALL 
SELECT 83604 , 41671947 UNION ALL 
SELECT 83604 , 45858681 UNION ALL
select id, postid from ( select * ,cid = row_number() over (partition by id order by id) from tb ) as t
where t.cid <= 3

  1. 假若是单个赋值, 未有何样好比较的话.可是, 固然是为多个变量赋值,
    我测量检验过, SELECT 二回性赋值, 比用SET 各个赋值功能好.

  2. SET ROWCOUNT和TOP 是均等的, 包含进行的布署等都以相符的

  3. 这么些平时是exists快, 当然, 具体还要看你后边的子查询的原则,
    是还是不是会援用外层查询中的对象的列.exists检查到有值就赶回, 何况不回来结果集,
    count须要计算出具备满足条件的, 再回来叁个结果集, 所以经常意况下exists快.

  4. 应当是相像的

  5. 大致是相仿的

  6. except会去重新, not in
    不会(除非你在select中显式钦定卡塔尔except用于比较的列是装有列,
    除非写子查询约束列, not in 未有这种气象8.
    intersect是五个查询皆某些非重复值(交集卡塔尔,
    union是三个查询结果的兼具不重复值(并集State of Qatar

图片 7图片 8代码

也足以如此:CREATE TABLE tb1(ID int, 名称 NVARCHA库罗德(30卡塔尔(قطر‎, 备注
NVARCHAKuga(1000卡塔尔卡塔尔(قطر‎INSERT TB1 (ID,名称,备注卡塔尔(قطر‎VALUES(1,DDD,1卡塔尔INSERT TB1
(ID,名称,备注卡塔尔国VALUES(1,5100,D卡塔尔(قطر‎INSERT TB1
(ID,名称,备注State of QatarVALUES(1,5200,E卡塔尔_________________________________上边两种艺术,哪一类艺术功用高?

图片 9图片 10代码

(6卡塔尔(قطر‎从字符串中取子字符串时substring(abcdefg,1,3State of Qatarleft(abcderg,3State of Qatar_________________________________上面两种办法,哪一种办法功用高?

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图