课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili

目录

查询(最重要,难度最大)

(一)大纲

(二)Scott 表

下载与导入SQL Server

scott表介绍

计算列

distinct(不允许重复的)

between(在某个范围)

in(属于若干个孤立的值)

top(最前面的若干个记录)

null(没有值,或空值)

order by(以某个字段排序)

模糊查询(搜索时经常使用)

格式

聚合函数(多行记录返回一个值,通常用于统计分组的信息)

函数的分类

聚合函数的分类

count()

下次课程预告


查询(最重要,难度最大)

(一)大纲

1. 计算列

2. distinct

3. between

4. in

5. top

6. null

7. order by

8. 模糊查询

9. 聚合函数

10. group by

11. having

12. 连接查询

  • 定义
  • 分类(内连接、外连接、完全连接、交叉连接、自连接、联合)

13.  嵌套查询(Oracle中讲)

(二)Scott 表

Scott表 是 Oracle数据库 里的例子,将它附加到 SQL Server 中

下载与导入SQL Server

SQL Server 学习之环境搭建 - 枫林雨 - 博客园

(1)下载并解压后,得到以下两个文件:

(2)设置权限(以 scott.mdf 文件为例):

对 scott.mdf 和 scott_log.ldf 两个文件都要做以上权限修改

(3)附加到 SQL Server 中

打开SSMS,数据库 - 右键 - 附加

scott表介绍

emp (EMPNO, ename, job, mgr, hiredate, sal, comm, deptno)

  • 员工(员工编号,姓名,职称,上级编号,雇佣日期,工资,奖金(销售岗才有),部门编号)

dept (deptno, dname, loc)

  • 部门(部门编号,部门名称,地址)

SALGRADE (GRADE, LOSAL, HISAL)

  • 工资(等级,最低工资,最高工资)

计算列

select ename,* from emp    -- ok,但是在Oracle中会报错,因此不建议这样写

select ename,15 from emp

查询员工表里的姓名和年薪(工资×12)

select ename, sal*12 as "年薪" from emp-- as可以省略,"年薪" 不要写成 '年薪'(不可移植)

select 5 from emp-- 输出的行数是emp表的行数,每行只有一个字段,值是5

select 5-- OK,但不推荐(Oracle里报错)

注:在Oracle中字段的别名不允许用单引号括起来,但是SQL Server却允许。因此,为了兼容性,最好字段别名用双引号括起来,不要用单引号


distinct(不允许重复的)

emp中一共有14条记录,有10/20/30三种类型的deptno值

select deptno from emp  -- 14行记录,不是3个

select distinct deptno from emp  -- distinct deptno会过滤掉重复的deptno

select distinct comm from emp  -- distinct也可以过滤掉重复的null;或者说,如果有多个null,只输出一个

select distinct comm,deptno from emp  -- 整体过滤,把comm和deptno的组合进行过滤

select deptno, distinct comm from emp  -- 报错,逻辑上有冲突(deptno有14条,distinct comm有5条,数目不匹配)


between(在某个范围)

查询工资在1500到3000之间(包括1500和3000)的所有的员工的信息

select * from empwhere sal>=1500 and sal<=3000    -- 写法1select * from empwhere sal between 1500 and 3000    -- 写法2

查询工资在小于1500或大于3000之间的所有员工的信息

select * from empwhere sal<1500 or sal>3000    -- 写法1select * from empwhere sal not between 1500 and 3000    -- 写法2


in(属于若干个孤立的值)

查询工资为1500和3000的员工信息

select * from emp where sal in (1500,3000)   -- 写法1select * from empwhere sal=1500 or sal=3000  -- 写法2

对以上查询取反,即把工资既不是1500,也不是3000的记录输出

select * from emp where sal not in (1500,3000)  -- 写法1select * from empwhere sal != 1500 and sal != 3000   -- 写法2
-- 数据库中不等于有两种表示:<> 或 !=  推荐使用前者

对或取反是并且,对并且取反是或


top(最前面的若干个记录)

select top 2 * from emp   -- *表示所有字段select top 15 percent * from emp    -- 14*15% = 2.1个,输出3个而不是2个(向上取整)

SQL Server 和 Oracle 里关于查询最前面若干记录的关键字是不一样的

Oracle里输出前5行数据的写法

select * from emp where rownum < 6

分页查询:每页显示几条查询记录

把工资在1500和3000之间(包括1500和3000)的员工中工资最高的前4个人的信息输出

select top 4 * from empwhere sal between 1500 and 3000 order by sal desc  -- desc降序,不写则默认是升序


null(没有值,或空值)

输出奖金非空的员工的信息

select * from emp where comm is not null

null 不能参与  <>     !=     =   运算,但可以参与 is    is not  运算

0和null是不一样的,null表示空值,没有值;0表示一个确定的值

任何类型的数据都允许为null

