SQL开发

SQL开发


第1章:SQL概述

SQL:Structured Query Language结构化查询语言,它是使用关系模型的数据库应用语言,由IBM上世纪70年代开发出来。后由美国国家标准局(ANSI)开始着手制定SQL标准,先后有SQL-86,SQL-89,SQL-92,SQL-99等标准。

1. SQL的语言规范

  • mysql对于SQL语句不区分大小写,SQL语句关键字尽量大写
  • SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
  • 关键字不能被缩写也不能分行
  • 值,除了数值型,字符串型和日期时间类型使用单引号(’ ')
  • 别名,尽量使用双引号(" "),而且不建议省略as
  • 所有标点符号使用英文状态下的半角输入方式
  • 必须保证所有(),单引号,双引号是成对结束的
  • 可以使用(1)#单行注释 (2)–空格单行注释 (3)/* 多行注释 */

2. 命名规则

  • 数据库、表名不得超过30个字符,变量名限制为29个
  • 必须只能包含 A–Z, a–z, 0–9, _共63个字符
  • 不能在对象名的字符间留空格
  • 必须不能和用户定义的其他对象重名
  • 必须保证你的字段没有和保留字、数据库系统或常用方法冲突
  • 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了
  • 在命令行中的要求:

1554944183905

说明:一个语句可以分开多行编写,以;或\g结束

3. SQL分类

  • DDL(Data Definition Languages):数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。

    • 主要的语句关键字包括CREATEDROPALTER等。
  • DML(Data Manipulation Language):数据操作语言,用于添加、删除、更新和查询数据库记录,并检查数据完整性。

    • 主要的语句关键字包括INSERTDELETEUPDATESELECT等。
    • SELECT是SQL语言的基础,最为重要。
  • DCL(Data Control Language):数据控制语言,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。

    • 主要的语句关键字包括GRANTREVOKECOMMITROLLBACKSAVEPOINT等。

第2章:数据处理之查询

2.1 基本的SELECT语句

2.1.1 SELECT … FROM
SELECT   标识选择哪些列
FROM     标识从哪个表中选择
  • 选择全部列:
SELECT *
FROM   departments;

1554950890895

1554950903518

  • 选择特定的列:
SELECT department_id, location_id
FROM   departments;

1554950947969

1554950953272

2.1.2 列的别名
  • 重命名一个列

  • 便于计算

  • 紧跟列名,也可以在列名和别名之间加入关键字AS,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。

使用别名

SELECT last_name AS name, commission_pct comm
FROM   employees;

1554951616598

1554951622467

SELECT last_name "Name", salary*12 "Annual Salary"
FROM   employees;

1554951648377

1554951655368

2.1.3 去除重复行

默认情况下,查询会返回全部行,包括重复行。

SELECT department_id
FROM   employees;

1554951711115

1554951715923

在SELECT语句中使用关键字DISTINCT去除重复行。

SELECT DISTINCT department_id
FROM   employees;

1554951796570

1554951801044

2.1.4 空值参与运算
  • 所有运算符或列值遇到null值,运算的结果都为null
SELECT employee_id,salary,commission_pct,
12 * salary * (1 + commission_pct) "annual_sal"
FROM employees;
2.1.5 显示表结构

使用DESCRIBE 或 DESC 命令,表示表结构。

DESCRIBE employees;

1554951856201

2.2 过滤数据

2.2.1 SELECT … FROM … WHERE

背景:

1554952199742

  • 使用WHERE 子句,将不满足条件的行过滤掉
  • WHERE子句紧随 FROM子句
SELECT employee_id, last_name, job_id, department_id
FROM   employees
WHERE  department_id = 90 ;

1554952277028

2.2.2 比较运算符
① 基本操作符
操作符 含义
= 等于(不是==)
> 大于
>= 大于、等于
< 小于
<= 小于、等于
<> 或 != 不等于

说明:赋值符号使用 :=

SELECT last_name, salary
FROM   employees
WHERE  salary <= 3000;

1554970744610

② 其它比较运算符
操作符 含义
BETWEEN … AND 在两个值之间(包含边界)
IN(set) 等于值列表中的一个
LIKE 模糊查询
IS NULL 空值

1)BETWEEN … AND

使用 BETWEEN 运算来显示在一个区间内的值

SELECT last_name, salary
FROM   employees
WHERE  salary BETWEEN 2500 AND 3500;

1554970965194

2)IN

使用 IN运算显示列表中的值。

SELECT employee_id, last_name, salary, manager_id
FROM   employees
WHERE  manager_id IN (100, 101, 201);

1554973452273

1554973455598

3)LIKE

  • 使用 LIKE 运算选择类似的值

  • 选择条件可以包含字符或数字:

    • % 代表零个或多个字符(任意个字符)
    • _ 代表一个字符
SELECT	first_name
FROM 	employees
WHERE	first_name LIKE 'S%';
  • ‘%’和‘_’可以同时使用。
SELECT last_name
FROM   employees
WHERE  last_name LIKE '_o%';

1554973588723

ESCAPE

  • 回避特殊符号的:使用转义符。例如:将[%]转为[ %]、[]转为[ ],然后再加上[ESCAPE‘$’]即可。
