前言这篇文章主要是介绍数据库的基础查询相关操作，适合没有任何数据库操作基础的人员查阅。如果您有相关的数据库开发经验，那这篇文章将对您没有任何帮助。表连接分类联接查询分为内联接、外联接、交叉联接。内连接[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()返回表达式的最小值• 返回表达式中的最小值• 如果出现空值（NULL），则该记录将被忽略• 用于数值、字符串和日期类型的数据列MAX()返回表达式的最大值• 返回表达式中的最大值，和MIN()注意点一致COUNT()返回查询记录的总个数• 返回提供的组或记录集中的计数• 用于除 text、image、ntext以外任何类型的列• 使用星号()作为COUNT函数的参数 [不推荐,推荐使用数字0或者列名]• 可以不必指定特定的列而计算所有的行数• 当对所有的行进行计数时，包括包含空值（NULL）的行DISTINCT()返回一个集合，并从指定的集合中删除重复项/[scode type="red" size="small"]⚠ 注意：在使用聚合函数查询后，查询列表中将不能出现普通列，除非该列也是用了聚合函数或使用了分组(GROUP BY)[/scode]演示案例：-- 查询出学员编号为'S230100801'的考试总成绩,平均分,最高分以及最低分 SELECT SUM(Result) '总成绩', AVG(Result) '平均分', MAX(Result) '最高分', MIN(Result) '最低分', FROM ResultInfo WHERE StudentNo = 'S230100801' -- 查询出学员编号为'S230100801'的考试成绩大于90分的次数 SELECT COUNT(0) '大于90分的考试次数' FROM Result WHERE StudentNo = 'S230100801' AND Result >= 90分组查询语法：SELECT 分组列名1,分组列名2,聚合函数(列名)... FROM 表名 WHERE 原始表数据筛选条件 GROUP BY 分组列名1,分组列名2... HAVING 分组后的数据筛选条件 ORDER BY 排序列名[scode type="red" size="small"]⚠ 注意：在使用分组查询后，查询列表中将不能出现普通列，除非该列使用了分组(GROUP BY)或者使用了聚合函数[/scode]演示案例：-- 查询出每门科目的考试平均分 SELECT SubjectID,AVG(Result) FROM ResultInfo GROUP BY SubjectID -- 查询出每门科目的考试最高分,按降序排列 SELECT SubjectID,MAX(Result) FROM ResultInfo GROUP BY SubjectID ORDER BY MAX(Result) DESC -- 查询出每个学员,每个科目的考试总成绩,按学员编号排列 SELECT StudentNo,SubjectID,SUM(Result) FROM ResultInfo GROUP BY StudentNo,SubjectID ORDER BY StudentNo -- 查询出每门科目考试成绩大于80分的总人数 SELECT SubjectID,COUNT(0) FROM ResultInfo WHERE Result >= 80 GROUP BY SubjectID -- 查询出每门科目的考试平均分且平均分高于80分并按降序排列 SELECT SubjectID,AVG(Result) FROM ResultInfo GROUP BY SubjectID HAVING AVG(Result) >= 80 ORDER BY AVG(Result) DESCWHERE与HAVING对比WHERE 是对分组之前的原始表记录中的数据进行筛选HAVING 是对分组之后的分组数据进行筛选，HAVING只能配合GROUP BY使用，不能单独使用ORDER BY 子句只允许出现在查询语句的最末尾
前言这篇文章主要是介绍数据库的基础查询相关操作，适合没有任何数据库操作基础的人员查阅。如果您有相关的数据库开发经验，那这篇文章将对您没有任何帮助。概念模糊查询提取的数据不一定是确切的，查询者对查询条件也是模糊的、大概的、不特别明确的。本篇文章会使用：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 ('长沙','衡阳','深圳','怀化')
前言这篇文章主要是介绍数据库的基础查询相关操作，适合没有任何数据库操作基础的人员查阅。如果您有相关的数据库开发经验，那这篇文章将对您没有任何帮助。查询语法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()返回25MONTH取得指定日期中的月份的整数SELECT MONTH (GETDATE())返回：今天的日期中月份的整数例如：GETDATE()为2021-2-25 12:00:00.000，则MONTH()返回2YEAR取得指定日期中的年份的整数SELECT YEAR (GETDATE())返回：今天的日期中年份的整数例如：GETDATE()为2021-2-25 12:00:00.000，则YEAR()返回2021日期部分参数简写说明对照表日期部分参数缩写日期部分参数缩写📌yearyy, yyyyweekdaydw, wquarterqq, q📌hourhh📌monthmm, m📌minutemi, ndayofyeardy, y📌secondss, s📌daydd, d📌millisecondmsweekwk,ww 数学函数-用于对数值进行代数运算函数名称说明示例📌RAND返回从0到1之间的随机float值，不包括0和1SELECT RAND()返回：0.79288062146374ABS取数值表达式的绝对值SELECT ABS(-43)返回：43📌CEILING向上取整，取大于或等于指定数值、表达式的最小整数SELECT CEILING(43.5)返回：44📌FLOOR向下取整，取小于或等于指定表达式的最大整数SELECT FLOOR(43.5)返回：43POWER取数值表达式的幂值SELECT POWER(5,2)返回：25📌ROUND将数值表达式四舍五入为指定精度SELECT ROUND(43.543,1)返回：43.500SIGN对于正数返回+1，对于负数返回-1，对于0则返回0SELECT SIGN(-43)返回：-1SQRT取浮点表达式的平方根SELECT SQRT(9)返回：3PI返回值为圆周率SELECT PI()返回：3.14159263589979系统函数-获取有关SQL Server中对象和设置的系统信息函数名称说明示例📌CONVERT用来转变数据类型SELECT CONVERT (VARCHAR(5),12345)返回：字符串12345CURRENT_USER返回当前用户的名称SELECT CURRENT_USER返回：你登录的用户名DATALENGTH返回指定表达式的字节数SELECT DATALENGTH ('C#高级')返回：6HOST_NAME返回当前用户所登录的计算机名称SELECT HOST_NAME()返回：你所登录的计算机的名称SYSTEM_USER返回当前所登录的用户名称SELECT SYSTEM_USER返回：你当前所登录的用户名USER_NAME从给定的用户ID返回用户名SELECT USER_NAME(1)返回：从任意数据库中返回“dbo”字符串函数-用于控制返回给用户的字符串函数名称说明示例CHARINDEX用来寻找一个指定的字符串在另一个字符串中的起始位置SELECT CHARINDEX('NAME','MynameisTom',1 )返回：4📌SUBSTRING从字符串的制定位置截取制定长度的字符串SELECT SUBSTRING('Hello word',2,2)返回：el📌LEN返回传递给它的字符串长度SELECT LEN('SQL Server高级编程')返回：14UPPER把传递给它的字符串转换为大写SELECT UPPER('sqlserver高级编程')返回：SQL SERVER高级编程LTRIM清除字符左边的空格SELECT LTRIM (' 李智 ')返回：李智 （后面的空格保留）RTRIM清除字符右边的空格SELECT RTRIM (' 李智 ')返回： 李智（前面的空格保留）📌RIGHT从字符串右边返回指定数目的字符SELECT RIGHT('克里斯琴•内格尔',3)返回：内格尔LEFT从字符串左边返回指定数目的字符SELECT RIGHT('克里斯琴•内格尔',4)返回：克里斯琴📌REPLACE替换一个字符串中的字符SELESELECT REPLACE('克里斯琴','克','莫')返回：莫里斯琴📌STUFF在一个字符串中，删除指定长度的字符，并在该位置插入一个新的字符串SELECT STUFF('hello world', 2, 3, '我的世界我做主')返回：h我的世界我做主o world总结
前言这篇文章主要是介绍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]