《SQL经典实例》读书笔记一

《SQL经典实例》介绍了数据库的SQL查询技术和一些基础的查询语句,并且通过实力操作讲解了如何插入,更新,删除数据等相关知识。另外,本书还介绍了如何使用SQL进行日期处理,以及一些其他的SQL语句查询操作。

下面是一些前期准备:

CREATE DATABASE IF NOT EXISTS sql_test;

USE sql_test;

CREATE TABLE IF NOT EXISTS emp(
    EMPNO INT,
    ENAME VARCHAR(255),
    JOB VARCHAR(255),
    MGR INT,
    HIREDATE CHAR(11),
    SAL INT,
    COMM INT,
    DEPTNO INT
);

CREATE TABLE IF NOT EXISTS dept(
    DEPTNO INT,
    DNAME VARCHAR(255),
    LOC VARCHAR(255)
);
INSERT INTO emp VALUES
(7369, "SMITH", "CLERK", 7902, "17-DEC-1980", 800, NULL, 20),
(7499, "ALLEN", "SALESMAN", 7698, "20-FEB-1981", 1600, 300, 30),
(7521, "WARD", "SALESMAN", 7698, "22-FEB-1981", 1250, 500, 20),
(7566, "JONES", "MANAGER", 7839, "02-APR-1981", 2975, NULL, 20),
(7654, "MARTIN", "SALESMAN", 7698, "28-SEP-1981", 1250, 1400, 30),
(7698, "BLAKE", "MANAGER", 7839, "01-MAY-1981", 2850, NULL, 30),
(7782, "CLARK", "MANAGER", 7839, "09-JUN-1981", 2450, NULL, 10),
(7788, "SCOTT", "ANALYST", 7566, "09-DEC-1982", 3000, NULL, 20),
(7839, "KING", "PRESIDENT", NULL, "17-NOV-1981", 5000, NULL, 10),
(7844, "TURNER", "SALESMAN", 7698, "08-SEP-1981", 1500, 0, 30),
(7876, "ADAMS", "CLERK", 7788, "12-JAN-1983", 1100, NULL, 20),
(7900, "JAMES", "CLERK", 7698, "17-DEC-1981", 950, NULL, 30),
(7902, "FORD", "ANALYST", 7566, "03-DEC-1981", 3000, NULL, 20),
(7934, "MILLER", "CLERK", 7782, "23-JAN-1982", 1300, NULL, 10);

INSERT INTO dept VALUES
(10, "ACCOUNTING", "NEW YORK"),
(20, "RESEARCH", "DALLAS"),
(30, "SALES", "CHICAGO"),
(40, "OPERATIONS", "BOSTON");

第一章:检索记录

1.1检索所有的行和列

查看表中的所有数据

SELECT * FROM emp
SELECT empno,ename,job,sal,mgr,hiredate,comm,deptno 
FROM emp

在交互式即席查询中,使用 SELECT * 会更加容易。然而,在编写程序代码时,最好具体指明每一列。虽然执行结果相同,但指明每一列让你能清楚地知道查询语句会返回哪些列。

1.2 筛选行

查看满足指定条件的行
例如:查找部门编号为10的员工

SELECT *
FROM emp
WHERE deptno=10

1.3查找满足多个条件的行

例如,如果你想找出部门编号为 10 的所有员工、
有业务提成的所有员工以及部门编号是 20 且工资低于 2000 美元的所有员工。

SELECT *
FROM emp
WHERE deptno=10
or comm is not NULL
or deptno=20 and sal<=2000

1.4 筛选列

查看特定列的值。
例如,只查看员工的名字、部门编号和工资。

SELECT ename,deptno,sal
FROM emp

1.5 创建有意义的列名

使用 AS 关键字修改检索结果的列名,新的列名被称作别名

SELECT sal as salary ,comm as commission
FROM emp

1.6在WHERE字句中引用别名列

你已经为检索结果集创建了有意义的列名,并且想利用 WHERE 子句过滤掉部分行数据。但
是,如果你尝试在 WHERE 子句中引用别名列,查询无法顺利执行。

SELECT sal as salary ,comm as commission
FROM emp
WHERE salary <5000

[Err] 1054 - Unknown column 'salary' in 'where clause'

