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将按以下顺序处理查询的子句:FROMWHERESELECT:

要根据一列或多列对结果集进行排序,请使用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按以下顺序处理子句:FROMWHEREGROUP BYSELECTORDER 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按以下顺序处理子句:FROMWHEREGROUP BYHAVINGSELECTORDER BY

注意:请注意,WHERE子句过滤行,而HAVING子句过滤分组。

posted @ 2022-08-27 17:19  平元兄  阅读(257)  评论(0编辑  收藏  举报