数据库、MySQL简介以及SQL语言之DQL
目录
前言
各位小伙伴们,好久不见!经过JavaSE基础的学习,我现在终于来到了数据库阶段。ヾ(@^▽^@)ノ 今天我就向大家简单介绍下数据库以及SQL语言中的数据库查询语言(DQL)。再接下来数据库的学习旅程中博主使用的数据库管理系统都是MySQL,毕竟MySQL免费且比较流行。
一、数据库简介
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
1. 数据库的好处
- 可以持久化数据到本地
- 结构化查询
2. 数据库的常见概念(★)
- DB:数据库,存储数据的容器
- DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
- SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言
3. 数据库存储数据的特点
- 数据存放到表中,然后表再放到库中
- 一个库中可以有多张表,每张表具有唯一的表名用来标识自己
- 表中有一个或多个列,列又称为“字段”,相当于java中“属性”
- 表中的每一行数据,相当于java中“对象”
常见的数据库管理系统(DBMS):mysql、oracle、db2、sqlserver。初学数据库的话推荐大家学习MySQL,因为MySQL开源免费且很多公司都在使用MySQL,流行度较高。接下来我就给大家简单介绍下MySQL。
二、MySQL简介
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
1. MySQL的特点
- MySQL 是开源的,目前隶属于 Oracle 旗下产品。
- MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
- MySQL 使用标准的 SQL 数据语言形式。
- MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
- MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
- MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
- MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。
2. MySQL的优点
- 开源、免费、成本低
- 性能高、移植性也好
- 体积小,便于安装
三、SQL语言之DQL
1. SQL简介及分类
SQL 是用于访问和处理数据库的标准的计算机语言。
① 什么是SQL?
- SQL 指结构化查询语言
- SQL 使我们有能力访问数据库
- SQL 是一种 ANSI (美国国家标准化组织)的标准计算机语言
② SQL 能做什么?
- SQL 面向数据库执行查询
- SQL 可从数据库取回数据
- SQL 可在数据库中插入新的记录
- SQL 可更新数据库中的数据
- SQL 可从数据库删除记录
- SQL 可创建新数据库
- SQL 可在数据库中创建新表
- SQL 可在数据库中创建存储过程
- SQL 可在数据库中创建视图
- SQL 可以设置表、存储过程和视图的权限
③ SQL 的语言分类
- DQL(Data Query Language):数据查询语言 select
- DML(Data Manipulate Language):数据操作语言 insert 、update、delete
- DDL(Data Define Languge):数据定义语言 create、drop、alter
- TCL(Transaction Control Language):事务控制语言 commit、rollback
2. DQL语言
DQL是数据查询语言,属于SQL中的一类,大家从字面意思可以看出这是专门做数据查询的,它最主要的关键字是select。DQL又分为很多种查询类型,接下来我将依次介绍所有查询类型。
2.1 基础查询
(1)语法
select 查询列表 from 表名;
(2)特点
- 查询列表可以是字段、常量、表达式、函数,也可以是多个
- 查询结果是一个虚拟表
(3)示例
① 查询单个字段
select 字段名 from 表名;
② 查询多个字段
select 字段名,字段名 from 表名;
③ 查询所有字段
select * from 表名
④ 查询常量
select 常量值;
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
⑤ 查询函数
select 函数名(实参列表);
⑥ 查询表达式
select 100/1234;
⑦ 起别名
- as:select 字段名 as 别名 from 表名;
- 空格:select 字段名 别名 from 表名;
⑧ 去重
select distinct 字段名 from 表名;
⑨ +(MySQL中的加号)
作用:做加法运算
select 数值+数值; 直接运算
select 字符+数值;先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算
select null+值;结果都为null
⑩【补充】concat函数
功能:拼接字符
select concat(字符1,字符2,字符3,...);
⑪【补充】ifnull函数
功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
select ifnull(commission_pct,0) from employees;
⑫【补充】isnull函数
功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0
2.2 条件查询
(1)语法
select 查询列表
from 表名
where 筛选条件
(2)筛选条件的分类
① 简单条件运算符
> < = <> != >= <= <=>安全等于
② 逻辑运算符
&& and
|| or
! not
③ 模糊查询
like:一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符
between and
in
is null /is not null:用于判断null值
is null与<=>的对比:
(3)示例
① 案例1:查询工资>12000的员工信息
SELECT
*
FROM
employees
WHERE
salary>12000;
② 案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE
NOT(department_id>=90 AND department_id<=110) OR salary>15000;
③ 案例3:查询员工名中包含字符a的员工信息
select
*
from
employees
where
last_name like '%a%';
2.3 排序查询
(1)语法
select 查询列表
from 表
where 筛选条件
order by 排序列表 【asc|desc】
(2)特点
① asc :升序,如果不写默认升序
desc:降序
② 排序列表 支持 单个字段、多个字段、函数、表达式、别名
③ order by的位置一般放在查询语句的最后(除limit语句之外)
(3)示例
① 案例1:查询员工信息,按年薪升序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 ASC;
② 案例2:查询部门编号>=90的员工信息,并按员工编号降序
SELECT *
FROM employees
WHERE department_id>=90
ORDER BY employee_id DESC;
2.4 分组查询
(1)语法
select 分组函数,分组后的字段
from 表
【where 筛选条件】
group by 分组的字段
【having 分组后的筛选】
【order by 排序列表】
(2)特点
(3)示例
① 案例1:查询每个工种的员工平均工资
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
② 案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT job_id,MAX(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
③ 案例3:查询每个工种每个部门的最低工资,并按最低工资降序
SELECT MIN(salary),job_id,department_id
FROM employees
GROUP BY department_id,job_id
ORDER BY MIN(salary) DESC;
2.5 连接查询
(1)含义
当查询中涉及到了多个表的字段,需要使用多表连接
select 字段1,字段2
from 表1,表2,...;
笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决:添加有效的连接条件
(2)分类
按年代分类:
sql92:
等值
非等值
自连接也支持一部分外连接(用于oracle、sqlserver,mysql不支持)
sql99【推荐使用】
内连接
等值
非等值
自连接
外连接
左外
右外
全外(mysql不支持)
交叉连接
(3)SQL92语法
① 等值连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 表1.key=表2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
特点:
1. 一般为表起别名
2. 多表的顺序可以调换
3. n表连接至少需要n-1个连接条件
4. 等值连接的结果是多表的交集部分
② 非等值连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 非等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
③ 自连接
语法:
select 查询列表
from 表 别名1,表 别名2
where 等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
(4)SQL99语法
① 内连接
语法:
select 查询列表
from 表1 别名
【inner】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;
特点:
- 表的顺序可以调换
- 内连接的结果=多表的交集
- n表连接至少需要n-1个连接条件
分类:
- 等值连接
- 非等值连接
- 自连接
② 外连接
语法:
select 查询列表
from 表1 别名
left|right|full【outer】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;
特点:
- 查询的结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
- left join 左边的就是主表,right join 右边的就是主表,full join 两边都是主表
- 一般用于查询除了交集部分的剩余的不匹配的行
③ 交叉连接
语法:
select 查询列表
from 表1 别名
cross join 表2 别名;
特点:类似于笛卡尔乘积
(5)示例
① 案例1:查询部门的员工个数>3的部门名和员工个数,并按个数降序
SELECT COUNT(*) 个数,department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`
GROUP BY department_name
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;
② 案例2:查询员工的工资级别
SELECT salary,grade_level
FROM employees e
JOIN job_grades g
ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;
③ 案例3:查询员工的名字以及其上级的名字
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m
ON e.`manager_id`= m.`employee_id`;
④ 案例4:查询哪个部门没有员工
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;
2.6 子查询
(1)含义
嵌套在其他语句内部的select语句称为子查询或内查询
外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多
外面如果为select语句,则此语句称为外查询或主查询
(2)分类
① 按出现位置
select后面:仅仅支持标量子查询
from后面:表子查询
where或having后面:标量子查询、列子查询、行子查询
exists后面:标量子查询、列子查询、行子查询、表子查询
② 按结果集的行列
标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
表子查询:结果集为多行多列
(3)示例
① 案例1:查询最低工资的员工姓名和工资
select last_name,salary
from employees
where salary=(
select min(salary) from employees
);
② 案例2:查询所有是领导的员工姓名
select last_name
from employees
where employee_id in(
select manager_id
from employees
);
③ 案例3:查询每个部门的平均工资的工资等级
SELECT ag_dep.*,g.`grade_level`
FROM (
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
) ag_dep
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
2.7 分页查询
(1)应用场景
当要查询的条目数太多,一页显示不全
(2)语法
select 查询列表
from 表
limit 【offset,】size;
注意:
offset代表的是起始的条目索引,默认从0开始
size代表的是显示的条目数
公式:
假如要显示的页数为page,每一页条目数为size
select 查询列表
from 表
limit (page-1)*size,size;
(3)示例
① 案例1:查询前五条员工信息
SELECT * FROM employees LIMIT 0,5;
② 案例2:查询有奖金的员工信息,并且工资较高的前10名显示出来
SELECT
*
FROM
employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC
LIMIT 10 ;
2.8 联合查询
(1)含义
union:合并、联合,将多次查询结果合并成一个结果
(2)语法
查询语句1
union 【all】
查询语句2
union 【all】
...
(3)意义
- 将一条比较复杂的查询语句拆分成多条语句
- 适用于查询多个表的时候,查询的列基本是一致
(4)特点
- 要求多条查询语句的查询列数必须一致
- 要求多条查询语句的查询的各列类型、顺序最好一致
- union 去重,union all包含重复项
到此数据库、MySQL简介以及SQL语言中的DQL就介绍完了,我们下期不见不散,拜拜!下期预告:SQL语言之DML & DDL
博主创作不易,小伙伴们快动动你们的小手指,给博主点个赞支持一下吧!