把查询包装为一个内嵌视图,这样就可以引用别名列了。

SELECT *
FROM(SELECT sal as salary ,comm as commission
FROM emp) x
WHERE salary <5000

将含有别名列的查询放入内嵌视图,就可以在外层查询中引用别名列。为什么要这么做呢? WHERE 子句会比 SELECT 子句先执行,就最初那个失败的查询例子而言,当 WHERE 子句被执行时,SALARY 和 COMMISSION 尚不存在。直到 WHERE 子句执行完毕,那些别名列才会生效。然而,FROM 子句会先于 WHERE 子句执行。如果把最初的那个查询放入一个 FROM 子句,其查询结果会在最外层的 WHERE 子句开始之前产生,这样一来,最外层的 WHERE 子句就能“看见”别名列了。

1.7串联多列的值

你想将多列的值合并为一列,需要使用内置函数

select ename, job
 from emp 
 where deptno = 10
ENAME JOB
---------- ---------
CLARK MANAGER
KING PRESIDENT
MILLER CLERK

使用从concat函数串联多列的值

SELECT CONCAT(ename,'WORK AS A',job)
FROM emp
WHERE deptno=10

1.8在SELECT 语句里使用条件逻辑

你想在 SELECT 语句中针对查询结果值执行 IF-ELSE 操作。例如,你想生成类似这样的
结果:如果员工的工资少于 2000 美元,就返回 UNDERPAID;如果超过 4000 美元就返回
OVERPAID;若介于两者之间则返回 OK。

在 SELECT 语句里直接使用 CASE 表达式来执行条件逻辑。

SELECT ENAME,SAL,
    CASE WHEN sal <= 2000 THEN 'UNDERPAID'
         WHEN sal >= 4000 THEN 'OVERAID'
         ELSE 'OK'
    END AS status
FROM emp

CASE 表达式能对查询结果执行条件逻辑判断。你可以为 CASE 表达式的执行结果取一个别
名,使结果集更有可读性。就本例而言,STATUS 就是 CASE 表达式执行结果的别名。ELSE
子句是可选的,若没有它,对于不满足测试条件的行,CASE 表达式会返回 Null。

1.9 限定返回行数

使用 LIMIT 子句,来控制返回的行数。

SELECT *
FROM emp
LIMIT 5

1.10 随机返回若干行记录

使用数据库的内置函数来随机生成查询结果。在 ORDER BY 子句里使用该内置函数可以实现查询结果的随机排序。最后要结合 1.9 节中的技巧从随机排序结果里获取限定数目的行。

SELECT *
FROM emp
ORDER BY RAND() LIMIT 5

ORDER BY 子句能够接受一个函数的返回值,并利用该值改变当前结果集的顺序。在本例中,
所有查询都是在 ORDER BY 子句执行结束后才限定返回值的行数。

1.11 查找null值

想查找特定列的值为 Null 的所有行,
要判断一个值是否为 Null,必须使用 IS Null。

SELECT *
FROM emp
WHERE comm IS NULL

Null 值不会等于或者不等于任何值,甚至不能与其自身作比较。因此,不能使用 = 或 !=
来测试某一列的值是否为 Null。

1.12 把NULL替换为实际值

有一些行包含 Null 值,但是你想在返回结果里将其替换为非 Null 值,
可以使用 COALESCE 函数将 Null 值替代为实际值。

SELECT COALESCE(comm,0)
FROM emp

除此之外,CASE 也可以解决这个问题

SELECT CASE
    WHEN comm IS NOT NULL
    THEN COMM
    ELSE 0
    END
FROM emp

尽管 CASE 也能把 Null 值转换成实际值,但 COALESCE 函数更方便、更简洁。

1.13 查找匹配项

你想从编号为 10 和 20 的两个部门中找到名字中含有字母 I 或职位以 ER 结尾的人。

SELECT ename,job
FROM emp
WHERE deptno in (10,20)
AND (ENAME LIKE '%I%' or job like '%er')

被用于 LIKE 模式匹配操作时,运算符 % 可以匹配任意长度的连续字符。大多数 SQL 实现
也提供了下划线(_)运算符,用于匹配单个字符。

猜你喜欢

转载自blog.csdn.net/weixin_42695959/article/details/88310491