输出每个员工的姓名、年薪(包含奖金)。假设comm是一年的奖金

select ename, sal*12+comm from emp  -- 错误,因为comm里有null,跟数值相加的结果直接为null-- 正确写法
select ename, sal*12+isnull(comm,0) from emp  -- isnull(comm,0) 如果comm是null,就返回0,否则返回comm的值

null和任何数字做数学运算结果都为null,即:null不能参与任何数学运算,否则结果为空


order by(以某个字段排序)

asc是升序的意思,默认可以不写;desc是降序

select * from emp order by sal  -- 默认是按照升序排序

select * from emp order by deptno,sal   -- 先按deptno升序排,若deptno相同,再按sal升序排

select * from emp order by deptno desc, sal   -- 先按deptno降序排序,如果deptno相同,再按照sal升序排序(注意sal是升序,不是降序)select * from emp order by deptno, sal desc  -- desc不会对deptno产生影响。先按deptno升序,若deptno相同,再按sal降序

order by a desc, b, c, d    desc只对 a 产生影响,不会对后面的 b c d 产生影响

  • order by a,  b            a和b都是升序
  • order by a,   b desc         a升序,b降序
  • order by a desc,    b          a降序,b升序
  • order by a desc,    b desc       a和b都是降序

如果不指定排序的标准,则默认是升序,升序用asc表示,默认可以不写

为一个字段指定的排序标准并不会对另一个字段产生影响

强烈建议为每一个字段都指定排序的标准


模糊查询(搜索时经常使用)

对应网页的搜索框

格式

select  字段的集合  from  表名  where  某个字段的名字  like  匹配的条件

  • 匹配的条件通常含有通配符
  • 通配符:
    • %:任意0个或多个字符

      select * from emp where ename like '%A%'   -- ename只要含有字母A就输出
      select * from emp where ename like 'A%'    -- ename只要首字母是A的就输出
      select * from emp where ename like '%A'   -- ename只要尾字母是A的就输出
    • _:表示任意单个字符
      select * from emp where ename like '_A%'  -- ename只要第二个字母是A的就输出
    • [a-f]:a到f中的任意单个字符,即只能是 a b c d e f 中的任意一个字符     
      select * from emp where ename like '_[A-F]%'   -- 把ename中第二个字符是A或B或C或D或E或F的记录输出
    • [a,f]:a或f
    • [^a-c]:^表示取反,即不是a,也不是b,也不是c的任意单个字符
      select * from emp where ename like '_[^A-F]%'   -- 把ename中第二个字符不是A-F中任一个的记录输出

注意:

  • 匹配的条件必须用单引号括起来,不能省略,也不能改用双引号

双引号表示的是一个对象的名称或别名,单引号表示的是一个字符串

  • 通配符作为普通字符使用的问题
create table student(name varchar(20) null,age int
)insert into student values ('张三',88)
insert into student values ('Tom',66)
insert into student values ('a_b',22)
insert into student values ('c%d',44)
insert into student values ('abc_fe',56)
insert into student values ('haobin',25)
insert into student values ('HaoBin',88)
insert into student values ('c%',66)
insert into student values ('long''s',100)select * from student

select * from student where name like '%\%%' escape '\'  -- 把name中包含有%的输出

select * from student where name like '%\_%' escape '\'  -- 把name中包含有_的输出

escape '\' 表示把 '\' 字符当做转义字符的标志

在sql中可以把任意的字符当做转义字符的标志,具体是把哪个字符当做转义字符,这是由escape要指定为转义字符的字符来决定的


聚合函数(多行记录返回一个值,通常用于统计分组的信息)

函数的分类

  • 单行函数:每一行返回一个值,如 lower() 和 upper()
  • 多行函数:多行返回一个值,如聚合函数
select lower(ename) from emp    -- 最终返回的是14行-- lower()表示小写,是单行函数(每一行都返回一个值)
-- upper表示大写select max(sal) from emp  -- 返回的是1行,max()是多行函数

聚合函数的分类

  • max()
  • min()
    • 如 min(ename) 输出的结果,第一个字母是A(因为A是最小的)
  • avg()   平均
  • count()   求个数

count()

count(*)    返回表中所有记录的个数

count(字段名)    返回字段值非空的记录的个数,重复的记录也会被当做有效记录

count(distinct 字段名)   返回字段不重复并且非空的记录的个数

select count(*) from emp    -- 返回emp表所有记录的个数
select count(deptno) from emp   -- 返回值是14,这说明deptno重复的记录也被当做有效记录
select count(distinct deptno) from emp   -- 返回值是3,统计deptno不重复的记录的个数
select count(comm) from emp  -- 返回值是4,这说明comm为null的记录不会被当做有效记录

判断如下sql语句是否正确

