数据库概述
数据库与数据库管理系统
DB(Database):数据库
DBMS(Database Management System):数据库管理系统
SQL:结构化查询语言
数据库与数据库管理系统的关系
一句话总结:DBMS就是管理数据库的软件,如Mysql、Oracle、SQLServer、Redis…
Mysql介绍
MySQL从5.7版本直接跳跃发布了8.0版本,mysql8对源代码进行了重构,最突出的一点是多MySQL Optimizer优化 器进行了改进,性能进一步得到提升
Oracle vs MySQL怎么选?
- Oracle性能、安全性高,但是收费
- Mysql体积小,成本低,代码开源
RDBMS 与 非RDBMS
RDBMS(Relational Database Management System)关系型数据库管理系统
关系型数据库(RDBMS)
关系型数据库就是把复杂的数据结构变成二元结构,也就是二维表格形式
- 关系型数据库以**行(row)和列(column)**的形式存储数据,便于理解。这一系列的行和列组合成表,一组表组合成库
- 表与表之间的数据记录有关系。通过关系模型来表示,关系型数据库就是建立在关系模型基础上的数据库
- SQL就是RDB的查询语言
非关系型数据库(非RDBMS)
可以看作关系型数据库的阉割版,它基于key-value存储值,不需要经过SQL层的解析,性能非常高
Redis、mongo、ES
关系型数据库设计规则
ER模型
平时说的ER(entity-relationship)模型,就是实体之间的联系模型
- 模型中有三个概念是:实体集、属性、联系集
- 一个实体集对应一个表
- 一个实体对应一行,也成为一条记录
- 一个属性对应一列,也称为一个字段
ORM
表 ----- 类
表中数据 ---- 对象
表中列 ---- 属性
表的关联关系
表与表之间的**数据记录**有关系(relationship)。现实世界中的各种实体以及实体之间的各种联系均用 关系模型来表示
分别是以下四种:
- 一对一
- 设计学生表、可以分为常用信息和不常用信息分别建表
- 每个常用信息记录会 一 一 对应不常用信息记录
- 一对多
- 客户表和订单表、分类表和商品表、部门表和员工表
- 一个客户数据可以对应订单表中的多条数据,一个分类可以对应多个商品、一个部门可以有多个员工
- 多对多
- 多对对关系必须用三个表来表示,第三个表被称为连接表,它将多对多关系划分成两个一对多关系
- 一门课程可以被多个学生选择,一学生可以选择多个课程
- 自我引用
基本的SELECT语句
SQL分类
SQL是一种规范,Mysql和Oracle都有对应的实现,但它们都属于SQL
下图形象表达了sql,和DBMS的关系
SQL在功能上可分为:
- DDL(Data Definition Languages、数据定义语言)
- creatre、drop、alter关键字都属于DDL
- DML(Data Manipulation Language、数据操作语言)
- insert、delete、update、select关键字都属于DML
- DCL(Data Control Language、数据控制语言)
- grant、revoke、commit、rollback关键字都属于DCL
因为SQL中查询用的最为频繁,所以也可以把查询语句相关的定义为DQL(Data Query Language、数据查询语言)
还有commit、rollback取出来称为TCL(Transaction Control Language,事务控制语言)
SQL的规范
这个点其实可以在数据库图形化软件中学习,你写好语句然后点击优化,软件给你优化后的就是标准的格式
特殊点注意:
- 反引号:它是为了区分MYSQL的保留字与普通字符而引入的符号。
- 当我们要那他们做表名或字段名的时候,我们要加反引号用于区分避免编译器把这部分认为是保留字而产生错误
- MySQL 在 Linux 环境下是大小写敏感的
- 数据库名、表名、表的别名、变量名严格区分大小写
- Mysql在windows不区分大小写
注释
单行注释:\#注释文字(MySQL特有的方式) 单行注释:-- 注释文字(--后面必须包含一个空格。) 多行注释:/* 注释文字 */
命名规范
导入sql
通过source命令进行导入
win: mysql> source d:\mysqldb.sql linux: mysql> source /home/mysql/w3h5.sql; 或者 mysql -uroot -p123456 w3h5 < /home/mysql/w3h5.sql; 如果已经登陆数据库了,直接输入后面的部分:数据库名 < 数据库文件; dbname < /home/mysql/data.sql
导出sql
mysqldump -uroot -p dbname > data.sql; 最好是加上路径/数据库文件名 mysqldump -uroot -p dbname > /home/mysql/w3h5.sql;
基本语句
下面通过测试如下表来学习语句使用
查看所有
SELECT * FROM pms_brand;
选择特定的列
SELECT id,name,sort,logo FROM pms_brand;
给列起别名
通过AS关键字给列起别名,别名便于计算,见名知意
AS可省略
SELECT id id值, NAME 名字, sort 别名, logo 品牌 FROM pms_brand;
去除重复行
使用关键字DISTINCT去除重复行
SELECT DISTINCT sort FROM pms_brand;
空值参与运算
所有空值参与运算的,结果都为null
在mysql中,空值不等于空字符串。一个空字符串的长度是0。空值的长度是空,它是占用空间的!
显示表结构
使用DESC或全程DESCRIBE
DESC pms_brand;
- Fileld:字段名称
- Type:字段类型
- Null:改列是否能存NULL值
- Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示允许出现多次
- Default:表示该列默认值,如果有,值是多少。
- Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等
过滤数据
通过WHERE关键字来过滤数据
SELECT id, NAME, sort, logo FROM pms_brand WHERE id = 1
运算符
算术运算符
运算符 | 作用 |
+ | 加法 |
- | 减法 |
* | 乘法 |
/ 或 DIV | 除法 |
% 或 MOD | 取余 |
在除法运算和模运算中,如果除数为0,将是非法除数,返回结果为NULL。
比较运算符
通过这些比较运算符,可以判断表中的哪些记录是符合条件的。
- 结果为真则返回 1
- 为假则返回 0
- 不确定则返回 NULL
符号 | 描述 | 备注 |
= | 等于 | |
<>, != | 不等于 | |
> | 大于 |
< | 小于 | |
<= | 小于等于 | |
>= | 大于等于 | |
BETWEEN | 在两值之间 | >=min&&<=max |
NOT BETWEEN | 不在两值之间 | |
IN | 在集合中 | |
NOT IN | 不在集合中 |
<=> | 严格比较两个NULL值是否相等 | 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 |
LIKE | 模糊匹配 | |
REGEXP 或 RLIKE | 正则式匹配 | |
IS NULL | 为空 | |
IS NOT NULL | 不为空 |
常用实例
1、安全等于与 = 的区别在于当两个操作码均为 NULL 时,其所得值为 1 而不为 NULL,而当一个操作码为 NULL 时,其所得值为 0而不为 NULL。 mysql> select 2<=>3; +-------+ | 2<=>3 | +-------+ | 0 | +-------+ mysql> select null=null; +-----------+ | null=null | +-----------+ | NULL | +-----------+ mysql> select null<=>null; +-------------+ | null<=>null | +-------------+ | 1 | +-------------+ 2、BETWEEN关键字的使用 mysql> select 5 between 1 and 10; +--------------------+ | 5 between 1 and 10 | +--------------------+ | 1 | +--------------------+ 3、IN关键字的使用 mysql> select 5 in (1,2,3,4,5); +------------------+ | 5 in (1,2,3,4,5) | +------------------+ | 1 | +------------------+ 4、LIKE关键字的使用 mysql> select '12345' like '12%'; +--------------------+ | '12345' like '12%' | +--------------------+ | 1 | +--------------------+ 5、正则匹配的使用 mysql> select 'beijing' REGEXP 'xi'; +-----------------------+ | 'beijing' REGEXP 'xi' | +-----------------------+ | 0 | +-----------------------+
逻辑运算符
逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0。
运算符号 | 作用 |
NOT 或 ! | 逻辑非 |
AND | 逻辑与 |
OR | 逻辑或 |
XOR | 逻辑异或 |
位运算符
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
运算符号 | 作用 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
! | 取反 |
<< | 左移 |
>> | 右移 |
- 异或是相同为0,不同为1
- 右移也就是把二进制各个位向右边推一位,最后就相当于除以2了
- 左移同理把二进制各个数位向左边推一位,相当于乘2
1、异或运算 mysql> select 3^5; +-----+ | 3^5 | +-----+ | 6 | +-----+ 2、按位右移 mysql> select 3>>1; +------+ | 3>>1 | +------+ | 1 | +------+ 3、位左 mysql> select 3<<1; +------+ | 3<<1 | +------+ | 6 | +------+
运算符优先级
练习
# 1.选择工资不在5000到12000的员工的姓名和工资 SELECT last_name, salary FROM employees WHERE salary NOT BETWEEN 5000 AND 12000 # 2.选择在20或50号部门工作的员工姓名和部门号 SELECT last_name, department_id FROM employees WHERE department_id BETWEEN 20 AND 50 # 3.选择公司中没有管理者的员工姓名及job_id SELECT last_name, job_id FROM employees WHERE manager_id IS NULL # 4.选择公司中有奖金的员工姓名,工资和奖金级别 SELECT last_name, salary, commission_pct FROM employees WHERE commission_pct IS NOT NULL # 5.选择员工姓名的第三个字母是a的员工姓名 SELECT last_name FROM employees WHERE last_name LIKE '__a%'; # 6.选择姓名中有字母a和k的员工姓名 SELECT last_name FROM employees WHERE last_name LIKE '%a%k%' OR last_name LIKE '%k%a%'; # 7.显示出表 employees 表中 first_name 以 'e'结尾的员工信息 SELECT first_name FROM employees WHERE first_name LIKE '%e'; # 8.显示出表 employees 部门编号在 80-100 之间的姓名、工种 SELECT last_name, job_id FROM employees WHERE department_id BETWEEN 80 AND 100; # 9.显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、工资、管理者id SELECT last_name, salary, manager_id FROM employees WHERE manager_id IN(100,101,110);