第1章 数据库概述
1.1 什么是数据库
存储和管理数据的仓库。
#持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。
1.2 数据库相关概念
DB:数据库( database ):存储数据的“仓库”。它保存了一系列有组织的数据。
DBMS:数据库管理系统( Database Management System )。数据库是通过 DBMS 创
建和操作的容器
SQL:结构化查询语言( Structure Query Language ):专门用来与数据库通信的语言。
1.3 数据库存储数据的特点
- 将数据放到表中,表再放到库中
- 一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。
- 表具有一些特性,这些特性定义了数据在表中如何存储,类似python中 “类”的设计。
- 表由列组成,我们也称为字段。所有表都是由一个或多个列组成的。
- 表中的数据是按行存储的。
第2章 SQL语句
2.1 SQL概述
1. 什么是SQL
SQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中,例如:MySQL、Oracle、SQL Server等。
虽然SQL可以用在所有关系型数据库中,但很多数据库还都有标准之后的一些语法,我们可以称之为“方言”。例如MySQL中的LIMIT语句就是MySQL独有的方言,其它数据库都不支持!
2. SQL语法要求
- SQL语句可以单行或多行书写,以分号结尾;
- 可以用空格和缩进来来增强语句的可读性;
- 关键字不区别大小写,建议使用大写;
2.2 分类
- DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;如:creat/drop/alter
- DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);如:insert/update/delete
- DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
- DQL(Data Query Language):数据查询语言,用来查询记录(数据);如:select。
2.3 DQL
DQL就是数据查询语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
语法:
SELECT
selection_list /*要查询的列名称*/
FROM
table_list /*要查询的表名称*/
WHERE
condition /*行条件*/
GROUP BY
grouping_columns /*对结果分组*/
HAVING
condition /*分组后的行条件*/
ORDER BY
sorting_columns /*对结果分组*/
LIMIT
offset_start, row_count /*结果限定*/
第3章 基础查询
语法:
select 查询列表 from
特点:
1、查询的结果集是一个虚拟表;
2、select后面跟的查询列表,可以有多个部分组成,中间用逗号隔开。例如:select 字段1,字段2,表达式 from 表;
3、执行顺序 ① from子句 ② select子句 ;
4、查询列表可以是:字段、表达式、常量、函数等。
(1)超级基础的语句:
(2)其他查询集合:
其中,mysql中+的作用——加法运算
①两个操作数都是数值型:100+1.5
②其中一个操作数为字符型:将字符型数据强制转换成数值型;如果无法转换,则直接当做0处理,如:'张无忌'+100 100
③其中一个操作数为null:
null+null null
null+100 null
|再多学亿点|:
ifnull
表达式1:可能为null的字段或表达式
表达式2:如果表达式1为null,则最终结果显示的值
功能:如果表达式1为null,则显示表达式2,否则显示表达式1
注:类似于excel里的函数iferror()。
SELECT commission_pct,IFNULL(commission_pct,'空') FROM employees;
使用ifnull可以替换null值哦~
第4章 条件查询
语法:
select
from
where
执行顺序:
①from子句
②where子句
③select子句
特点:
(1) 按关系表达式和逻辑表达式筛选
#案例1:查询部门编号不是100的员工信息
SELECT *
FROM employees
WHERE department_id <> 100;
#案例2:查询工资<15000的姓名、工资
SELECT last_name,salary
FROM employees
WHERE salary<15000;
#案例3:查询部门编号不是 50-100之间员工姓名、部门编号、邮箱
#方式1:
SELECT last_name,department_id,email
FROM employees
WHERE department_id <50 OR department_id>100;
#方式2:
SELECT last_name,department_id,email
FROM employees
WHERE NOT(department_id>=50 AND department_id<=100);
#案例4:查询奖金率>0.03 或者 员工编号在60-110之间的员工信息
SELECT *
FROM employees
WHERE commission_pct>0.03 OR (employee_id >=60 AND employee_id<=110);
(2)模糊查询
like
#案例1:查询姓名中包含字符a的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '%a%';
#案例2:查询姓名中包含最后一个字符为e的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '%e';
#案例3:查询姓名中包含第一个字符为e的员工信息
SELECT *
FROM employees
WHERE last_name LIKE 'e%';
#案例4:查询姓名中包含第三个字符为x的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '__x%';
#案例5:查询姓名中包含第二个字符为_的员工信息
-- 方式1
SELECT *
FROM employees
WHERE last_name LIKE '__%';
-- 方式2
SELECT *
FROM employees
WHERE last_name LIKE '_$_%' ESCAPE '$';
注意到案例5了吗?如果要查询通配符可以使用''或者命令escape
in
#案例1:查询部门编号是30/50/90的员工名、部门编号
#方式1:
SELECT last_name,department_id
FROM employees
WHERE department_id IN(30,50,90);
#方式2:
SELECT last_name,department_id
FROM employees
WHERE department_id = 30
OR department_id = 50
OR department_id = 90;
#案例2:查询工种编号不是SH_CLERK或IT_PROG的员工信息
#方式1:
SELECT *
FROM employees
WHERE job_id NOT IN('SH_CLERK','IT_PROG');
#方式2:
SELECT *
FROM employees
WHERE NOT(job_id ='SH_CLERK'
OR job_id = 'IT_PROG');
between _ and _
#案例1:查询部门编号是30-90之间的部门编号、员工姓名
#方式1:
SELECT department_id,last_name
FROM employees
WHERE department_id BETWEEN 30 AND 90;
#方式2:
SELECT department_id,last_name
FROM employees
WHERE department_id>=30 AND department_id<=90;
#案例2:查询年薪不是100000-200000之间的员工姓名、工资、年薪
SELECT last_name,salary,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
WHERE salary*12*(1+IFNULL(commission_pct,0))<100000 OR salary*12*(1+IFNULL(commission_pct,0))>200000;
SELECT last_name,salary,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
WHERE salary*12*(1+IFNULL(commission_pct,0)) NOT BETWEEN 100000 AND 200000;
is null/is not null
#案例1:查询没有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct IS NULL;
#案例2:查询有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL;
补充:
符号 | 备注 |
= | 只能判断普通的内容 |
is | 只能判断NULL值 |
<=> | 安全等于,既能判断普通内容,又能判断NULL值 |
第5章 排序查询
语法:
select
from
where
order by
执行顺序:
①from子句
②where子句
③select子句
④order by 子句
特点:
1、排序列表可以是单个字段、多个字段、表达式、函数、列数、以及以上的组合
2、升序 ,通过 asc ,默认行为;降序 ,通过 desc
一、按单个字段排序
#案例1:将员工编号>120的员工信息进行工资的降序
SELECT *
FROM employees
WHERE employee_id>120
ORDER BY salary DESC;
二、按表达式排序
#案例1:对有奖金的员工,按年薪降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
三、按别名排序
#案例1:对有奖金的员工,按年薪降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 DESC;
|小芝士|:
where不可以用select中的别名,但是order by可以用,为什么呢?
因为where是在select语句执行前执行的,而order by则是在select语句之后执行的。
在where“召唤”别名的时候,别名还没有“出生”呢!
四、按函数的结果排序
#案例1:按姓名的字数长度进行升序
SELECT last_name
FROM employees
ORDER BY LENGTH(last_name);
五、按多个字段排序
#案例1:查询员工的姓名、工资、部门编号,先按工资升序,再按部门编号降序
SELECT last_name,salary,department_id
FROM employees
ORDER BY salary ASC,department_id DESC;
六、补充选学:按列的顺序数排序
#按照表中的第二列进行降序排序
SELECT * FROM employees
ORDER BY 2 DESC;
注:此方法可以省去写具体列名