sql常见函数:
字符函数:
length: 获取字节个数(utf-8一个汉字代表3个字节,gbk为2个字节)
concat: 拼接字符串
substr或者substring 截取字符串(具体怎么使用百度,从1开始)
instr 返回子串在字符串中第一次出现的索引(没有返回0)
trim 删除字符串前后空格(也可以自定义删除某个字符,百度)
upper 字符串转换成大写
lower 字符串转换成小写
lpad 用指定的字符实现左填充指定的长度
rpad 用指定的字符实现右填充指定的长度
replace 字符串替换
数学函数:
round 四舍五入
ceil 向上取整(返回>=该参数的最小整数)
floor 向下取整(返回<=该参数的最大整数)
truncate 截断,保存小数点后几位(用法百度)
mod(a,b) 取余(结果和a的正负号相同)
日期函数:
now 返回当前系统日期
curdate 返回当前系统日期,不包含时间
curtime 返回当前时间,不包含日期
year 返回当前时间,年
month 返回当前时间,月
monthname 返回当前时间,月份(英文)
day 返回当前时间,天
hour 返回当前时间,小时
minute 返回当前时间,分钟
second 返回当前时间,秒
(重要)str_to_date string类型转换成日期
(重要)date_format 日期转换为想要的string类型格式
____________________________________________________________________________
1.保留指定位数(2)的数字
- select
- Convert(decimal(18,2),数字);
2.获得当前时间向后推迟8个小时,转换成varchar,以111(2005/04/25)这种格式显示出来
- select
- convert(varchar(100),dateadd(hour,8,getdate()),111) 日期;
-
- 其他常用的格式:
- Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
-
- Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
-
- Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
-
- Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
-
- Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06
-
- Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06
-
- Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06
-
- Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
-
- Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
-
- Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
-
- Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06
-
- Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16
-
- Select CONVERT(varchar(100), GETDATE(), 12): 060516
-
- Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
-
- Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
-
- Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
-
- Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
-
- Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
-
- Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
-
- Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
-
- Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
-
- Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
-
- Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
-
- Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
-
- Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
-
- Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
-
- Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
-
- Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
-
- Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
-
- Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
-
- Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
-
- Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
-
- Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
-
- Select CONVERT(varchar(100), GETDATE(), 112): 20060516
-
- Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
-
- Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
-
- Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
-
- Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700
-
- Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827
-
- Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM
-
- Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM
3.CONVERT()函数,格式化日期
https://blog.csdn.net/desertworm/article/details/126086145
4.保留两位小数,多余的变成0
- select
- Round(12.321,2);
5. 5.1根据查询出来字段的值显示成自已想展示的数据:
- select
- case
- dateadd(hour,7,getdate())
- when getdate() then N'真的'
- when dateadd(hour,8,getdate()) then N'假的'
- when dateadd(hour,7,getdate()) then N'公的'
- when dateadd(hour,6,getdate()) then N'母的'
- end 我是列名字
5.2判断查询结果是否为空来显示自定义值
- select
- case
- when cpe.DTableFileName is null
- then N'未维护'
- else N'已维护'
- end DTableFileName
- from
- Cus_Product_Extend cpe
5.3某字段不为空是展示该字段值,为空时根据其他字段的值来选择展示某值
- select
- ISNULL(cpih.Shift,
- case
- when DATENAME(hh,cpih.StartedTime) BETWEEN 8 AND 20
- then N'白班'
- else N'夜班'
- end) Shift111
- from
- Cus_Production_Issue_Header cpih
6.查询出的结果进行拼接:
- SELECT
- t.ProductNo + '@' + t.ProductName key_,
- t.ProductNo + '@' + t.ProductName Value_
- FROM
- v_product t
- ORDER BY t.ProductNo;
7.MYSQL进行列和字符串的拼接(有结果为null的总体结果值不为null)
- select
- concat(列1,列2,列3...)
- from
- ...
8.MYSQL中插入’(单引号),用''''来插入
select '''' --结果为 ’
9.Mysql省略小数点后面没用的0
- select
- convert(float,10.0000);
10.计算周别、日期为一周的第几天、日期为周几?
- set datefirst 1 --设置周1为第一天
- select datepart(wk,convert(datetime,'2023-1-8')) --输出日期的周别
- select datepart(weekday,convert(datetime,'2023-1-7')) --输出日期为一周的第几天
- select datename(dw,convert(datetime,'2022-12-11')) --输出日期为周几
11.将行转换成列
- -- 建立一个全局临时表。临时表还是挺好用的哈,不用写入数据库中,可以用来学习且不用切换数据库
- CREATE TABLE ##TEST(
- project VARCHAR(10), -- 课程
- student VARCHAR(20), -- 学生
- score DECIMAL -- 成绩
- )
-
- INSERT INTO ##TEST VALUES(N'语文',N'小林',85)
- INSERT INTO ##TEST VALUES(N'语文',N'小龙',89)
- INSERT INTO ##TEST VALUES(N'语文',N'小龙',98)
- INSERT INTO ##TEST VALUES(N'数学',N'小林',95)
- INSERT INTO ##TEST VALUES(N'数学',N'小龙',90)
- INSERT INTO ##TEST VALUES(N'英语',N'小明',99)
- INSERT INTO ##TEST VALUES(N'英语',N'小林',97)
- INSERT INTO ##TEST VALUES(N'英语',N'小龙',98)
-
- SELECT * FROM ##TEST
-
- SELECT * FROM ##TEST
- AS p -- 将选中的字段作为原表,对应的t表就是新表。
- PIVOT(SUM(score) FOR project IN([语文],[数学],[英语])) AS t
-
- DROP TABLE ##TEST
12.将多行转换成一行,多行串联起来
- --stuff((select ';' + ep_name from ep_detail where ep_classes = a.ep_classes for xml path('')),1,1,'')
-
- 举例:
- select ep_classes, ep_name = (stuff((select ',' + ep_name from ep_detail where ep_classes =
- a.ep_classes for xml path('')),1,1,'')) from ep_detail a group by ep_classes
-
- create table ep_detail(
- ep_classes nvarchar(40),
- ep_name nvarchar(40)
- )
-
- insert into ep_detail(ep_classes,ep_name) values('1','11')
- insert into ep_detail(ep_classes,ep_name) values('1','12')
- insert into ep_detail(ep_classes,ep_name) values('2','22')
-
- select
- ep_classes,
- ep_name = (stuff((select ';' + ep_name from ep_detail where ep_classes = a.ep_classes for xml path('')),1,1,''))
- from
- ep_detail a
- group by ep_classes
13.关于使用order by排序出现“另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效”的解决办法
- --使用 top 99.99 Percent 可保留排序,
- --top 100 percent 不可保留排序
- select
- top 99.99 Percent
- --top 100 percent
- csssds.WeekDay ,--星期,
- cd.ShiftDate ,--日期,
- cssss.SetDescr ,--默认班次,
- cssss.ShiftIDs
- from
- Cus_Date2Period cd
- left join Cus_SHIFT_Shortcut_scheduling_Default_Set csssds ON datename(dw,convert(datetime,cd.ShiftDate)) = csssds.WeekDay
- left join Cus_SHIFT_Shortcut_scheduling_set cssss ON csssds.ShiftIDs = cssss.ShiftIDs
- where
- cd.YearCode = 2023
- and cd.WeekCode = N'w2'
- --{conn}
- order by cd.ShiftDate desc
-
-
14.sql截取字符串
- SELECT
- TOP 1 VALUE
- FROM
- STRING_SPLIT ( N'1@2@3@4@5@6', '@' )
-
- 结果:value
- 1
- -------------------------------------------------
- SELECT
- *
- FROM
- STRING_SPLIT ( N'1@2@3@4@5@6', '@' )
-
- 结果:value
- 1
- 2
- 3
- 4
- 5
- 6
15. 查询的结果中筛选掉另一个查询的结果
- SELECT
- ROW_NUMBER() OVER(ORDER BY t.EquipmentCoding) rn,
- t.Id,
- t.EquipmentCoding Equipment,
- t.EquipmentName ,
- t.UserDepartment Department,
- t.Productionline Position
- FROM
- v_Equipment_MasterDate t
- WHERE
- NOT EXISTS (SELECT * FROM Cus_ESD_InspectionPlan_GoodsDetail a WHERE a.InspectionPlanId = 29 AND a.GoodsNo = t.EquipmentCoding)
16.复杂的 update 语句怎么写?
- --1.先把想要修改的字段(作为表的字段1)和要改成的值(作为表的字段2)组成一张表(表tt)。
- --2.把要改的表和tt表链接起来查询一下验证是否正确。(如下sql所示)
- --3.把【select *】改成【update 表名 set 字段=值】就可以了。
- update aaa set aaa.ProductionIssueId = tt.ID
- from
- Cus_Equipment_RepairOrder aaa
- right join (
- select
- cer.ProductionIssueId,
- cpih.ID,
- cer.RepairOrderNo,
- cer.FaultDesc
- from
- Cus_Equipment_RepairOrder cer
- left join Cus_Production_Issue_Header cpih ON cer.FaultDesc = cpih.IssueDescription
- where
- cer.Active = 1
- and cpih.DataFrom is null
- and cer.RepairOrderNo != N'WX2302250002'
- and cpih.ID is not null
- ) tt ON aaa.RepairOrderNo = tt.RepairOrderNo
17.sql server 按照创建时间倒排的前提下让设备编号为SC开头的排在前面 怎么写?
在order by 下面用case when来自定义排序规则。列子:
- select
- top 99.99 Percent
- Row_Number() over(order by
- case
- when left(cem.EquipmentCoding,2) = N'SC' then 0
- else 9
- end ,
- cem.CreatedOn desc) as rowid, --序号
- ,cem.EquipmentCoding --设备编号
- ,cem.CreatedOn --创建时间
- from
- cus_equipment_MasterDate cem
- order by
- case
- when left(cem.EquipmentCoding,2) = N'SC' then 0
- else 9
- end,
- cem.CreatedOn desc
18.Sql Server表明前加#和##号是什么意思?
- //加#是创建一个本地临时表:
- // 只可在本地使用,当用户断开连接时没有除去零时表,sql server会帮忙自动清楚。
- //加##是创建一个全局临时表:
- // 所有连接上都能看到全局临时表,只要创建全局临时表 的连接断开,全局临时表即被除去。
19.Select into 和 Insert into 的用法和区别。
- select
- EquipmentCoding,CreatedOn
- into #Equipment20230509
- from cus_equipment_MasterDate
-
- --Select into 是将查询的结果复制到目标表里(表事先不存在,会创建一个新表)
-
- -----------------------------------------------------------------------
- -----------------------------------------------------------------------
-
- insert into #Equipment20230509
- select EquipmentCoding,CreatedOn from cus_equipment_MasterDate
-
- --insert into 是将查询的结果插入到目标表里(表实现要已存在)
20.Delete , truncate ,Drop 的用法和区别。
- --delete 可以逐行删除,删除可以增加where条件,可以回滚,自增id不会清零
- --truncate 只能删除表内所有数据,不能回滚,自增id清零
- --Drop 删除表
-
- 语法:delete from 表名;
-
- 语法:truncate table 表名;
-
- 语法:drop table 表名;
21.SQL Server 修改字段长度 阻止保存要求重新创建表的更改
- 1.需要选择SQL Server Management Studio 的 工具 -> 选项
- 2.点击选项后,在打开的界面里面选择 Designers -> 表设计器和数据库设计器
- 3.将阻止保存要求重新创建表的更改 前面的勾取消,点击确认即可解决问题了
- 4.确认成功后,即可以正常修改表字段的长度了
22.随机抽取N条数据
- select
- Top N
- *
- from
- [表]
- order by NEWID();
-
- -- order by NEWID()可以随机排序;
23.插入换行符
- //插入Char(13)来换行
-
- update cus_equipment_MasterDate
- set Remark = N'111'+CHAR(13)+'111'
- where
- EquipmentCoding = N'SC-SMT-00001'
24.两个字段值相加其中某个字段存在Null时怎么处理?
- select
- IsNull(Hours1,0)+Isnull(Hours2,0) SumHours
- from
- Table;
25.怎么实现4位数不足4位前面补0
select right(10000+10,4) Number
26.事务的使用
- begin TransAction --开始事务
- delete HSX_Department_Ext where Department = N'Test2024-03-27 23:04:25'
- delete HSX_Department_Ext where Department = N'Test2024-03-27 00:00:00'
-
- ROLLBACK TRANSACTION --回滚事务
- COMMIT TRANSACTION --提交事务
27.使用SQL Server链接远程服务器进行查询
select * from [AAA].[BBB].[dbo].[表名];
28.将值组合成一个表
SELECT value FROM STRING_SPLIT(N'A|B|C|D', '|')
29.表的创建和索引的创建
- --怎么创建表
- create table 表名 (
- ID int IDENTITY(1,1) PRIMARY KEY NOT NULL, --IDENTITY(1,1) 自增;PRIMARY KEY主键;NOT NULL 必填
- CustomerCode nvarchar(40) NOT NULL,
- PlantId nvarchar(64) ,
- PassRateTarget decimal(18,6) NOT NULL,
- ProgressStatus int NOT NULL
- );
-
- --创建一般索引(Index)
- CREATE INDEX 索引名
- ON 表名 (column1, column2, ...);
-
- --创建唯一索引(Unique Index)
- CREATE UNIQUE INDEX 索引名
- ON 表名 (column1, column2, ...);
30.SQL Server递归并增加递归深度
- WITH EmployeeHierarchy AS
- (
- -- 锚点成员:获取没有经理的员工(即公司的顶级领导)
- SELECT EmployeeID, Name, ManagerID, 1 AS Level
- FROM Employees
- WHERE ManagerID IS NULL
- UNION ALL
- -- 递归成员:根据经理与员工的关系,获取下一层级的员工,并增加层级数
- SELECT e.EmployeeID, e.Name, e.ManagerID, eh.Level + 1 AS Level
- FROM Employees e
- JOIN EmployeeHierarchy eh ON e.ManagerID = eh.EmployeeID
- )
- SELECT * FROM EmployeeHierarchy
- --设置最大递归深度
- --OPTION (MAXRECURSION 0)
———————————————————————————————————————————
1.给表添加字段
- alter table
- 表名
- add
- 字段名 数据类型
2.修改表的字段id为自增
- --先删除字段id
-
- 增加字段id并设置为自增
- alter table Cus_ESD_IncomingInspection add id int IDENTITY (1,1)
-
- 增加字段id并设置为自增主键
- alter table Cus_ESD_IncomingInspection add id int IDENTITY (1,1) PRIMARY KEY
3.sql server修改数据库表报错(不允许保存更改)
原因:
解决办法: