格格不入 - T-SQL
type: channel
link: https://www.jbea.cn/tag/T-SQL/
items: T-SQL编程之数据的分组查询
items: T-SQL编程之数据的模糊查询
items: T-SQL编程之数据的查询基础
items: T-SQL编程之数据的增删改操作

T-SQL编程之数据的分组查询
type: item
date: 2023-10-09T09:24:00+08:00
description: 前言这篇文章主要是介绍数据库的基础查询相关操作，适合没有任何数据库操作基础的人员查阅。如果您有相关的数据库开发经验，那这篇文章将对您没有任何帮助。表连接分类联接查询分为内联接、外联接、交叉联接。内连接[scode type="green" size="small"]1️⃣ 最典型、最常用的连接查询2️⃣ 根据两张表中共同的列进行匹配3️⃣ 两个表存在主外键关系时，通常会使用内连接查询[/scode]演示案例表结构分析：图书信息表 [BookInfo]IdNamePriceAuthorCId1C#高级156克里斯琴•内格尔12SQL Server高级编程128美维埃拉13WinForm程序设计58王希斌14美术概论20艾苓2图书分类表 [BookCategory]CIdCategoryName1IT类2艺术类3科普类内连接语法：SELECT 列名 FROM 表名1 INNER JOIN 表名2 ON 表名1.列 = 表名2.列 --INNER可以省略，ON用来设置两个表之间的关联条件 ... WHERE 筛选条件 /* INNER JOIN 关键字后面是关联表，ON关键字后是表间联接字段的关系 */演示案例：SELECT B.Id, C.CategoryName, B.Name, B.Price, B.Author FROM BookInfo B INNER JOIN BookCategory C ON B.CId = C.CId -- 使用WHERE子句实现内连接[不推荐],下面代码执行后可以得到相同的执行结果 SELECT B.Id, C.CategoryName, B.Name, B.Price, B.Author FROM BookInfo B,BookCategory C WHERE B.CId = C.CId执行结果：IdNamePriceAuthorCategoryName1C#高级156克里斯琴•内格尔IT类2SQL Server高级编程128美维埃拉IT类3WinForm程序设计58王希斌IT类4美术概论20艾苓艺术类外连接[scode type="green" size="small"]特点：1️⃣ 外连接可以分为主表和从表2️⃣ 主表的数据会被完全显示出来3️⃣ 从表中只显示满足连接条件的数据4️⃣ 外连接结果一般会比主表和从表中数据量最小的表中的数据多分类：左外连接（LEFT JOIN）右外连接（RIGHT JOIN）完全连接（FULL JOIN）[/scode]演示案例表结构分析：用户信息表 [UserInfo]UserIdUserName1张三2李四3夏颖4李沁图书借阅记录表 [BorrowInfo]BIdUserIdBorrowDate112021-02-03212021-02-03322021-02-05432021-03-05内连接语法：SELECT 列名 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 表名1.列 = 表名2.列 --OUTER可以省略，ON用来设置两个表之间的关联条件,LEFT可以替换为:RIGHT \ FULL ... WHERE 筛选条件演示案例：-- 统计每位用户的借书情况并显示没有借阅过图书的用户 SELECT U.UserName,B.BorrowDate,B.BId FROM UserInfo U LEFT OUTER JOIN BorrowInfo B ON B.UserId = U.UserId查询结果：UserNameBIdBorrowDate张三12021-02-03张三22021-02-03李四32021-02-05夏颖42021-03-05李沁NULLNULL[scode type="blue" size="small"]主表（左表）UserInfo中的数据逐条匹配表BorrowInfo中的数据• 匹配，返回到结果集• 无匹配，NULL值返回到结果集💬 左外联接是以左表为基础的，左表的记录将会全部表示出来，而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL右外连接：右外连接的原理与左外连接相同右表逐条匹配记录，否则使用NULL填充完全连接：会从两个连接表中获取数据如果有对应关系，则会填上对应数据；否则，以NULL值填充[/scode]聚合函数概念：对一组值进行计算，并返回计算后的值，具有统计数据的作用函数名称说明注意SUM()返回表达式中所有值的和• 用于返回表达式中所有值的和• 只能用于数字列• 如果参与计算记录在该列上的值为空值（NULL），则此条记录在计算中将被忽略AVG()返回表达式的平均值• 用于返回表达式中所有数值的平均值• 该列值为空（NULL）的记录将被忽略MIN()返回表达式的最小值• 返回表达式中的…

T-SQL编程之数据的模糊查询
type: item
date: 2023-10-08T11:12:00+08:00
description: 前言这篇文章主要是介绍数据库的基础查询相关操作，适合没有任何数据库操作基础的人员查阅。如果您有相关的数据库开发经验，那这篇文章将对您没有任何帮助。概念模糊查询提取的数据不一定是确切的，查询者对查询条件也是模糊的、大概的、不特别明确的。本篇文章会使用：LIKE 、BETWEEN ... AND ... 、IN 三种查询方式。LIKE英文直译：相似；类似；像…一样案例分析：-- 查询出姓李且是名字是两个字的学员信息 SELECT * FROM Student WHERE Name LIKE '李_' /* 查询出来的数据有: * 李明、李阳、李芳、李伟、李霞、李婷、李峰、李梅、李雪、李霞等... */ -- 查询出姓李的学员信息(名字可以是多个字) SELECT * FROM Student WHERE Name LIKE '李%' /* 查询出来的数据有: * 李、李芳、李明霞、李春梅、李婷、李冬梅、李芳、李梅、李春霞等... */ -- 查询出名字中包含李的学员信息 SELECT * FROM Student WHERE Name LIKE '%李%' /* 查询出来的数据有: * 李、张李、李明霞、李春梅、王李婷、李冬梅、李芳、李梅、李春霞等... */LIKE在实际开发过程中使用频率极高，通常LIKE需要和统配符一同使用该运算符只用于字符串，因此仅与字符数据类型（如 char或 varchar等）联合使用通配符解释示例_一个任意字符A LIKE 'V_'，则符合条件的A如“VR”、“VC”等%任意长度的字符串(可以是0个、1个或多个)B LIKE 'SQL%'，则符合条件的A如“SQL Server”、“SQL Server高级编程”等[]括号中所指定范围内的一个字符C LIKE '900[1-2]'，则符合条件的C如“9001”或“9002”[^]不在括号中所指定范围内的任意一个字符D LIKE '900[^1-2]'，则符合条件的D如“9003”或“9007”等BETWEEN...AND...英文直译：介于…之间；在…之间案例分析：-- 查询出年龄在18岁到20岁之间的学员信息 SELECT * FROM Student WHERE Age BETWEEN 18 AND 20 -- 查询出年龄不在18岁到20岁之间的学员信息 SELECT * FROM Student WHERE Age NOT BETWEEN 18 AND 20[scode type="yellow" size="small"]⚠注意：该运算符用于查找介于两个已知值之间的一组未知值，可以是数字、文本或者日期初值要小于等于终值，如果终值小于初值，语句执行无错误，但是不会返回查询结果查找结果包含初值和终值[/scode]IN英文直译：在……里面， 在……之内案例分析：-- 查询出地址在'长沙'、'衡阳'、'深圳'和'怀化'的学员信息 SELECT * FROM Student WHERE [Address] IN ('长沙','衡阳','深圳','怀化') -- 查询出地址不在'长沙'、'衡阳'、'深圳'和'怀化'的学员信息 SELECT * FROM Student WHERE [Address] NOT IN ('长沙','衡阳','深圳','怀化')

T-SQL编程之数据的查询基础
type: item
date: 2023-09-25T11:27:00+08:00
description: 前言这篇文章主要是介绍数据库的基础查询相关操作，适合没有任何数据库操作基础的人员查阅。如果您有相关的数据库开发经验，那这篇文章将对您没有任何帮助。查询语法SELECT [TOP N [PERCENT]] <列名> FROM <表名> -- TOP N 表示取前面N条数据,PERCENT表示取前面N%的数据(百分百) [WHERE <查询条件表达式>] [GROUP BY <分组的列名> [HAVING <分组后的数据查询条件表达式>]] --HAVING表达式需要和分组一同使用 [ORDER BY <排序的列名> [ASC或DESC]] -- 默认排序为升序ASC --ORDER BY只能出现在查询语句的末尾 演示案例原始表结构查询所有列数据执行SQL语句： SELECT * FROM Student查询结果：查询部分列执行SQL语句：SELECT StudentNo,StudentName,Email,BornDate FROM Student执行结果：查询中使用别名执行SQL语句：SELECT S.StudentNo AS '学号', --使用AS关键字的形式 S.StudentName '学生姓名', --使用空格的形式 '邮箱' = S.Email, --使用等于("=")符号的形式 S.BornDate --可以使用表别名.列名的形式访问对应表的列 FROM Student S --表别名,在单表查询模式中不推荐使用,在多表连接查询中使用频率较高执行结果：SQL中的运算符算术运算符运算符说 明+加运算，求两个数或表达式相加的和。例如：SELECT 1+2，返回：3-减运算，求两个数或表达式相减的差。例如：SELECT 2-1,返回：1*乘运算，求两个数或表达式相乘的积。例如：SELECT 2*2，返回：4/除运算，求两个数或表达式相除的商。例如：SELECT 5/5，返回：1；SELECT 5.7/3，返回：1.900000%取模运算，求两个数或表达式相除的余数，例如：SELECT 5%3，返回：2演示案例：-- 为查询结果添加新列 “折扣后价格”，结合算术运算符实现图书价格8折计算 SELECT Name AS 图书名称, Price AS 价格, Author AS 作者, Price * 0.8 AS 折扣后价格 -- 实现图书价格8折计算 FROM BookInfo比较运算符运算符说 明=等于，例如：age=23>大于，例如：price>100<小于<>不等于>=大于等于<=小于等于!=不等于（非SQL-92标准 ）演示案例：SELECT Name AS 图书名称, Price AS 价格, Author AS 作者 FROM BookInfo WHERE Price < 100 -- 查询出图书价格低于100元的图书信息赋值运算符运算符说 明=把一个数或变量或表达式赋值给另一变量，如：Name='王华'逻辑运算符运算符说 明AND当且仅当两个布尔表达式都为true时，返回TRUEOR当且仅当两个布尔表达式都为false，返回FALSENOT对布尔表达式的值取反，优先级别最高IS NULL把某个值与NULL值进行比较，当表达式值为NULL时，返回TRUE演示案例：SELECT Name AS 图书名称, Price AS 价格, Author AS 作者 FROM BookInfo WHERE Name = 'C#高级' AND Author = '克里斯琴•内格尔' -- 多个查询条件查询语句中的排序使用ORDER BY子句对查询后的结果集按指定列进行排序,支持多列排序ASC升序（默认）DESC降序系统函数日期函数-用于操作日期值函数名称说明示例📌DATEADD将指定的数值添加到指定的日期部分后的日期SELECT DATEADD(dd,3,'2021-03-01')返回：以当前数据库的日期格式返回2021-03-04📌DATEDIFF两个日期之间的指定日期部分的间隔SELECT DATEDIFF(dd, '2021-03-01', '2021-03-04')返回：3📌GETDATE取得当前系统的时间和日期SELECT GETDATE()返回：2021-03-16 15:22:47.087DATENAME日期中指定日期部分的字符串形式SELECT DATENAME(dw, '2021-03-01')返回：星期一DATEPART日期中指定日期部分的整数形式SELECT DATEPART(day, '2021-03-10')返回：10DAY取得指定日期中的天的整数SELECT DAY(GETDATE())返回：今天的日期中天的整数例如：GETDATE()为2021-2-25 12:00:00.000，则DAY()…

