文章目录
- 一、数据库概述
- 1.1 数据库简介
- 1.2 数据库相关概念
- 二、SQL语言
- 2.1 SQL语法要求
- 2.2 语句分类
- 2.3 DDL
- 2.4 DML
- 2.5 DQL
- 2.5.1 基础查询
- 2.5.2 条件查询
- 2.5.3 排序查询
- 2.5.4 函数
- 2.5.5 笛卡尔乘积
- 2.5.6 sql92 和 sql99 语法
- 2.5.7 子查询
- 2.5.8 分页查询
- 2.5.9 合并查询(联合查询)
- 三、事务
一、数据库概述
1.1 数据库简介
什么是数据库?
数据库是持久化数据的一种介质,可以理解成用来存储和管理数据的仓库!
持久化(persistence
):把数据保存到可掉电式存储设备中以供之后使用。持久化的大多数时候是将内存中的数据存储在数据库中,当然也可以存储在磁盘文件、XML
数据文件中。
为什么要使用数据库?
- 可将数据持久化到硬盘
- 可存储大量数据
- 方便检索
- 保证数据的一致性、完整性
- 安全,可共享
- 通过组合分析,可以产生新数据
1.2 数据库相关概念
DB
数据库(database
):存储数据的“仓库”。它保存了一系列有组织的数据。
DBMS
数据库管理系统( Database Management System
)。数据库是通过DBMS
创建和操作的容器
DBMS
分为两类:
- 基于共享文件系统的
DBMS
(Access
) - 基于客户机——服务器的
DBMS
(MySQL
、Oracle
、SqlServer
)
SQL
结构化查询语言( Structure Query Language
):专门用来与数据库通信的语言
登录 MySQL :mysql -u root -p root (-h localhost)
二、SQL语言
SQL
(Structured Query Language
)是“结构化查询语言”,它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中,例如:MySQL
、Oracle
、SQL Server
等。SQL
常见标准有:sql92
和sql99
2.1 SQL语法要求
SQL
语句可以单行或多行书写,以分号结尾- 可以用空格和缩进来来增强语句的可读性
- 关键字不区别大小写,建议使用大写
2.2 语句分类
DDL
(Data Definition Language
):数据定义语言,用来定义数据库对象:库、表、列等;DML
(Data Manipulation Language
):数据操作语言,用来定义数据库记录(数据);DCL
(Data Control Language
):数据控制语言,用来定义访问权限和安全级别;DQL
(Data Query Language
):数据查询语言,用来查询记录(数据)。
2.3 DDL
库的管理:
创建库:create database [if not exists] 库名
删除库 :drop database [if exists] 库名
表的管理:
① 创建表
create table [if not exists]表名(
字段名 数据类型 [约束] auto_increment,--设置自增长列
字段名 数据类型 [约束],
...
);
② 修改表
alter table 表名 [change|modify|drop|add] column 字段名 字段类型;
修改表名:alter table 表名 rename to 新表名;
修改列名:alter table 表名 change column 列名 新列名 新数据类型
修改字段类型:alter table 表名 modify column 列名 新数据类型
添加新列:alter table 表名 add column 列名 数据类型
③ 删除表
drop table if exists 表名
④ 复制表
- 仅复制表结构:
create table 新表名 like 表名
- 复制表结构+数据:
creat table 新表名 select * from 表名
- 仅复制表中的某些列结构
create table 新表名
select 列名,列名from 表名 where 0
2.4 DML
insert:
① 插入单行
insert into 表名(字段名,字段名,字段名...)
values(值1,值2,值3...);
② 插入多行
方式一:
insert into 表名(字段名,字段名,字段名...)
values(值1,值2,值3...),(值1,值2,值3...)...;
方式二:
insert into 表名(字段名,字段名,字段名...)
select * from 表名
update:
① 单表修改
update 表名 set 字段名 = 新值,字段名=新值 where 条件
② 多表修改
#sql92
update 表名1, 表名2 set 表名1.字段名 = 新值, 表名2.字段名 = 新值 where 条件
#sql99【推荐】
update 表名1 join 表名2
on 表关系
set 表名1.字段名 = 新值, 表名2.字段名 = 新值
where 条件
delete:
① 单表删除
delete from 表 where 条件;
② 多表级联删除
delete 表1,表2 from 表1 别名,表2 别名 where 连接条件 and 筛选条件;
③ truncate
truncate table 表
delete
和truncate
的对比:
delete
可以添加where条件;truncate
不可以添加where
条件truncate
效率较高delete
删除后,返回受影响的行数;truncate
删除后,没有返回受影响的行数delete
删除带自增长列的表,再插入时,自增长列的值从断点处开始新增;truncate
删除带自增长列的表,再插入时,自增长列的值从1开始新增delete
支持事务的回滚;truncate
不支持事务的回滚delete
属于DML
,truncate
属于DDL
2.5 DQL
2.5.1 基础查询
select 查询列表 from 表名
- 查询的结果集是一个虚拟表,并没有真实存在
- 查询列表支持常量、字段(列)、表达式、函数(方法)等
- 去重:
distinct
- 起别名:
as
或空格 - 常见函数:
database()
、version()
、user()
、ifnull()
、concat()
、DESC
2.5.2 条件查询
--sql语句执行顺序如下
select 查询列表--3
from 表名 --1
where 条件表达式;--2
条件表达式的写法:
- 关系表达式:
>
、<
、>=
、<=
、=
、<>
、!=
- 逻辑表达式:
and
、or
、not
- 模糊查询:
like
、between and
、in
、is null
2.5.3 排序查询
select 查询列表--3
from 表名--1
where 条件--2
order by 排序列表 asc|desc;--4
asc
代表的是升序,默认;desc
代表的是降序- 排序列表支持单个字段、表达式、函数、别名,也支持以上的组合
order by
子句一般放在查询语句的最后!
2.5.4 函数
① 数学函数:
abs
:绝对值mod
:取余floor
:向下取整truncate
:截断ceil
:向上取整round
:四舍五入rand
:随机数
注意:
sql
中的round
支持两个重载,规则:先按绝对值四舍五入,然后再添加正负。round(x)
:只保留整数部位;round(x,d)
:保留小数点后一位。
java
中Math.round
只支持一个参数,规则:Math.round(x)
等价于Math.floor(x+0.5) Math.round(x)
② 字符函数
upper
:转换成大写lower
:转换成小写length
:获取字节长度char_length
:获取字符长度substr
:截取子串trim
:去掉前后空格或字符concat
:拼接strcmp
:比较两个字符串大小(-1,0,1)instr
:获取子串第一次出现的索引,如果找不到,返回0;格式:instr(字符串,子串)
。注意:sql
中起始索引,一般从1开始!
③ 日期函数
now
:当前日期+时间curdate
:当前日期curtime
:当前时间datediff
:两个日期天数差date_format
:日期转字符str_to_date
:字符转日期
④ 流程控制函数
if
函数:格式:if(条件,结果1,结果2)
:类似于三目运算符case
结构
⑤ 聚合函数(分组函数)
本质上就是一种函数,语法:select 函数名(实参列表);
单行函数(常见函数):有几行,最终有几个结果;
分组函数(聚合函数):一组中有多行,但最终一个结果,一般用作统计。
分组函数:
sum(参数)
:求和avg(参数)
:平均max(参数)
:求最大值min(参数)
:求最小值count(参数)
:统计个数count(*)
:回在给定的选择中(当前条件下的表)
⑥ 分组查询
select 查询列表--4
from 表名--1
where 分组前条件--2
group by 分组的字段--3
having 分组后条件--5
order by 排序列表--6
特点:
- 查询列表往往是:分组函数和分组后的字段。换句话说,和分组函数一同查询的字段,一般就是分组后的字段。
- 分组查询的筛选有两种:分组前筛选和分组后筛选
连接关键字 | 位置 | 筛选的结果集 | |
---|---|---|---|
分组前筛选 | where | group by 前面 | 原始表 |
分组后筛选 | having | group by 后面 | 分组后的查询结果(虚拟表) |
- 分组查询可以通过单个字段,也可以通过多个字段,中间用逗号隔开
⑦ 连接查询
查询语句中涉及到的字段来自于多张表,将这种查询称为多表连接查询
select 查询列表 from 表名1,表名2;
2.5.5 笛卡尔乘积
现象:表1和表2连接,结果为两表的完全连接结果,数据不正确。表1m
行,表2n
行,结果为:m*n
行
产生原因:没有有效的连接条件
解决办法:添加两个表的连接条件,找到两个表的关联关系。
2.5.6 sql92 和 sql99 语法
连接查询分类 | 支持的连接 |
---|---|
sql92语法 | 内连接:1.等值连接 2.非等值连接 3.自连接 外连接(支持的不太好,MySQL压根不支持) |
sql99语法 | 内连接 等值连接 非等值连接 自连接 外连接 左外连接 右外连接 全外连接(mysql不支持) |
① Sql92 语法
内连接
select 查询列表
from 表名1 别名1,表名2 别名2
where 别名1.关联列 = 别名2.关联列
and 筛选条件
group by 分组字段
having 分组后的筛选条件
order by 排序;
- 多表连接时,一般为表起别名,提高语句的简洁性
- 表是否可以调换顺序,不分主次表!
- 内连接查询,查询的结果为两个表的交集部分
n
表连接,至少需要n-1
个连接条件
自连接
案例:查询每个员工的员工名和领导名
SELECT 员工表.last_name,领导表.last_name
FROM employees 员工表,employees 领导表
WHERE 员工表.manager_id = 领导表.employee_id
② Sql99 语法
内连接
select 查询列表
from 表1 别名
inner join 表2 别名 on 连接条件
inner join 表3 别名 on 连接条件
【where 筛选条件】
【group by 分组】
【having 分组后筛选】
【order by 排序列表】
sql99
语法,使用join
连接,并且通过on
添加连接条件,语义性更强!连接条件和筛选条件进行了分离,提高维护性和分离性!
外连接
select 查询列表
from 表 别名1
left|right|full 【outer】 join 表 别名2 on 别名1.关联列= 别名2.关联列
left|right|full 【outer】 join 表 别名3 on 别名1.关联列= 别名3.关联列
WHERE 筛选条件
GROUP BY 分组
HAVING 分组后条件
ORDER BY 条件;
查询主表中的所有记录,如果从表有和主表匹配的信息,则显示匹配信息,否则显示null
。一般适合查询主表中有,但从表中没有的记录
外连接的结果=内连接结果+主表有从表没有的!
2.5.7 子查询
出现在其他语句内部的select
语句,称为子查询。
① 单行子查询
注意:单行子查询的结果肯定是一行一列,不能是多行,也不能是空值
案例:返回公司工资最少的员工的姓名
select name from emp
where salary = ( select min(salary) from emp);
② 多行子查询
常用关键字:
in
、not in
:判断某个字段是否属于子查询结果的某个值any
/some
:一般搭配条件运算符使用 ,例:where sal>any(1,2,3,4)
all
: 一般搭配条件运算符使用 ,例:where sal > all(1,2,3,4)
案例:返回其它部门中比job_id
为it
部门任一工资低的员工的员姓名
select name from emp
where salary < ANY(select salary
from emp where job_id = it')
group by department_id;
2.5.8 分页查询
实际的开发时,一页往往显示不全所有数据,则用到了分页查询
select 查询列表--6
from 表--1
join 表 --2
on 连接条件--3
where 筛选--4
group by 分组--5
having 分组后筛选--7
order by 排序列表--8
limit 【起始条目数,】查询的条目数; --9
起始条目数可以省略,默认从1开始。
Web
中常用查询当前页数据:
select * from 表名 limit (page-1)*size,size;
2.5.9 合并查询(联合查询)
一个结果集的查询的数据来自于多张表。但多张表之间没有任何关联关系。
select 查询列表 from 表1 union
select 查询列表 from 表2 union
....
select 查询列表 from 表n
- 要求实现
union
的多条查询语句的查询列数必须一致,列名无要求,列的意义无要求,但建议一致 union
默认实现的是去重查询。如果不想去重,则使用union all
三、事务
一组具有一定特点的sql
语句,称为事务。要么全部执行,要么全部不执行。
ACID四大特性:
- A原子性:一个事务不可再分割,要不全部执行,要不全部失败
- C一致性:一个事务执行后,将数据从一种状态切换到另一种状态。保证数据是准确
- I隔离性:一个事务的执行,不应该受其他事务的影响
- D持久性:一个事务的执行,将持久化到硬盘
事务分类:
- 隐式事务:事务没有明显的开启和结束的标记。比如:一条
update
、一条delete
、一条insert
语句 - 显式事务:事务具有明显的开启和结束的标记
# 步骤1:开启事务
# 取消DML语句自动提交功能
set autocommit = 0;
start transaction;
# 步骤2:编写事务的sql语句
update account set balance = 5000 where username = '赵丽颖';
update account set balance = 15000 where username = '冯绍峰';
# 步骤3:结束事务
commit;--提交
rollback;--回滚
# Tips: 事务的语句只支持insert、update、delete、select。
更多推荐
MySQL数据库入门学习
发布评论