zoukankan      html  css  js  c++  java
  • sql server 基础查询和子查询

    在数据库HumanResources(人力管理)库有Department(部门)表。

    基础查询

    查询姓名和组名:

    SELECT [Name]
        ,[GroupName]
    FROM [AdventureWorks].[HumanResources].[Department]
    

    选择行的子集:

    选择行的子集是在Sql语句的where子句后面加上相应的限制条件,当where子句后面的表达式为“真”时,也就是满足所谓的“条件”时,相应的行的子集被返回。

    where子句后面的运算符分为两类,分别是比较运算符和逻辑运算符.

    比较运算符是将两个相同类型的数据进行比较,进而返回布尔类型(bool)的运算符,在SQL中,比较运算符一共有六种,分别为等于(=),小于(<),大于(>),小于或等于(<=),大于或等于(>=)以及不等于(<>),其中小于或等于和大于或等于可以看成是比较运算符和逻辑运算符的结合体。

    而逻辑运算符是将两个布尔类型进行连接,并返回一个新的布尔类型的运算符,在SQL中,逻辑运算符通常是将比较运算符返回的布尔类型相连接以最终确定where子句后面满足条件的真假。逻辑运算符一种有三种,与(AND),或(OR),非(NOT).

    运算符是有优先级的,优先级由大到小排列是:比较运算符>且(And)>非(Or)。运算符也可以通过小括号来改变优先级

    SELECT *
      FROM [AdventureWorks].[HumanResources].[Department]
      WHERE DepartmentID>=1 and DepartmentID<=3 and DepartmentID>=5 or DepartmentID<=7
    

    DepartmentID:DepartmentID<=7

    SELECT *
      FROM [AdventureWorks].[HumanResources].[Department]
      WHERE DepartmentID>=1 and DepartmentID<=3 and (DepartmentID>=5 or DepartmentID<=7)
    

    DepartmentID:[1-3]

    null (空,非必填)

    判断为空不能用 =null,因为null<>null,需要用is null

    字段不为空则返回值,null则返回''isnull(field,'')=''

    order by排序

    order by [field] [ASC/DESC] --ASC从小到大,desc从大到小
    

    视图

    视图可以看作是一个保存的虚拟表,也可以简单看做是保存的一个查询语句。会随着数据的变化而变化

    字段去重(distinct)

    查询所有不同的创建人
    select DISTINCT createname from f_pzk 
    

    多表连接查询

    Student表:StudentName,StudentClassId

    Class表:ClassId,ClassName

    内连接(inner join)

    对表Student和Class进行笛卡尔积,匹配所有ClassID和StudentClassID相等行,选择所有的列
    SELECT *
        FROM [Class] c
           inner join 
           [Student] s
           on c.ClassID=s.StudentClassID    --外键关联
    

    内连接on后面的限制条件不仅仅是等号,还可以使用比较运算符,包括了>(大于)、>=(大于或等于)、<=(小于或等于)、<(小于)、!>(不大于)、!<(不小于)和<>(不等于)。当然,限制条件所涉及的两个列的数据类型必须匹配.

    左连接:left join,右连接:right join,全连接:full join,自关联应该用inner join自关联表有至少一个别名

    聚合函数(group by)

    聚合函数是按照特定规则将多行(Row)数据汇总成一行的函数。数据进行汇总前,可以按照特定的列(column)将数据进行where过滤,再对列分组(Group by),分组后用(Group by)后的(Having)子句进行筛选。

    先查询工作年度为2021数据,再按照createname分组,再查询createname为admin创建的数量
    select createname,count(createname) from f_pzk where gznd=2021 GROUP BY createname HAVING createname='admin'
    

    聚合函数包括:Avg,Sum,Max,Min,Count

    聚合函数不统计null,统计有null值的
    总行数可以直接count(*),count(distinct name)查询不同名的数量

    AVG(ISNULL(VacationHours, 10)) 统计平均值,如果有空按照10计算

    当使用Group By按照多列(Column)进行分组时,按照Group By后面的次序依次遍历分组

    having子句后面不能跟在select语句中出现的别名,而必须将Select语句内的表达式再写一遍:

    不同性别,不同经理手下的员工的病假时间总和,这些经理手下的员工需要大于2个人:
    错误示范:
    SELECT     ManagerID, Gender, SUM(SickLeaveHours) AS SickLeaveHours, COUNT(*) AS EmployeeNumber
    FROM       HumanResources.Employee
    GROUP BY   ManagerID, Gender
    HAVING     (EmployeeNumber > 2)--不可用select后的别名
    正确示范:
    SELECT     ManagerID, Gender, SUM(SickLeaveHours) AS SickLeaveHours, COUNT(*) AS EmployeeNumber
    FROM       HumanResources.Employee
    GROUP BY   ManagerID, Gender
    HAVING     (COUNT(*) > 2)
    

    Having子句最强大的地方莫过于其可以使用聚合函数作为表达式,这是在Where子句中不允许的。

    获取不同经理手下员工的病假时间总和,并且这些经理手下病假最多的员工的请假小时数大于病假最少员工的两倍:
    
    SELECT     ManagerID, SUM(SickLeaveHours) AS TotalSickLeaveHours, COUNT(*) AS EmployeeNumber
    FROM       HumanResources.Employee
    GROUP BY   ManagerID
    HAVING      (MAX(SickLeaveHours) > 2 * MIN(SickLeaveHours))
    

    子查询

    子查询本质上是嵌套进其他SELECT,UPDATE,INSERT,DELETE语句的一个被限制的SELECT语句,在子查询中,只有下面几个子句可以使用

    1. SELECT子句(必须)
    2. FROM子句(必选)
    3. WHERE子句(可选)
    4. GROUP BY(可选)
    5. HAVING(可选,跟group by一起用)
    6. ORDER BY(排序,可选)

    子查询也可以嵌套在其他子查询中,这个嵌套最多可达32层。

    子查询按照子查询所返回数据的类型,可以分为三种,分别为:

    1. 返回一张数据表(Table)
    2. 返回一列值(Column)
    3. 返回单个值(Scalar)

    子查询作为数据源使用

    当子查询在外部查询的FROM子句之后使用时,子查询被当作一个数据源使用,即使这时子查询只返回一个单一值(Scalar)或是一列值(Column),在这里依然可以看作一个特殊的数据源,即一个二维数据表(Table).作为数据源使用的子查询很像一个View(视图),只是这个子查询只是临时存在,并不包含在数据库中。

    SELECT  P.ProductID, P.Name, P.ProductNumber, M.Name AS ProductModelName
    FROM    Production.Product AS P INNER JOIN
        (SELECT     Name, ProductModelID
        FROM    Production.ProductModel) AS M 
    ON P.ProductModelID = M.ProductModelID
    

    子查询作为选择条件使用

    作为选择条件的子查询也是子查询相对最复杂的应用.

    作为选择条件的子查询是那些只返回一列(Column)的子查询,如果作为选择条件使用,即使只返回单个值,也可以看作是只有一行的一列.

    在IN/NOT IN关键字后面的子查询返回一列值(EmployeeID)作为外部查询的选择条件使用.(但是最好不要用IN和NOT IN)
    最好使用EXISTS,NOT EXISTS,JOIN关键字来进行替代. 除了IN之外,用于选择条件的关键字还有ANY和ALL,这两个关键字和其字面意思一样. 和<,>,=连接使用。
    
    SELECT [FirstName]
          ,[LastName]
      FROM [AdventureWorks].[Person].[Contact]
      WHERE ContactID IN 
    
      (SELECT EmployeeID
      FROM [AdventureWorks].[HumanResources].[Employee]
      WHERE SickLeaveHours>68)
    

    不要使用IN 和NOT IN,查询会出错:

    create table test1 (id1 int)
    create table test2 (id2 int)
    
    insert into test1 (id1) values (1),(2),(3)
    insert into test2 (id2) values (1),(2)
    查询test1里面有,test2存在的值:1,2
    select id1 from Test1 where id1 in (select id2 from test2)
    手误写错:
    select id1 from Test1 where id1 in (select id1 from test2)
    查询结果为:1,2,3
    
    insert into test2 (id2) values (NULL)
    查询,在test2中不存在的 test1中的id
    select id1 from test1 where id1 not in (select id2 from test2)
    结果空白。原因:id2包含空值,id1 not in null,不为空
    NULL不等于任何非空的值啊,not in null为任意非空值,3 in 任意非空值
    
    确定有限集可以用in,not in 如:in(1,2,3)
    

    any ,all实现效果:

    any/all 等价效果
    =any in等价
    <>all not in等价
    >any 大于最小值(>max)
    <any 小于最大值(<max)
    >all 大于最大值(>max)
    <all 小于最小值(<min)
    =all 下面说

    =ALL关键字很少使用,这个的效果在子查询中为如果只有一个返回值,则和“=”相等,而如果有多个返回值,结果为空。

    exists子查询

    使用exists子查询,在子查询的where子查询里面写连表条件。

    exists实现:
    select id1 from test1 where EXISTS(select id2 from test2 where id1=id2)
    select id1 from test1 where not EXISTs(SELECT id2 from test2 where id1=id2)
    

    区别相关子查询和无关子查询最简单的办法就是直接看子查询本身能否执行:

    子查询关联外部查询叫相关子查询,外部查询执行一次,子查询执行一次。不能单独执行子查询;

    子查询不关联外部查询叫无关子查询,能执行子查询。(单表单条件也叫无关子查询)

    子查询作为查询值使用

    当子查询作为查询值使用时,只返回单个数值(Scalar) 。用在SELECT语句之后,作为查询值使用。同样分为相关子查询和无关子查询

    SELECT [Name],
          (SELECT COUNT(*) FROM AdventureWorks.Sales.SalesOrderDetail S
          WHERE S.ProductID=P.ProductID) AS SalesAmount
    FROM [AdventureWorks].[Production].[Product] P
    

    针对外部查询的每一行,返回唯一的值。等于:

    SELECT P.Name,COUNT(S.ProductID)
    FROM [AdventureWorks].[Production].[Product] P 
    LEFT JOIN  AdventureWorks.Sales.SalesOrderDetail S
    ON S.ProductID=P.ProductID
    GROUP BY P.Name
    
  • 相关阅读:
    python模块
    python函数进阶
    python函数
    六.python的深浅拷贝
    五.集合及其推导式
    IOS微信显示NAN,中国标准时间日期转换
    Caused by: org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found. Available parameters are [beginTime, endTime, param3, param1, vesselName, param2] 找不到参数的解决方式
    java的nullpointerexception空指针异常,关于使用了timer定时导致service调用问题
    java设置开始时间,定时执行任务
    java多层嵌套集合的json,如何获取多层集合中所需要的value
  • 原文地址:https://www.cnblogs.com/Neroi/p/13897481.html
Copyright © 2011-2022 走看看