文章目录

  • 一、数据库概述
    • 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分为两类:

  • 基于共享文件系统的DBMSAccess
  • 基于客户机——服务器的DBMSMySQLOracleSqlServer

SQL
结构化查询语言( Structure Query Language ):专门用来与数据库通信的语言

登录 MySQLmysql -u root -p root (-h localhost)

二、SQL语言

SQLStructured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中,例如:MySQLOracleSQL Server等。SQL常见标准有:sql92sql99

2.1 SQL语法要求

  • SQL语句可以单行或多行书写,以分号结尾
  • 可以用空格和缩进来来增强语句的可读性
  • 关键字不区别大小写,建议使用大写

2.2 语句分类

  • DDLData Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
  • DMLData Manipulation Language):数据操作语言,用来定义数据库记录(数据);
  • DCLData Control Language):数据控制语言,用来定义访问权限和安全级别;
  • DQLData 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  fromwhere 条件;

② 多表级联删除

delete1,2 from1 别名,2 别名 where 连接条件 and 筛选条件;

③ truncate

truncate table

deletetruncate的对比:

  1. delete可以添加where条件;truncate不可以添加where条件
  2. truncate效率较高
  3. delete删除后,返回受影响的行数;truncate删除后,没有返回受影响的行数
  4. delete删除带自增长列的表,再插入时,自增长列的值从断点处开始新增;truncate删除带自增长列的表,再插入时,自增长列的值从1开始新增
  5. delete支持事务的回滚;truncate不支持事务的回滚
  6. delete属于DMLtruncate属于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

条件表达式的写法:

  • 关系表达式:><>=<==<>!=
  • 逻辑表达式:andornot
  • 模糊查询:likebetween andinis null

2.5.3 排序查询

select 查询列表--3
from 表名--1
where 条件--2
order by 排序列表 asc|desc;--4
  • asc代表的是升序,默认;desc代表的是降序
  • 排序列表支持单个字段、表达式、函数、别名,也支持以上的组合
  • order by子句一般放在查询语句的最后!

2.5.4 函数

① 数学函数:

  1. abs:绝对值
  2. mod:取余
  3. floor:向下取整
  4. truncate:截断
  5. ceil:向上取整
  6. round:四舍五入
  7. rand:随机数

注意:

sql中的round支持两个重载,规则:先按绝对值四舍五入,然后再添加正负。round(x):只保留整数部位;round(x,d):保留小数点后一位。

javaMath.round只支持一个参数,规则:Math.round(x)等价于Math.floor(x+0.5) Math.round(x)

② 字符函数

  1. upper:转换成大写
  2. lower:转换成小写
  3. length:获取字节长度
  4. char_length:获取字符长度
  5. substr:截取子串
  6. trim:去掉前后空格或字符
  7. concat:拼接
  8. strcmp:比较两个字符串大小(-1,0,1)
  9. instr:获取子串第一次出现的索引,如果找不到,返回0;格式:instr(字符串,子串)。注意:sql中起始索引,一般从1开始!

③ 日期函数

  1. now:当前日期+时间
  2. curdate:当前日期
  3. curtime:当前时间
  4. datediff:两个日期天数差
  5. date_format:日期转字符
  6. str_to_date:字符转日期

④ 流程控制函数

  1. if函数:格式:if(条件,结果1,结果2):类似于三目运算符
  2. case结构

⑤ 聚合函数(分组函数)

本质上就是一种函数,语法:select 函数名(实参列表);

单行函数(常见函数):有几行,最终有几个结果;
分组函数(聚合函数):一组中有多行,但最终一个结果,一般用作统计。

分组函数:

  1. sum(参数):求和
  2. avg(参数):平均
  3. max(参数):求最大值
  4. min(参数):求最小值
  5. count(参数):统计个数
  6. count(*):回在给定的选择中(当前条件下的表)

⑥ 分组查询

select 查询列表--4
from 表名--1
where 分组前条件--2
group by 分组的字段--3
having 分组后条件--5
order by 排序列表--6

特点:

  1. 查询列表往往是:分组函数和分组后的字段。换句话说,和分组函数一同查询的字段,一般就是分组后的字段。
  2. 分组查询的筛选有两种:分组前筛选和分组后筛选
连接关键字位置筛选的结果集
分组前筛选wheregroup by前面原始表
分组后筛选havinggroup by后面分组后的查询结果(虚拟表)
  1. 分组查询可以通过单个字段,也可以通过多个字段,中间用逗号隔开

⑦ 连接查询

查询语句中涉及到的字段来自于多张表,将这种查询称为多表连接查询

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 查询列表
from1 别名
inner join2 别名 on 连接条件
inner join3 别名 on 连接条件
【where 筛选条件】
【group by 分组】
【having 分组后筛选】
【order by 排序列表】

sql99语法,使用join连接,并且通过on添加连接条件,语义性更强!连接条件和筛选条件进行了分离,提高维护性和分离性!

外连接

select 查询列表
from 表 别名1
left|right|fullouterjoin 表 别名2 on 别名1.关联列= 别名2.关联列
left|right|fullouterjoin 表 别名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);	   

② 多行子查询

常用关键字:

  • innot in:判断某个字段是否属于子查询结果的某个值
  • any/some:一般搭配条件运算符使用 ,例:where sal>any(1,2,3,4)
  • all: 一般搭配条件运算符使用 ,例:where sal > all(1,2,3,4)

案例:返回其它部门中比job_idit部门任一工资低的员工的员姓名

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 查询列表 from1 union
select 查询列表 from2 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数据库入门学习