mysql: 数据库
1,认识数据库
数据库:数据的仓库,保存大量数据的地方,有利于对数据的维护。增删改查很方便。
数据库分类:
层次型数据库:现实世界中很多事物是按层次组织起来的。层次数据模型的提出,首先是为了模拟这种按层次组织起来的事物。
网状型数据库:处理以记录类型为结点的网状数据模型的数据库。处理方法是将网状结构分解成若干棵二级树结构,称为系。
关系型数据库:mysql SQLserver oracle
都使用SQL语句操作
分布式数据库:是指数据分存在计算机网络中的各台计算机上的数据库
mysql 数据库
mysql :
世界上最流行的开源数据库,支持几乎任何平台的操作系统
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL 是开源的,所以你不需要支付额外的费用。
MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
MySQL 使用标准的 SQL 数据语言形式。
MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
2 关系型数据库概念
a,由 E.F.Codd博士在1970年提出关系型数据库系统模型
b,它是关系型数据库管理系统的基础
c,关系型数据库模型包含以下3部分内容
i 包含一系列【关系】和【对象】
ii 包含一系列对于关系的操作–>增删改查
iii 包含数据完整性约束
【规范保存到数据库中的数据】
避免冗余数据
- 关系型数据库中的关系是指:
把实际问题的数据分别归成若干个简单的二元关系,
一个二元关系都可以建一个满足一定条件的二维表格
关系==二维表格
hbase :
3 关系型数据库是由一系列二维表组成
二维表:每张表由行和列组成
可以通过Structured Query Language 操作数据库表中的数据
二维表:一行 一条数据
一列(字段) 一类数据
Primary Key:主键
主键:表中的一个列,随便是什么列
要求:非空且唯一
主要用于 唯一的表示一条数据
Foreign Key:外键
为了表结构的优化,所产生的操作,
使用外键进行表和表的关联
外键:值可以为空,可以重复,
如果有值必须是关联表主键中的值.
4 完整性约束条件
【不满足 完整性,数据不能保存到数据库中】
关系完整性是为保证数据库中数据的正确性和相容性,对关系模型提出的某种约束条件或规则
在关系模型中,关系完整性主要是指以下三方面:
a、实体完整性(主键约束):所谓的实体完整性就是指关系(所谓的关系就是表)的主键不能取空值;
比如学生表通常是取学号为主键
b、参照完整性(外键约束):是指参照关系中每个元素的外码要么为空(NULL),要么等于被参照关系中某个元素的主码;
比如今天是9月2日是开学日,大学新生刚来报道,在学生表里,有的学生可能还没来得及分配具体的班,所以这些还未来得及分班的学生教务处可以在学生表里的班级属性取空值NULL(空值代表“不确定”),而哪些已分了班的学生就必须取班级表里的某些属性,比如班级类别,即学生属于哪个班。比如取“软件工程”,”计算机技术应用“等等。参照关系也称为外键表,被参照关系也称为主键表。
c、用户定义的完整性(自定义约束):指对关系中每个属性的取值作一个限制(或称为约束)的具体定义。比如 性别属性只能取”男“或”女“ ,再就是年龄的取值范围,可以取值0-130 ,但不能取负数,因为年龄不可能是负数
横着看:就是看行,是一条数据。
竖着看:就是看列,是某一类数据。
看数据库:
圆饼累加的圆柱都代表数据库,
在关系型数据中都是一张一张表存放的。
每一张表放大都是一个二维表
mysql数据库是不区分大小写的:
列(属性)不区分大小写
sql关键字不区分大小写
'字符串' 区分 大小写
和数据库字符的设置有关
排序规则 : utf8_bin
字段/属性
Table Name:S_customer Table Name:s_dept
id name phone dept_id id name
201 tom 151000 12 10 市场部
202 jak 152000 14 11 教管部
203 tom 159000 11 12 mis部
204 sport 153000 14 14 教学部
解释:
id(Primary key)---主键列(非空且唯一):以后每一个表都有一个id列,因为每一条数据需要一个特殊标示,这个id就是唯一的标示了一条数据。
name:标示这一列都是代表姓名信息
phone:标示这一列都是代表电话信息
dept_id:外键(Foreign key),这样是另一个表的主键(id),表与表之间就是通过这样的外键关联起来。
学习mysql需要了解:
sql中的对象
table:表 。重点学习的对象。
注意:mysql表分为两类
1.系统表:主要用于存储和MySQL数据库服务器相关的数据或者配置;
2.用户表:主要用于存储MySQL的使用者(程序)产生的数据;
view:视图。在表的基础上,以后可能是一个结果作为一个视图
sequence :序列。将来这个序列就是用来产生id主键,主键要求唯一不重复
index:索引,提高我们的检索速度
Program unit:程序单元 在PL/SQL中声明的 存储过程,函数,包Program unit
mysql的组成:
内 ------------------> 外
Data-------------->operation System --> mysql --------->sql,pl/sql----->tools
电脑内存中的数据 打开操作系统 安装mysql软件 执行sql命令 使用各种工具
sql和plsql区别:
sql:structured query language
有结构的 查询 语言 ---->结构化查询语言
第四代: 有结构的查询语言
只关心做什么 不关心怎么做
sql 命令 需要 ; 结尾,标示一条sql语句结尾
需求 : 得到名字叫张三的学生 所有信息
select * from student where name = 'zhangsan';
pl/sql:在存储过程中,在sql语言的基础上增加了逻辑控制功能。
BEGIN
IF c_id <= 0 THEN
RAISE ex_invalid_id;
ELSE
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
END
sql主要操作:
1.select语句
2.数据操纵语言(DML语句)data manipulation language
insert, update, delete
插入 更新 删除
3.数据定义语言(DDL语句)data definition language
create(创建), alter(修改), drop(删除), rename(重命名), truncate(删除表中的数据)
会提交事务
4.事务控制语句(TCL语句)transction control language
commit(提交), rollback(回滚), savepoint(记录点,用来回滚)
5.数据控制语言(DCL语句)data control language
grant【授权】, revoke【回收】
安装数据库 :
3306端口号 mysql的主服务端口号:
使用mysql必须开启mysql主服务
window:安装:安装包(msi)安装
参考0_资料文档中的mysql安装.doc
window:安装:安装包(zip)安装
绿色版:所有配置文件都在解压的位置.
1,下载: mysql-8.0.21-winx64.zip
https://dev.mysql.com/downloads/mysql/
2,解压
3,编写MySQL服务器程序的配置文件,在MySQL的安装目录下创建名为my.ini的文件;
[mysqld]
basedir=C:\\mysql-8.0.21-winx64
datadir=C:\\mysql-8.0.21-winx64\\data
tmpdir=C:\\mysql-8.0.21-winx64\\tmp
bind-address=0.0.0.0
character-set-server=UTF8
port=8021
4.对MySQL数据库服务器进行初始化:
在cmd命令行中输入:
mysqld --initialize-insecure --console
注意:如果要重新初始化,则必须删除data目录中的所有数据才能再次执行该命令;
如果报错 不是内部外部命令,需要把mysql的解压路径 添加到path中
5.将MySQL服务器的启动命令注册为Windows服务;
mysqld install MySQL8021 --defaults-file=c:\mysql-8.0.21-winx64\my.ini
6.启动MySQL服务器:
1.执行命令:net start MySQL8021
2.通过服务管理程序启动;
linux:安装:
1.在线安装:
sudo apt update
sudo apt install mysql-server
2.离线安装:
1.在MySQL官网下载MySQL的安装包:
mysql-server_8.0.21-1ubuntu20.04_amd64.deb-bundle.tar
2.想办法把上面的压缩包拷贝到客户机(虚拟机)中;
3.解压安装包和依赖包:
解压安装包:
tar xvf 安装包.tar
4.安装:
sudo dpkg -i *.deb
-i : install安装的意思
把刚才解压的所有 .deb文件安装
注意:如果在安装的过程中,没有依赖包,则在通过dpkg命令安装deb的时候会报错,因为缺少依赖包,
解决方案是:在执行完dpkg的安装命令之后,
再此执行以下,命令:sudo apt install -f,
该命令会检测系统中未安装完成的软件并继续安装,
在安装的过程中会自动下载依赖包;
5.修改Ubuntu中MySQL的配置文件;
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
port = 8021
character-set-server = UTF8
bind-address = 0.0.0.0
sudo service mysql restart
6.修改Ubuntu中MySQL的用户表中存储的root的用户信息,让其允许远程登录;
mysql -u root -p
update mysql.user set host='%' where user='root';
flush privileges;
安装完成以后:
mysql服务器:安装mysql服务器端程序然后启动相关进程
mysql客户端:用于连接mysql服务器端的工具
mysql数据库:schema,用于存储表的容器
mysql基础前导操作:
1.以管理员方式登录mysql
mysql -h 主机名 -u 用户名 -p
eg: mysql -h localhost -u root -p
输入完回车
会显示 Enter password:
然后输入安装mysql时候输入的root用户密码 root
注意:这里密码输入错误会提示:
C:\Users\gene>mysql -h localhost -u root -p
Enter password: *********
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
这个error就是错误信息,看到这个玩意,就是密码错了。
补充 : mysql -u briup -pbriup mytest
用户名 密码 使用的数据库名
-p后面的是密码
-P 指定端口号
eg: mysql -h 127.0.0.1 -P 3306 -u root -p
-p指定密码
eg: mysql -u root -proot
2.切换需要操作的数据库
语法: use 数据库名
选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。
3,查看mysql数据库下有哪些数据库
show databases;
4,查看定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。
show tables;
5,创建数据库
语法: create database if not exists mytest default charset utf8 collate utf8_general_ci;
eg:
mysql> CREATE DATABASE mytest;
Query OK, 1 row affected (0.00 sec)
6,删除数据库
语法:drop database [if exists] 数据库名;
eg:
mysql> drop database mytest;
Query OK, 0 rows affected (0.02 sec)
7,添加新用户 : mysql数据库 中有一个mysql数据仓库中有一张表 user
mysql数据库使用mysql库下的表user进行维护用户信息。
添加新用户只要向user表中添加一行数据即可。
首先 进入到mysql库中(前提已经使用root用户连接了mysql)
语法:use 数据库名;
eg:
mysql> use mysql;
Database changed
然后使用sql插入一条数据向user表中
INSERT INTO user (host, user, password, select_priv, insert_priv, update_priv) VALUES('localhost', 'briup', PASSWORD('briup'), 'Y', 'Y', 'Y');
但是5.1版本以上就会报错,说某个列不能为null;
所以换:
mysql> create user 'briup'@'%' identified by 'briup';
Query OK, 0 rows affected (0.00 sec)
创建的briup是任意主机都可以连接
用户就创建好了
8.激活用户:使用户生效
使用先创建用户,再授权的方式创建用户,需要执行下面的命令,使用户权限生效。
flush privileges;
补充:
设置与修改密码
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
9.给新用户briup授权
创建并且授权:
grant all on databasename.tablename to 'briup'@'localhost' identified by 'briup';
使用这种方式创建用户,如果用户存在了,权限不会有变化,但可以修改密码。如果用户不存在,则创建用户并授权,立即生效。
eg:
mysql> grant all on *.* to 'briup'@'%' identified by 'briup';
Query OK, 0 rows affected (0.00 sec)
10,导入sql文件(前提,某用户登入,use了某个数据库)
source sql文件路径
eg:
C:\Users\gene>mysql -u briup -p
创建了mytest数据库,如果有的可以忽略
create database if not exists mytest default charset utf8 collate utf8_general_ci;
mysql> use mytest
Database changed
mysql> source D:\bigData\mysql\0_资料文档\briup.sql
注: 这个路径是直接拖拽到cmd中自动显示的
show命令:
show databases [like “%abc%”];查看当前连接的 MySQL 服务器上的所有数据库名;
show tables [from db_name][like “%b%”];查看当前所操作的数据库中的所有表的名字;
show columns from tbl_name;查看某个表中的所有字段/列名,等同于 desc tbl_name;
show index from tbl_name;查看某一张表中的所有索引;
show status;查看 MySQL 服务器的状态信息;
show [session] variables;查看 MySQL 数据库中的变量,如果跟了 session 参数,则查看的是当前连接的会话的变量,反之则是全局变量;
show table status from db_name;查看某个数据库中的表的详细信息;
show grants for user;查看 MySQL 服务器某个用户的权限信息,显示的是给该用户进行授权的 SQL 语句;
show engines;查看 MySQL 数据库所支持的以及默认的数据库引擎;
通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。
InnoDB:是5.5之后(不包括)的MySQL中的默认存储引擎,支持事务,支持外键;效率相对较低;
用于事务处理应用程序,具有众多特性,包括ACID事务支持。
MyISAM: 是5.5以及之前的版本中的默认存储引擎,该存储引擎不支持事务,不支持外键;效率相对较高;
不常用:
Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。
Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。
use 数据库名;选中或者使用某一个数据库。
查看表有哪些列?
desc 表名
学习阶段主要涉及表:
S_EMP :员工表
id id
last_name 后名字 姓
first_name 前名字 名
userid 员工内部编号,没用
start_date 入职日期
comments 注释:记录员工的特点
manager_id 经理的id
title 职称
dept_id 所在部门id外键
salary 工资
commission_pct 提成
S_DEPT:部门表
id id
name 部门名称
region_id 所在地区id的外键
S_REGION :区域表
id id
name 区域名
三张表 主键 外键 关系需要很清楚
s_emp员工表使用外键dept_id 关联 s_detp部门表
s_dept部门表使用外键region_id关联s_region表
mysql二维表中列的数据类型:
整型:tinyint,smallint,mediumint,int,integer,biginit。使用的时候需要注意的是数据类型后面所指定的长度。
浮点型:float,double,doubleprecision,real,decimal
日期类型:date,datetime,time,timestamp,year
字符型:char ,varchar,blob(存储很大的二进制数据)、clob(存储大量的字符数据,该数据类型在 MySQL 中不被支持)和 text 这两个以及他们的衍生版。
枚举类型和集合类型:在定义列(字段)的时候指定该字段所能使用的数据有哪些,在插入数据的时候,该列的数据只能是定义的时候所列出的任意一个。
在 MYSQL 中没有 Boolean 类型,当表达式成立时为 1,不成立时为 0。
常用:
整数类型: int
小数类型: double
日期类型: date
字符类型: char varchar
char 0-255 bytes 定长字符串
varchar 0-65 535 bytes 变长字符串
blob 0-65 535 bytes 二进制形式的长文本数据
text 0-65 535 bytes 长文本数据
0-65kb
longblob 0-4 294 967 295 bytes 二进制形式的极大文本数据
longtext 0-4 294 967 295 bytes 极大文本数据
0-4G
1,字符类型:
1.1:CHAR(8) 定长字符类型:占用空间固定
00000tom
0000lisi
hello world 不能保存
1.2:VARCHAR(8) mysql 变长字符类型:占用空间 跟着输入有关
1.3:VARCHAR2(8) mysql 变长字符类型:占用空间 跟着输入有关
tom
lisi
hello world 不能保存
mysql中字符串用 ''表示
mysql关键字不区分大小写,但是字符串区分大小写
2,超级长字符,整本小说的所有字符串 可以保存
oracle: CLOB:
mysql : longtext
3,BLOB:字节数组:可以用于保存文件的二进制字节数组.
字节数组: byte[]
4.日期型:
1.date类型:
2020年08月25日
字符串表示:'2020-08-25',也是date类型的默认展示形式;
数值表示:20200825
2.time类型:
16时08分20秒
字符串表示:'16:08:20',也是time类型的默认展示形式;
数值表示:160820
3.datetime类型:是date类型和time类型的结合体,date和time中间以空格分隔;
2020年08月25日16时11分20秒
字符串:'2020-08-25 16:11:20'
数值:20200825161120
4.timestamp类型:
1.和Java中的时间戳含义不同;
2.此类型和datetime基本一致,只是取值范围不同;
5.枚举类型:
1.语法:
enum('值1','值2',...) 65535个值
2.对于该类型的字段的值,只能从后面的值中任选其一;
3.枚举类型的数据对枚举值进行了编号,从1开始到65535,所以在添加数据值,添加编号也可以;
6.集合类型:
1.语法:
set('值1','值2',...) 64个值
2.对于该类型的字段的值,可以从后面的值中选0个或者多个;
3.集合类型对元素也进行了编号,不过编号方式为1,2,4,8,16,...,在添加数据是也可以使用数值的和表示多个集合元素;
这俩类型的本质都是字符串;
7.布尔类型:在MySQL中,0表示false,非0表示true;一般在编程时,Java中的布尔类型对应到MySQL中是tinyint类型;
select 语句 :作用:查询数据
1:distinct :消除重复行,有多条重复数据就只会显示一条
语法:
select [distinct] {*|(列名1,列名2...)}
from table;
* : 所有的列
样例:
(1)查询s_dept表中的所有信息
eg:
select id,name,regin_id from s_dept;
select * from s_dept;
desc 表;
查看表的列信息
(2)查询s_emp表中的last_name,salary
eg:
select last_name,salary from s_emp;
(3)查看s_emp表id,last_name,salary字段信息(列)
eg:
select id,last_name,salary from s_emp;
字段 == 属性 == 列
(5) 查询所有部门名
eg:
select name from s_dept;
(5.1) 去除重复的行
select distinct name from s_dept;
2,起别名:给某一个列 起别名
语法:
select 列1 as 新列名字,列2 as 新列名字…
from 表
a.使用as
b.空格后直接跟别名
select 列1 别名1,列2 别名2...
from 表
c.使用双引号区分大小写
3, 算术运算符 + - * /
oracle:数据库中有一个测试的哑表dual表,只有一行一列。
oralce : select * from dual;
mysql :中有类似的哑表,就是不写 from 某表。
mysl : select *; (当然这就代码是错的,就给你感受下,啥是不写form)
eg:测试进行加减乘除操作
eg:select 100*20+1;
【查询出来的列是可以运算的】
eg: 当月工资 加 100;
select
eg:查询 s_emp 中last_name 列和年薪
select 12*salary*(1+commission_pct/100) 年薪 from s_emp;
4,ifnull(参数一,参数二):空值函数
参数一 : 可能为空的列,
参数二 : 如果参数一的列为空 就使用参数二的值代替
单纯查工资和提成:
egs:
select 12salary(1+ ifnull(commission_pct,0) /100) 年薪
from s_emp;
eg: 查询当月工资:
使用ifnull空值函数 进行操作