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子句过滤分组。

 
分类: SQL Server

posted on 2025-04-21 11:14  漫思  阅读(57)  评论(0)    收藏  举报

导航