T-SQL编程之数据的增删改操作
type: item
date: 2023-09-22T11:07:00+08:00
description: 前言这篇文章主要是介绍SQL语言以及基本的数据库的相关操作，适合没有任何数据库操作基础的人员查阅。如果您有相关的数据库开发经验，那这篇文章将对您没有任何帮助。SQL简介SQL：Structured Query Language(结构化查询语言)，是关系型数据库系统的标准语言，可以用于存取数据以及查询、更新和管理关系数据库系统。T-SQL ：Transact-SQL，是微软对SQL的扩展，具有SQL的主要特点，同时增加了变量、运算符、函数、流程控制和注释等语言元素，使得其功能更加强大。T-SQL的组成名称用途所含语法DML(Data Manipulation Language，数据操作语言)插入、修改和删除数据库中的数据INSERT、UPDATE及DELETE语句等DDL(Data Definition Language，数据定义语言)以CREATE或DROP开头的命令，例如建立数据库、数据库对象定义等CREATE TABLE、CREATE VIEW及DROP TABLE等DQL(Data Query Language，数据查询语言)对数据库中的数据进行查询SELECT语句等DCL(Data Control Language，数据控制语言)控制数据库组件的存取许可、存取权限等GRANT、REVOKE等SQL设计规范采用有意义的命名（数据库、表和字段等）类型命名方法注意事项数据库帕斯卡（Pascal Case）命名Ø 名称应有意义，建议选择产品或项目的名称命名Ø 避免使用特殊字符，如数字，空格之类Ø 避免使用缩写Ø 避免中文拼音数据表帕斯卡（Pascal Case）命名Ø 名称应有意义，建议使用能够表示表中存储内容的名字Ø 避免使用特殊字符，如数字，空格之类Ø 避免使用缩写Ø 避免中文拼音字段帕斯卡（Pascal Case）命名Ø 避免和表名重复Ø 避免使用系统关键字作为列名(例如:int)Ø 避免使用缩写或者特殊字符Ø 避免中文拼音注意字段名不与保留字、数据库系统或者常用的访问方法冲突数据表应该避免可为空的列保持不同数据表中相同意义的列名和类型一致SQL注释-- 单行注释 /* 多行注释 此处可以书写多条注释信息 */INSERT 插入语法: INSERT INTO 表名 (列名1,列名2,...) VALUES ('值1','值2',...)[scode type="blue" size="small"]⚠注意：在插入语句中，INTO 与 列名 可以省略，当省略列名时，VALUES提供值的时候，提供值的顺序与值的个数必须与表结构中的列完全一致，不能打乱顺序也不能少提供值。在插入语句中，不允许将标识列(自增列)写在列名中如需使用默认值，则需要明确使用：DEFAULT 关键字[/scode]插入多条数据语法-扩展：INSERT INTO 表名 (列名1,列名2,列名3,...) VALUES ('值1','值2','值3',...), -- 第1条记录 ('值1','值2','值3',...), -- 第2条记录 ('值1','值2','值3',...) -- 第3条记录UPDATE 修改语法：UPDATE 表名 SET 列名1 = '值1', 列名2 = '值2',... WHERE 条件1 AND 条件2 OR 条件3[scode type="blue" size="small"]⚠注意：WHERE条件语句后面可以存在多个过滤条件。“并且”关系使用 AND关键字连接；“或”关系使用 OR关键字连接判断是否为NULL，可以使用 IS NULL关键字判断如果条件较多，可以使用小括号()进行分组[/scode]DELETE 删除语法：DELETE FROM 表名 WHERE WHERE 条件1 AND 条件2 OR 条件3 [scode type="blue" size="small"]⚠注意：DELETE条件删除语句中，如果未指定WHERE条件语句，则将删除表中的所有数据删除主表记录时，如果该记录被子表所引用，则这条记录将删除失败[/scode]TRUNCATE 删除语法：TRUNCATE TABLE 表名 [scode type="blue" size="small"]⚠注意：TRUNCATE语句的删除记录时不允许携带 WHERE执行条件,只能整表数据删除TRUNCATE语句进行删除表中所有数据,标识列的计数也会从头开始TRUNCATE语句的删除速度较 DELETE语句更快TRUNCATE是数据定义语言(DDL)，在事务操作中不支持事务回滚TRUNCATE在删除表时如果存在外键引用时，则删除失败比如学生表引用了年级表，即使学生表中没有数据，只要外键关联存在，年级表就删不掉在实际开发过程中，请谨慎使用[/scode]