7.1 SQL Server查询基础
SQL Server SELECT基础
SELECT查询简介
数据库表是存储数据库中所有数据的对象。在表格中,数据按行和列格式进行逻辑组织,类似于电子表格。
SQL Server使用架构(schemas)对表和其他数据库对象进行逻辑分组。SQL Server默认的架构是dbo
,所以通常你会看到dbo.table_name
.比如我们可以有两个架构(Schema):sales
(销售)和production
(产品)。sales
架构将所有销售相关表分组,而production
架构将所有生产相关表分组。
这样跟有利于分类管理数据库表。
我们通过SELECT
语句查询表中的数据,最基础的语法如下:
SELECT
select_list
FROM
schema_name.table_name;
在这个语法中:
- 首先,在
SELECT
子句中指定要返回那些数据列,并用逗号分隔。 - 其次,在
FROM
子句中指定从那张表中查询数据。
在处理SELECT
语句时,SQL Server会先处理FROM
子句,然后再处理SELECT
子句,即使SELECT
子句首先出现在查询中。
SELECT示例
先创建一个学生表:
create table dbo.Students
(
Id int primary key identity(1,1), -- 每添加一条数据,Id从1开始,每次自增1
NickName nvarchar(15), -- unicode
StudentNo char(11) , -- 学号
ClassName nvarchar(10),--班级名
Sex nchar(2),
Account varchar(20), -- 账号
[Password] varchar(50) -- 密码
);
添加几行数据:
insert into dbo.Students
values
('张三','2001','男','user1','123456','一班'),
('李四','2002','男','user2','123456','二班'),
('王五','2003','女','user3','123456','一班'),
('王麻子','2004','男','user4','123456','一班')
SQL Server SELECT – 返回表的部分列
下列查询返回所有学生的昵称和性别。
SELECT
NickName,
Sex
FROM
dbo.Students;
结果:
SQL Server SELECT – 返回表的所有列
要返回所有列的话,可以指定SELECT
列表中的所有列。也可以使用SELECT *
作为简写:
SELECT
*
FROM
Students;
--或者
SELECT
Id,
NickName,
StudentNo,
Sex,
Account,
[Password]
FROM
Students;
结果:
在非生产环境中,可以使用SELECT *
来简化操作。
但是,由于以下原因,不应将SELECT *
用于生产代码:
- 首先,
SELECT *
通常返回的数据多于应用程序所需的数据。这会导致不必要的数据从SQL Server传输到客户端应用程序,使数据在网络上传输花费更多时间,并降低应用程序的速度。 - 其次,如果表中添加了一个或多个新列,
SELECT *
返回所有包含新添加列的列,新添加的这些列在程序中没有处理。这可能会导致应用程序崩溃。
SQL Server SELECT – 对结果集进行排序
要根据一个或多个条件筛选行,请使用WHERE
子句:
SELECT
*
FROM
Students
WHERE
NickName='李四';
结果:
这个例子中,查询返回昵称为"李四"的学生。
当WHERE
子句可用时,SQL Server将按以下顺序处理查询的子句:FROM
、WHERE
和SELECT
:
要根据一列或多列对结果集进行排序,请使用ORDER BY子句,如下例所示:
SELECT
*
FROM
Students
WHERE
Sex='男'
ORDER BY
StudentNo;
结果:
这个例子中,查询性别为"男"的学生,并将结果按照学号升序排序。
SQL Server处理上述查询的顺序如下:
SQL Server SELECT – 将查询结果进行分组
要将行分组,可以使用GROUP BY
子句。例如,下面的语句返回每个班级男生学生的数量:
SELECT
ClassName AS 班级名,
COUNT(*) AS 人数
FROM
Students
WHERE
Sex='男'
GROUP BY
ClassName
ORDER BY
ClassName;
结果:
在本例中,SQL Server按以下顺序处理子句:FROM
、WHERE
、GROUP BY
、SELECT
和ORDER BY
:
SQL Server SELECT – 对分组进行过滤
要根据一个或多个条件筛选组,请使用HAVING
子句。下面的示例返回班级男学生人数大于等于2的班级:
SELECT
ClassName AS 班级名,
COUNT(*) AS 人数
FROM
Students
WHERE
Sex='男'
GROUP BY
ClassName
HAVING
COUNT (*) >= 2
ORDER BY
ClassName;
结果:
在本例中,SQL Server按以下顺序处理子句:FROM
、WHERE
、GROUP BY
、HAVING
、SELECT
和ORDER BY
注意:请注意,
WHERE
子句过滤行,而HAVING
子句过滤分组。