Chapter 3 Introduction to SQL

查询二三事(Chapter 3)

select 子句

格式

select语句的格式如下

SELECT <[DISTINCT] c1,c2,...> 
FROM 
[WHERE ]
[GROUP BY  [HAVING ]]
[ORDER BY ]
  • select后的东西可以加上+-*/等符号
  • 条件可以舍去
  • 执行顺序是from,where,select
    为from子句中列出的关系产生笛卡儿积
    在其结果上应用where语句中所指定的条件
    输出select语句中指定的属性或表达式的结果
  • order by 默认升序

Natural join

按照相同的属性对应来连接两张表
先列出两个关系模式中的共同属性,然后是表一的独有属性,表二的独有属性
可以用在from子句中

SELECT [DISTINCT] 列名(或表达式)
FROM 表1 NATURAL JOIN 表2
WHERE 条件

如果两张表中不止一个相同的属性,那么natural join只会在所有同名属性都相同的时候才连接
如果不希望要求所有的都相同时才连接,而是以其中一个属性为连接纽带
可以用这样的形式来
表明将表一与表二按照属性来连接

FROM 表1 JOIN 表2 USING 属性1

集合运算

UNION并

可自动去除重复,要保留的话用UNION ALL

INTERSECT交

可自动去除重复,要保留的话用INTERSECT ALL

EXCEPT差

可自动去除重复,要保留的话用EXCEPT ALL


NULL

  • 用在where语句中
IS NULL
IS NOT NULL
  • 所有含有NULL的运算结果都是NULL
  • 所有含有NULL 的比较都返回unknown
  • OR,AND,NOT
unknown or true=true
unkonwn or false=unknown
unknown or unknown=unknown

true and unknown=unknown
false and unknown=false
unknown and unknown=unknown

not unknown=unknown
  • Aggregate Function会忽略NULL值,除了Count

Aggregate Function

  • avg()
  • min()
  • max()
  • count()
  • sum()

使用聚合函数的时候,如果select的东西有不是聚合函数的,就用group by子句来整合

select avg(salary), company_name
from works
group by company_name;

返回的是各个公司的平均薪水


特殊子句

Exists 结构

exists结构在作为参数的子查询非空时返回true
关系A包含关系B可以写成

NOT EXISTS (B except A)

即不存在有元素在B中却不在A中,也就是B中的全在A中

select Name As Customers
from Customers
where not exists(select * from Orders where Customers.Id=Orders.CustomerId);

对Customers中的每一个tuple进行检查,如果“not exists”后中的查询语句搜索不出任何东西,那么该tuple中的name选择出来

Unique结构

结构在作为参数的子查询中没有重复结果的时候返回true

SELECT 
    T.course_id
FROM
    course AS T
WHERE
    UNIQUE( SELECT 
            R.couse_id
        FROM
            section AS R
        WHERE
            T.course_id = R.course_id);

等效于下面这样的表达

SELECT 
    T.course_id
FROM
    course AS T
WHERE
    1 >= (SELECT 
            COUNT(R.couse_id)
        FROM
            section AS R
        WHERE
            T.course_id = R.course_id);

with子句

用于定义临时关系

WITH 新表名 (c1,c2,...) AS(
    SELECT 子句
)

like 子句

  • 百分号%:匹配任意字符串
  • 下划线_:匹配任意一个字符
select Name
from Department
where Building like '%Waston%';

找到building属性含有Waston子串的tuple,返回其Name属性

  • like子句中使用escape来定义转义字符
like 'abc\%d%' escape '\'

表明匹配以abc%d开头的字符串

  • 可以使用not like搜寻不匹配项

between and

select name
from works
where salary  between 9000 and 10000;

等效于

select name
from works
where salary>=9000 and salary<=10000;

All & Some

用于集合的比较

  • some 表示子查询中的某一条record
    eg. “至少比某一个要大”可用“> some”来表示
SELECT 
    name
FROM
    works
WHERE
    salary > SOME (SELECT 
            salary
        FROM
            works
        WHERE
            company = 'xxxx');

表示找出至少比xxxx公司某一个员工工资高的name

  • all 表示子查询中的所有record
    eg. “大于所有的”可用“> all”来表示
SELECT 
    name
FROM
    works
WHERE
    salary > ALL (SELECT 
            salary
        FROM
            works
        WHERE
            company = 'xxxx');

表示找出比xxxx公司所有员工工资都高的name

数据修改,插入,删除

update中的case语句

case
    when p1 then r1
    when p2 then r2
    when p3 then r3
end

你可能感兴趣的:(Chapter 3 Introduction to SQL)