1、基础查询

简单查询:使用SELECT
关键字后跟列名来选择要检索的列,如果要选择所有列,可以使用星号(*),查询学生表student
中的所有列数据:
SELECT * FROM student;
条件查询:使用WHERE
关键字来添加条件,以限制检索的数据行,查询成绩大于80分的学生信息:
SELECT * FROM score WHERE grade > 80;
2、聚合函数与分组
聚合函数:常用的聚合函数包括SUM()
、AVG()
、MAX()
、MIN()
和COUNT()
,计算学生表中的学生人数:
SELECT COUNT(id) FROM student;
GROUP BY:用于根据一个或多个列对结果集进行分组,并使用聚合函数对每个组执行计算,统计每个院系的学生人数:
SELECT department, COUNT(*) AS num_students FROM student GROUP BY department;
HAVING:用于对分组后的数据进行过滤,统计选课门数超过2门的学生学号和总成绩:
SELECT sno, COUNT(Cno) AS num_courses, SUM(Grade) AS total_grade FROM sc GROUP BY sno HAVING COUNT(Cno) > 2;
3、连接查询

内连接:最常用的一种连接类型,如果两个表的相关字段满足连接条件,则把这两个表中提取数据组合成一个新的临时表,查询课程表和学生表的连接结果:
SELECT course.name, student.name FROM course INNER JOIN student ON course.student_id = student.id;
自连接:将同一个表的不同行连接起来,查找同一部门中工资高于同事平均工资的员工:
SELECT a.employee_id, a.salary FROM employee a, employee b WHERE a.department_id = b.department_id AND a.salary > b.salary;
外连接:包括左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL JOIN),左外连接返回左表中的所有记录以及右表中满足条件的记录;右外连接返回右表中的所有记录以及左表中满足条件的记录;全外连接返回两个表中的所有记录,不满足条件的返回NULL,左外连接查询员工及其对应的部门名称:
SELECT employee.name, department.name FROM employee LEFT JOIN department ON employee.department_id = department.id;
4、排序与限制
ORDER BY:用于对查询结果进行排序,默认按升序排列,可以使用DESC关键字指定降序排列,按年龄降序排列学生表:
SELECT * FROM student ORDER BY age DESC;
TOP:用于限制返回的记录数,查询学生表中前3行数据:
SELECT TOP 3 * FROM student;
5、子查询与嵌套查询

子查询:在主查询中嵌套的查询语句,子查询可以嵌套多层,并且可以用于SELECT、FROM、WHERE、HAVING和INSERT INTO等语句中,查找某个表中与另一个表中数据匹配的行:
SELECT column1 FROM table1 WHERE column2 IN (SELECT column2 FROM table2);
嵌套查询:将一个查询的结果作为另一个查询的条件,查找工资高于公司平均工资的员工:
SELECT name FROM employee WHERE salary > (SELECT AVG(salary) FROM employee);
6、字符串模糊查询
LIKE:用于在WHERE子句中进行模糊查询。%表示任意数量的字符,_表示单个字符,列出所有姓刘的学生:
SELECT * FROM student WHERE name LIKE '刘%';
NOT LIKE:用于查找不符合条件的记录,列出所有不姓王的学生:
SELECT * FROM student WHERE name NOT LIKE '王%';
7、其他常用操作
DISTINCT:用于去除重复记录,查询不重复的姓名:
SELECT DISTINCT name FROM student;
BETWEEN:用于在某个范围内查询,查询成绩在60到90之间的学生:
SELECT * FROM score WHERE grade BETWEEN 60 AND 90;
IN:用于判断某个值是否在一个列表中,查询姓名为'猴子'或'马云'的学生:
SELECT * FROM student WHERE name IN ('猴子', '马云');
IS NULL 和 IS NOT NULL:用于判断字段是否为空值,查询教师姓名为空的记录:
SELECT * FROM teacher WHERE teacher_name IS NULL;
8、高级查询技巧
联合查询(UNION和UNION ALL):UNION会去除重复的行,而UNION ALL会保留所有的行,包括重复的行,将两个查询的结果合并为一个结果集:
SELECT column1 FROM table1 UNION ALL SELECT column2 FROM table2;
优化查询性能:避免在WHERE子句中使用!=或<>操作符;使用索引提高查询性能;避免使用SELECT *,只选择需要的列;使用参数化查询提高性能并减少SQL注入的风险。
9、相关问答
问题1:如何在MSSQL中查询学生表中年龄最大的学生?
解答:使用聚合函数MAX()
结合子查询来实现,首先找到年龄最大的值,然后根据这个值查询对应的学生信息,示例如下:
SELECT * FROM student WHERE age = (SELECT MAX(age) FROM student);
问题2:如何在MSSQL中查询每个班级的平均成绩?
解答:使用GROUP BY
子句按班级分组,并使用聚合函数AVG()
计算平均成绩,示例如下:
SELECT class, AVG(grade) AS average_grade FROM score GROUP BY class;