MSSQL查询表语句
一、简介
MSSQL(Microsoft SQL Server)是一种关系型数据库管理系统,广泛用于企业级的数据存储和处理,在数据管理和分析过程中,查询表是最常见的操作之一,本文将详细介绍如何使用MSSQL进行各种类型的表查询,包括基本查询、条件查询、排序、分页、分组、连接等。
二、基本查询
1. SELECT语句基础
SELECT语句是SQL中用于从表中检索数据的基本命令,其最简单的形式是从表中检索所有列和所有行:
SELECT * FROM 表名;
要从名为Employees
的表中检索所有数据,可以使用以下语句:
SELECT * FROM Employees;
2. 查询指定列
有时候我们只需要表中的某些列,而不是所有列,这种情况下,可以在SELECT子句中指定列名,列名之间用逗号分隔:
SELECT 列名1, 列名2 FROM 表名;
从Employees
表中检索FirstName
和LastName
两列:
SELECT FirstName, LastName FROM Employees;
3. 使用AS关键字重命名列
为了提高可读性,可以使用AS关键字为结果集中的列指定别名:
SELECT 列名 AS 新名称 FROM 表名;
SELECT FirstName AS 名字, LastName AS 姓氏 FROM Employees;
三、条件查询
1. WHERE子句
WHERE子句用于过滤记录,只返回满足条件的行:
SELECT 列名 FROM 表名 WHERE 条件;
从Employees
表中检索姓氏为“Smith”的所有员工信息:
SELECT * FROM Employees WHERE LastName = 'Smith';
2. AND与OR操作符
可以使用AND和OR操作符组合多个条件,AND要求所有条件都为真,而OR只需一个条件为真:
SELECT 列名 FROM 表名 WHERE 条件1 AND 条件2; SELECT 列名 FROM 表名 WHERE 条件1 OR 条件2;
检索姓氏为“Smith”且部门为“Sales”的员工:
SELECT * FROM Employees WHERE LastName = 'Smith' AND Department = 'Sales';
3. NOT操作符
NOT操作符用于否定条件:
SELECT 列名 FROM 表名 WHERE 条件1 NOT 条件2;
检索不是“Sales”部门的所有员工:
SELECT * FROM Employees WHERE NOT Department = 'Sales';
四、排序与分页
1. ORDER BY子句
ORDER BY子句用于对结果集进行排序,可以按升序(ASC)或降序(DESC)排列:
SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC];
按姓氏升序排列员工信息:
SELECT * FROM Employees ORDER BY LastName ASC;
2. LIMIT与OFFSET子句(SQL Server 2012+)
LIMIT和OFFSET子句用于限制返回的记录数和偏移量,实现分页功能:
SELECT 列名 FROM 表名 ORDER BY 列名 OFFSET 起始行 SKIP 记录数 ROWS FETCH NEXT 记录数;
每页显示10条记录,从第21条开始显示(即第3页):
SELECT * FROM Employees ORDER BY LastName OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
五、分组与聚合函数
1. GROUP BY子句
GROUP BY子句用于将结果集按照某个列的值进行分组,通常与聚合函数一起使用:
SELECT 列名, 聚合函数(列名) FROM 表名 GROUP BY 列名;
统计每个部门的总人数:
SELECT Department, COUNT(*) AS TotalCount FROM Employees GROUP BY Department;
2. 常用的聚合函数
COUNT(): 统计行数
SUM(): 计算总和
AVG(): 计算平均值
MAX(): 查找最大值
MIN(): 查找最小值
查找每个部门的最高薪水:
SELECT Department, MAX(Salary) AS MaxSalary FROM Employees GROUP BY Department;
六、连接查询
1. INNER JOIN
INNER JOIN用于返回两个表中匹配的行:
SELECT A.列名1, B.列名2 FROM 表A INNER JOIN 表B ON A.共同列 = B.共同列;
检索每个员工的姓名及其所在部门名称:
SELECT Employees.FirstName, Employees.LastName, Departments.DepartmentName FROM Employees INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
2. LEFT JOIN与RIGHT JOIN
LEFT JOIN返回左表中的所有行以及右表中匹配的行,没有匹配的则返回NULL;RIGHT JOIN相反:
SELECT A.列名1, B.列名2 FROM 表A LEFT JOIN 表B ON A.共同列 = B.共同列; SELECT A.列名1, B.列名2 FROM 表A RIGHT JOIN 表B ON A.共同列 = B.共同列;
使用LEFT JOIN检索所有员工及其所在部门名称,若员工没有分配部门则显示NULL:
SELECT Employees.FirstName, Employees.LastName, Departments.DepartmentName FROM Employees LEFT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
七、子查询与嵌套查询
1. 子查询基础
子查询是一个嵌套在另一个SQL查询中的查询,子查询通常放在FROM或WHERE子句中:
SELECT 列名 FROM 表名 WHERE 列名 IN (子查询);
检索工资高于公司平均工资的员工:
SELECT * FROM Employees WHERE Salary > (SELECT AVG(Salary) FROM Employees);
2. 相关子查询
相关子查询是指子查询依赖于外部查询的结果,每次外部查询返回一行,子查询就执行一次:
SELECT 列名 FROM 表名 WHERE EXISTS (子查询);
检索在有员工的部门中工作的员工:
SELECT * FROM Employees e1 WHERE EXISTS (SELECT * FROM Departments d WHERE d.DepartmentID = e1.DepartmentID);
八、联合查询(UNION)
UNION操作符用于合并多个SELECT语句的结果集,自动去除重复行:
SELECT 列名 FROM 表名1 UNION [ALL] SELECT 列名 FROM 表名2;
检索员工和客户中所有独特的姓氏:
SELECT LastName FROM Employees UNION ALL SELECT LastName FROM Customers;
注意:UNION ALL保留所有重复行,而不仅仅是唯一的行,如果不需要重复行,可以使用UNION。
九、相关问题与解答栏目
Q1:如何在MSSQL中查询前10条记录?
A1: 在MSSQL中,可以使用TOP关键字来限制返回的记录数,查询Employees
表中的前10条记录:
SELECT TOP 10 * FROM Employees;
这个语句会返回Employees
表中的前10条记录,如果没有指定ORDER BY子句,返回的记录顺序是不确定的,建议总是结合ORDER BY子句使用TOP关键字以获得确定的结果,按姓氏升序排列并取前10条记录:
SELECT TOP 10 * FROM Employees ORDER BY LastName ASC;
这样可以确保每次查询都返回相同的结果。
Q2:如何在MSSQL中使用LIKE进行模糊查询?
A2: LIKE操作符用于在MSSQL中进行模糊查询,支持使用通配符来匹配部分字符串,常用的通配符包括百分号(%)和下划线(_),百分号表示任意数量的字符(包括零个字符),而下划线表示单个字符,从Customers
表中查找姓氏以"S"开头的所有客户:
SELECT * FROM Customers WHERE LastName LIKE 'S%';
这里,百分号表示姓氏以"S"开头,后面可以跟任意数量的字符,如果要查找姓氏中第二个字母是"a"的客户,可以使用下划线:
SELECT * FROM Customers WHERE LastName LIKE '_a%';
这个查询将匹配像"Sammy"这样的姓氏,还可以结合多个通配符使用,查找姓氏为三个字符且以"S"开头的客户:
SELECT * FROM Customers WHERE LastName LIKE 'S__';
这个查询将匹配如"Sam"、"Sara"等姓氏,通过使用LIKE操作符和通配符,可以实现各种复杂的模糊查询需求。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/106533.html