MySQL学习入门
一. MySQL基础篇
1. 为什么要使用数据库与
- 持久化,断电后也能保存
2. 数据库的概念
-
DB:数据库 (Database)
-
即存储数据的‘仓库’。其本质是一个文件系统。它内部保存了一系列有组织的数据
-
DBMS:数据库管理系统 (Database Mangagement System)
-
是一种操纵和管理数据的大型软件,用于建立,使用和维护数据库,对数据库进行统一的管理和控制,用户通过数据库管理系统访问数据库中表内的数据
-
SQL:结构化查询语言 (Structured Query Language)
-
专门用来与数据库通信的语言
3. 常见数据库介绍
Oracle 商业级
SQL Server 商业级
微软开发的大型商业数据库
DB2
常用于银行系统中 IBM公司的数据库产品
PostgreSQL
排母第四 开源
MySQL
开源 排名第一
SyBase
SQLite
手机端的小型数据库 ,零配置,不用安装,不用配置
informix
仅在unix/linux 平台
4. MySQL介绍
开放源代码的关系型数据库管理系统
支持大型数据库,
使用标准的SQL数据语言格式,部分不同
5. RDBMS与非 RDBMS
关系型数据库是DBMS中的主流
5.1 关系型数据库
5.1.1 实质
这种类型的数据库是 最古老的数据库类型,关系型数据库是把复杂的数据结构归结为最简单的二元关系 即 二维表格形式
- 关系型数据库以 行 riw 和 列 column 这一系列的行和列,被称为 表 一组表组成了一个库
- 表与表之间的数据记录有关系,现实世中的各自实体以及实体之间的各自联系均用关系模型来表示,关系型数据库,就是建立在关系模型基础上的数据库
- SQL 就是关系型数据库的查询语言
5.1.2 优势
- 复杂查询 一个表以及多个表之间做非常复杂的数据查询
- 事务支持 安全性很高的数据访问
5.2 非关系数据库
相比于SQL NoSQL泛指非关系型数据库,包括了榜单上的键值型数据库,文档型数据库,搜索引擎和列存储等
键值型数据库
键值型数据库通过 key-Value 键值的方式来存储数据 Redis 最流行的键值型数据库
文档型数据库
存放文档,XML JSON 等格式
搜索引擎数据库
Soir 倒排索引 数据量大的
列式数据库
好处 大量降低系统的 i/o 适合分布式系统 HBase
图像数据库
数据模型主要式以结点和边(关系)来表示
5.3 NOSQL
6. 关系型数据库设计规则
-
关系型数据库的典型数据结构就是数据表,这些数据表的组成都式结构化的
-
将数据放到表中,表再放到库中
-
一个数据库中可以有多个表,每个表都有一个名字,用来标识自己,表名具有唯一性
-
表具有一些特性,这些特性定义了数据再表中如何存储,类似java和Python中 类的设计
6.1 表,记录,字段
6.2 表的关联关系
- 表与表之间的数据记录的关系,现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示
- 四种:一对一关联,一对多关联,多对多关联,自我引用
6.2.1 一对一关联 one-to -one
6.2.2 一对多
6.2.3 多对多
7. MySQL 的安装与下载
p6 p7
一个电脑可以安装多个数据库 5.7 8.0
mysql:密码 599218496
端口号
8.0 3306
5.7 13306
命令行工具启动mysql
# 启动MySql 服务命令
net start MySql服务名 net start MySql80 net start MySql57
# 关闭MySql 服务命令
net stop MySql服务名
退出登录
exit
8. MySQL图形化管理工具
8.1 MySQL Workbench
8.2 Navicat
直接简洁
8.3 SQLyog
8.4 dbeaver
9. 基本的SELECT语句
1. SQL分类
-
DDL 数据定义语言 CREATE \ ALTER\ DROP \RENAME\ TRUNCATE \
-
DML 数据操作语言 INSERT \ DELETE\ UPDATE\ SELECT \ 增删改查
-
DCL 数据控制语言 COMMIT \ ROLLBACK \ SAVEPOINT 回滚 \ GRANT\ REVOKE
2. SQL语言的规则和规范
2.1 基本规则
-
SQL可以写在一行或者多行,为了提高可读性,各子句分行写 ,必要时使用缩进
-
每条命令以 ; \g \G 结束
-
关键字不能被缩写也不能分行
-
关于标点符号
- 字符串,日期时间类型的变量需要使用一对 单引号’‘’ 来表示
- 必须使用英文状态下的半角输入方式
- 列的别名,尽量使用双引号(’‘“),而且不建议省略as
2.2 SQL大小写规范
-
MySQL 在 windows 环境下时大小写不敏感的
-
MySQL 在linux 环境下 是大小写敏感的
- 数据库名,表名,表的别名,变量名是严格区分大小写的
- 关键字,函数名,列名,(字段名)列的别名(字段的别名)是忽略大小写的
-
推荐采用统一的书写规范
- 数据库名,表名,表别名,字段名,字段别名等都小写
- SQL 关键字,函数名,绑定变量都大写
2.3 注释
/**/
#
--
-- ()
2.4 命名规则
- 数据库,表名
3基本的SQL语句
基本SELECT 语句: SELECT 字段1,字段2,…FROM 表名
3.1 SELECT …FROM
SELECT 标识选择哪些列
FROM 标识从哪个表中选择
SELECT * FROM employees;
# * 表示表中所有的字段(列)
3.2 列的别名:
-
重命名一个列
-
便于计算
-
紧跟列名,也可以在列名和别名之间加入关键字AS,别名使用双引号,以便在别名中包含空格或者特殊的字符并区分大小写
-
AS可以省略
-
建议别名简短,见名知义
-
列的别名用 ” “ 双引号,更规范
SELECT id stu_id ,`name` "学生姓名" FROM student; SELECT id stu_id ,`name` 学生姓名 FROM student; SELECT id*12 "stu_id" ,`name` 学生姓名 FROM student; SELECT id*12 stu_id ,`name` 学生姓名 FROM student;
3.3去掉重复行
默认情况下,查询会返回全部行,包括重复行
#错误的
SELECT id,NAME
FROM student;
#正确的 去重的情况
SELECT DISTINCT id,'name'
FROM student;
#错误的
SELECT id,DISTINCT'name'
FROM student;
3.4空值参与运算
# 空值 : null
# null 不等同于 0, '', 'null'
# 空值参与运算,结果一定也为空
# 实际问题的解决方案,引入 IFNULL
3.5 着重号
# 字段名 表名 和关键字重名了,需要用`` 把字段名括起来
SELECT * FROM `order`;
3.6 查询常数
SELECT '尚硅谷', id,'name'
FROM student;
4. 显示表结构
DESCRIBE student; #显示了表中字段的详细信息
#简写
DESC student;
5. 过滤数据
# 查询 id = 4 的信息
SELECT *
FROM student
# 过滤条件,声明在FROM结构的后面
WHERE id = 4 ;
10. 运算符
1. 算数运算符
+ - * / div % mod
#在SQL中,+没有连接的作用,就表示加法运算,此时会将字符串转换为数值,(隐式转换)
SELECT 100 +'1' # 在java 语言中,结果是 1001
FROM DUAL;
# DUAL 是伪表
DIV #整除
# 取模运算 : % mod MOD
2. 比较运算符
比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果伪真则返回1,比较的结果为假则返回0,其他的情况则返回NULL
比较运算符经常被用来作为SELECT查询语句的条件来使用,返回符号条件的结果记录
#<=> # 安全等于
安全等于运算符,与等于运算符的作用是相似的,唯一的区别是<=> 可以用来对NULL进行判断,在两个操作数均为NULL时,其返回是 1,而不为 NULL,当一个操作数为NULL时,其返回值为 0,而不为NULL。
#为NULL生
= <=> <> != >= <=
# IS NULL IS NOT NULL ISNULL
<=> <>
LEAST() GREATEST 最小 最大
SELECT LEAST('g','h') ,GREATEST('C','P')
FROM DUAL;
g P
# BETWEEN AND
SELECT ID ,`name`
FROM student
WHERE id BETWEEN 1 AND 2;
# 包括边界
# IN NOT IN
In 在 not in 不在
SELECT ID ,`name`
FROM student
WHERE id IN (2,4);
# id = 2 或者 4
# LIKE 模糊查询
# % :代表不确定的字符,(0个,1个,多个)
# 查询last——name中包含字符’a'的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%';
# 查询last——name中字符’a'开头的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE 'a%';
# 查询last——name中字符’a'结尾的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE '%a';
# _ : 一个_ 代表一个不确定的字符
# 查询第二个字符时_且第三个字符是 'a' 的员工信息
# 需要使用转义字符 \
SELECT LAST_NAME
FROM employees
WHERE last_name LIKE '_\_a%'
# 正则表达式
REGEXP
3. 逻辑运算符
运算符 | 作用 | 示例 |
---|---|---|
NOT ! | 逻辑非 | |
AND && | 逻辑与 | |
OR || | 逻辑或 | |
XOR | 逻辑异或 最求的 是异 |
注意
OR 可以和AND 一起使用 ,但是在使用时要注意两者的优先级,有意AND的优先级高于OR,因此先对AND两边的操作数进行操作,再与OP中的操作数结合
4. 位运算符
位运算符是在二进制数上进行计算的运算符,位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制数变回十进制数。
运算符 | 作用 | 示例 |
---|---|---|
& | 按位与 AND | |
| | 按位或 OR | |
^ | 按位异或 XOR | |
~ | 按位取反 | |
>> | 按位右移 | |
<< | 按位左移 |
javase
# 在一定范围内满足,每向左移动以为,相当于乘以2,每向右移动以为,相当于除以2
SELECT 4<<1 ,8>>1
FROM DUAL;
11. 排序与分页
1. 排序数据
1.1 排序规则
如果没有使用排序操作,默认情况下查询返回的数据是按照添加的数据的顺序显示的。
-
使用ORDER BY 子句排列
- ASC (ascend) :升序
- DESC descend : 降序
-
ORDER BY 子句 在SELECT 语句的结尾
1.2 单列排序
SELECT id, 'name'
FROM student
ORDER BY id DESC;
1.3 多列排序
SELECT id, 'name'
FROM student
ORDER BY id DESC card_id ASC ;
- 可以使用不在 SELECT 列表中的列排序
- 在对多列进行排序的适合,首先排序的第一列必须有相同的列值,才会对第二列进行排序,如果第一列数据中所有值都是唯一的,将不再对第二列进行排序
2. 分页
2.1 背景
背景1:查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢?
背景2 :表里有4条数据,我们只想看递2,3条数据怎么办呢?
2.2 实现规则
# limit 实现数据的分页显示
# 需求 :每页显示 pageSize 条记录,此时显示第 pageNo页
# 公式; LIMIT (pageNo-1) *pagesize , pagesize ;
# LIMIT : 位置偏移量 条目数
# 结构 : LIMIT 0,条目数 等价于 LIMIT 条目数
SELECT id, 'name'
FROM student
LIMIT 2,2;
MySQL 8.0新特性,LIMIT …OFFSET…
# 表中有107条数据,我们只想要显示第 32 ,33 条数据
SELECT employee_id,last_name
FROM employees
LIMIT 31, 2 ;
# MYSQL 8.0 与上面相同
SELECT employee_id,last_name
FROM employees
LIMIT 2 OFFSET 31 ;
2.3 拓展
不同数据库的语法有不同点
12. 多表查询
多表查询,也称为关联查询,指两个或者多个表一起完成查询操作
前提条件:这些一起查询的表之间是有关系的(一对一,一对多)。他们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键,比如:员工表和部门表,这两个依靠‘’部门编号‘进行关联。
1. 多表查询如何实现:
#多表查询的正确方式,需要有连接条件
SELECT employee_id , department_name
FROM employees,departments
# 两个表的连接条件
WHERE employees.'department_id' = departments.department_id;
#如果查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表。
SELECT employee_id , department_name,employees.department_id
FROM employees,departments
WHERE employees.'department_id' = departments.department_id;
# 建议: 从sql优化的角度,建议多表查询时,每个字段前都指明其所在的表。
#如果给表起了别名,一旦再SELECT 或 WHERE 中使用表名的话,则必须使用表的别名,而不能再使用的表明。
SELECT empt.employee_id , depat.department_name,depat.department_id
FROM employees empt ,departments depat
WHERE empt.'department_id' = depat.department_id;
#如果有n个表实现多表的查询,则需要至少N-1个连接条件
SELECT empt.employee_id , depat.department_name,depat.department_id
FROM employees empt ,departments depat ,loaction loa
WHERE empt.'department_id' = depat.'department_id'
AND depat.'location_id' =loa.'location' ;