select max(sal) "最高工资", min(sal) "最低工资", count(*) "员工人数" from emp   -- OK
select max(sal), lower(ename) from emp  -- 报错,单行函数和多行函数不能通用
select max(sal) from emp  -- 默认把所有的信息当做一组

下次课程预告

  1. 分组(group by):统计部门编号、人数、平均工资
  2. 对分组之后的数据进行过滤(having),与where的区别(先分组后过滤要使用having)
  3. 连接:多张表查询
  4. 嵌套查询(又叫子查询,指一个select里又嵌套了另一个select):独立嵌套、相关嵌套

【3 - 查询】Sql Server - 郝斌(计算列、distinct、between、in、top、null、order by、模糊查询、聚合函数[主要是count()函数] )相关推荐

  1. SQL Server中的计算列概述

    In this article, we will explore computed columns in SQL Server and their configurations. 在本文中,我们将探讨 ...

  2. 【2 - 数据库是如何存储数据的】Sql Server - 郝斌(字段、记录、表;图形化界面及sql语句建表;六种约束;一对一、一对多、多对多、数据库关系图;主外键)

    课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili 目录 数据库是如何解决数据存储问题的 1. 表的相关数据 2. create tab ...

  3. 【4 - 分组】Sql Server - 郝斌(分组group by、过滤having、聚合函数max() / count()、排序order by、select语句的执行顺序)

    课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili ​ 目录 group by(分组) group by a,b 的用法 having( ...

  4. SQL Server中的标识列

    一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列. 该种列具有以下三种特点: 1.列的数据类型为不带小数的数值类型 2.在进行插入(Insert)操作时,该列的值 ...

  5. 使用PowerShell SQL Server DBATools的IDENTITY列阈值

    In this article, we will review PowerShell SQL Server module DBATools to identify IDENTITY columns a ...

  6. SQL Server自动化运维系列——监控磁盘剩余空间及SQL Server错误日志(Power Shell)...

    原文:SQL Server自动化运维系列--监控磁盘剩余空间及SQL Server错误日志(Power Shell) 需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的 ...

  7. Sql Server 添加、修改列脚本

    Sql Server 添加.修改列脚本 --添加列 ALTER TABLE StudentsADD Name NVARCHAR(50) NULL --修改列 ALTER TABLE StudentsA ...

  8. SQL SERVER PIVOT 行转列、列传行

    在数据库操作中,有些时候我们遇到需要实现"行转列"的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIM ...

  9. sql 根据日期模糊查询SQL Server dateTime类型 模糊查询

    曾经遇到这样的情况,在数据库的Meeting表中有PublishTime (DateTime,8)字段,用来存储一个开会时间,在存入时由于要指明开会具体时间,故格式为yyyy-mm-dd hh:mm: ...

最新文章

  1. 英特尔 Arria 10 GX FPGA 正式商用,瞄准数据中心市场
  2. ubuntu 下安装nodejs以及pm2
  3. 上下定高 中间自适应_联合首发|医药供应链平台一块医药获新一轮融资,赋能产业上下游提质增效...
  4. IDEA使用过程中相应的配置和设置(如编码设置、窗口调整以及config.xml文件模板创建、工程打开方式、约束文件)
  5. 服务器USB启动故障一例
  6. Linux使用yum install 安装程序时,提示“另外一个程序锁定了 yum;等待它退出……”
  7. discuz核心函数库function_core的函数注释
  8. python不能安装的问题_无法安装pythoncolam
  9. 进化论是个假说,目前解释生物现象最合理
  10. iptables基础(01)
  11. 基于群智能的路径规划算法(五)------狼群算法
  12. 信源编码程序设计实验C语言实现,霍夫曼信源编码实验报告.docx
  13. 自我提升第n天,自媒体必备工具大全
  14. 【电脑删不掉文件或文件夹】总结7种方法永久删除!
  15. 第十四周项目一 平衡二叉树
  16. Nginx使用memcached外置缓存
  17. java websocket ie8_解决WebSocket兼容ie浏览器版本问题
  18. impala与hive标准差函数的差异
  19. 机器学习、深度学习、神经网络学习资料集合(开发必备)
  20. Mac OS X Lion安装MacPorts(让你在Mac的Shell下更加游刃有余)

热门文章

  1. 心情不好的时候就想化妆……
  2. lighthouse前端性能检测
  3. UltraISO(软碟通)刻录光盘,太简单了
  4. C++_OpenCV获取图像中某个坐标的像素值信息
  5. 你可能不知道的室内无人机秘密都在这里(一)
  6. 计算机ppt继续教育,word、excel、PPT继续教育计算机第四次.doc
  7. 详细介绍BERT模型
  8. c语言declared void,关于c ++:变量或字段声明为void
  9. mysql查看执行计划任务_MySQL_MySQL计划任务(事件调度器) Event Scheduler介绍,要查看当前是否已开启事件调 - phpStudy...
  10. 基于Java的图片字符画(含动图)