SELECT job_id
FROM   jobs
WHERE  job_id LIKE ‘IT\_%;

如果使用\表示转义,要省略ESCAPE。如果不是\,则要加上ESCAPE。

SELECT job_id
FROM   jobs
WHERE  job_id LIKE ‘IT$_%escape ‘$‘;

4)NULL

使用 IS (NOT) NULL 判断空值。

SELECT last_name, manager_id
FROM   employees
WHERE  manager_id IS NULL;

1554973812597

2.2.3 逻辑运算符
操作符 含义
&& (或AND) 逻辑且
||(或OR) 逻辑或
NOT 逻辑否
XOR 逻辑异或

1)&& (或AND)

AND要求并的关系为真。

SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary >=10000
AND    job_id LIKE '%MAN%';

1554973941432

2)||(或OR)

OR要求或关系为真。

SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary >= 10000
OR     job_id LIKE '%MAN%';

1554973982466

1554974001609

3)NOT

SELECT last_name, job_id
FROM   employees
WHERE  job_id NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');

1554974033680

1554974039660

4)XOR

select last_name,department_id,salary 
from employees
where department_id in (10,20) XOR salary > 8000;
2.2.4 算术运算符
运算符 说明
+ 加法
- 减法
* 乘法
/ (或div) 除法
%(或mod) 取模
SELECT employee_id,salary,department_id
FROM employees
WHERE department_id MOD 2 = 0;

2.3 排序数据和分页

2.3.1 排序数据
  • 使用 ORDER BY 子句排序

    • ASC(ascend): 升序
    • DESC(descend):降序
  • ORDER BY 子句在SELECT语句的结尾。

SELECT   last_name, job_id, department_id, hire_date
FROM     employees
ORDER BY hire_date ;

1554974255957

1554974260133

SELECT   last_name, job_id, department_id, hire_date
FROM     employees
ORDER BY hire_date DESC ;

1554974822229

1554974827522

SELECT employee_id, last_name, salary*12 annsal
FROM   employees
ORDER BY annsal;

1554974853194

1554974858252

SELECT last_name, department_id, salary
FROM   employees
ORDER BY department_id, salary DESC;

1554974901572

1554974907498

  • 可以使用不在SELECT列表中的列排序。
2.3.2 分页
  • MySQL中使用limit实现分页

  • 背景:查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢?

  • 分页原理

    所谓分页显示,就是将数据库中的结果集,一段一段显示出来需要的条件。

--前10条记录:
SELECT * FROM table LIMIT 0,10;

--第11至20条记录:
SELECT * FROM table LIMIT 10,10;

--第21至30条记录: 
SELECT * FROM table LIMIT 20,10;
  • 公式**:(当前页数-1)每页条数,每页条数*
SELECT * FROM table 
LIMIT(PageNo - 1)*PageSize,PageSize;
  • 注意:limit子句必须放在整个查询语句的最后!

2.4 多表查询

2.4.1 笛卡尔积错误

举例:

1554974984600

从多个表中获取数据:

1554975020388

select last_name, department_name
from employees, departments;

1554975097631

演示笛卡尔积的错误情况:

select count(employee_id) from employees;
输出107select count(department_id)from departments;
输出27select 107*27 from dual;
  • 笛卡尔积会在下面条件下产生

    • 省略连接条件
    • 连接条件无效
    • 所有表中的所有行互相连接
  • 为了避免笛卡尔积, 可以在 WHERE 加入有效的连接条件。

MySQL连接

使用连接在多个表中查询数据。

SELECT	table1.column, table2.column
FROM	table1, table2
WHERE	table1.column1 = table2.column2;
  • 在 WHERE子句中写入连接条件。

  • 在表中有相同列时,在列名之前加上表名前缀。

2.4.2 分类1:等值连接 vs 非等值连接
① 等值连接

1554975496900

SELECT employees.employee_id, employees.last_name, 
       employees.department_id, departments.department_id,
       departments.location_id
FROM   employees, departments
WHERE  employees.department_id = departments.department_id;

1554975522600

1554975526339

多个连接条件与 AND 操作符

1554975606231

区分重复的列名

  • 使用表名前缀在多个表中区分相同的列

  • 在不同表中具有相同列名的列可以用表的别名加以区分。

表的别名

  • 使用别名可以简化查询。

  • 使用表名前缀可以提高执行效率。

SELECT e.employee_id, e.last_name, e.department_id,
       d.department_id, d.location_id
FROM   employees e , departments d
WHERE  e.department_id = d.department_id;

连接多个表

1554978354431

连接 n个表,至少需要n-1个连接条件。
例如:连接三个表,至少需要两个连接条件。

练习:查询出公司员工的 last_name,department_name, city

② 非等值连接

1554978442447

SELECT e.last_name, e.salary, j.grade_level
FROM   employees e, job_grades j
WHERE  e.salary BETWEEN j.lowest_sal AND j.highest_sal;

1554978477013

1554978482652

2.4.3 分类2:自连接 vs 非自连接

1554978514321

  • 当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询

题目:查询employees表,返回“Xxx works for Xxx”

SELECT CONCAT(worker.last_name ,' works for '</
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值