数据库学习01
一.认识数据库
1.什么是数据库
数据库—database数据的仓库,应用程序需要持久化数据,生活中和数据相关的都存在数据库中
2.数据库分类:
关系型数据库—oracle(收费的)、MySQL(免费的)、postgresql、SQL server
非关系型数据库——Redis、MangoDB、CouchDB
二.关系型数据库
1.特点
用二维表格来组织数据,有行有列即二维表格,组织和管理数据,方便crud操作(update delete),能避免重复的无效的数据
理论基础:关系代数 + 集合论
2. 术语
(1)
行===记录
列===字段
主键 –唯一确定一条记录的列
(2)数据库的五个基本单位
数据库服务器
数据库
数据表
数据字段(列)
数据行(记录)
3.数据库如何存储数据
数据库服务器:mysql oracle
数据库:boke market
数据表:每一个库里面又有好多的表
数据字段:一个表会有好多字段(表头),姓名、年龄、性别、身高等
数据行:一条真实的数据
4.编程语言:SQL
每一种数据库都有单独的SQL,不同数据库之间不能互相通用
SQL (结构化查询语言)组成部分
(1)DDL ==数据定义语言
三个关键字 create /drop/alter===创建、删除、修改
(2)DML数据操纵语言
三个关键字insert /delete /update
(3)DQL数据查询语言(最重要)
select
(4)DCL数据控制语言
grant /revoke==授权, 收回权限
(5)DTL数据事务语言
三、MySQL简介
1.发展史
MySQL AB前所有者为总部位于瑞典的mysql AB公司所有。AB,的意识在瑞典语中是指”aktiebolag”中文译为”股份公司”的首字母缩写,后来被Oracle公司收购。MySQL 公司是由David Axmark,Allan Larsson和Michael Widenius 3个瑞典人在20世界90年代初期开发的一个关系型数据库。最开始的时候,他们是想用自己的ISAM(索引顺序存取方法)和mSQL(MiniSQL)来做连接访问表格。后来他们发现有很多不方便,于是乎开发了一个几乎跟mSQL API接口几乎一样的数据库引擎。
2.被Oracle公司收购
良好的生态
开源、免费
性能强劲
四.MySQL安装和启动(Linux)
1.方式一:用yum方式安装MySQL
(1)先查看是否安装MySQL——yum search MySQL
官网:MySQL.com—>下载—->找到社区版community server(不用商业版,需要付费)–>选择5.7.22版本(不选8版)—->系统选择红帽子
(2)下载安装包步骤(共下载四部分):
common依赖库; libs 底层依赖库;client;server
在linux中用阿里云下载,创建一个存放文件夹==mkdir mysql(建新文件夹命名为“mysql”)—>cd mysql进入文件夹 —>wget 粘贴网址(下方网址) ,
MySQL官方下载地址:(按照这个顺序下载)
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-common-5.7.22-1.el7.x86_64.rpm
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-libs-5.7.22-1.el7.x86_64.rpm
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-client-5.7.22-1.el7.x86_64.rpm
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-server-5.7.22-1.el7.x86_64.rpm
下载完毕ls命令检查下载好没有
(3)卸载—安装前先用yum安装libaio,卸载mariadb-libs
安装libaio====yum install libaio
卸载mariadb-libs======yum remove mariadb-libs
可以把这几个文件下载到一个单独的目录下然后再用 ls | xargs rpm -ivh
(4)安装==ls| xargs rpm -ivh 把前一个命令的输出作为后一个命令的参数
**【命令】**xargs 把前一个命令的输出作为后一个命令的参数
(5)确认装好了没有=====systemctl start mysqld
版本7以前 ===service mysqld start
( 6 )查看进程状态
ps -aux或者ps -ef====== 查看所有进程状态( 减号可有可无)
【例】
ps -ef | grep mysql 搜索是否有mysql进程
ps -ef | grep mysql | grep - v grep
搜索mysql时但是不要搜索grep(grep -v代表不搜索)
(7)卸载MySQL====== rpm -e <文件名> 移除
2.方式二:源代码安装(编译安装)
关闭防火墙和selinux
service iptables stop
setenforce 0
(1)、安装依赖库
yum -y install make gcc-c++ cmake bison-devel ncurses-devel
(2)、创建mysql用户(但是不能使用mysql账号登陆系统)
useradd mysql -s /sbin/nologin #创建用户mysql,不允许直接登录系统
mkdir -p /var/mysql/data #创建MySQL数据库存放目录
chown -R mysql:mysql /var/mysql/data #设置MySQL数据库目录权限
(3)、下载和安装MySQL
下载
wget -c https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.41.tar.gz
安装
tar -zxvf mysql-5.6.41.tar.gz
cd mysql-5.6.41
配置
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/var/mysql/data \
-DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306
编译并安装
make && make install
(4)、配置MySQL
cd /usr/local/mysql
cp ./support-files/my-huge.cnf /etc/my.cnf #拷贝配置文件
vi /etc/my.cnf #编辑配置文件,在 [mysqld] 部分增加
datadir = /var/mysql/data #添加MySQL数据库路径
./scripts/mysql_install_db --user=mysql #生成mysql系统数据库
#把Mysql加入系统启动
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
vi /etc/rc.d/init.d/mysqld #编辑
basedir=/usr/local/mysql #MySQL程序安装路径
datadir=/var/mysql/data #MySQl数据库存放目录
chmod 755 /etc/init.d/mysqld #增加执行权限
chkconfig mysqld on #加入开机启动
chown -R mysql /usr/local/mysql #修改/usr/local/mysql所属用户为mysql
service mysqld start #启动mysqld
vi /etc/profile #把mysql服务加入系统环境变量:在最后添加一行
export PATH=$PATH:/usr/local/mysql/bin
source /etc/profile #使配置立即生效
mkdir /var/lib/mysql #创建目录
ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock #添加软链接
mysql_secure_installation #设置Mysql密码,根据提示按Y 回车输入2次密码
功能同上:
mysqladmin -u root -p password "123456" #或者直接修改密码
若要设置root用户可以远程访问,执行
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
使授权立即生效
FLUSH PRIVILEGES;
3.启动和运行常用操作
启动服务(改了配置一般是重启)
systemctl start mysqld
确认装好了没有=====systemctl start mysqld
版本7以前 ===service mysqld start
查看启动状态
netstat -nap | grep mysql
进入Mysql===== mysql -u root -p
[root@izwz9ao2nl8wvmgaymeyr0z ~]# mysql -u root -p
Enter password:
查看mysql中所有数据类型
mysql> ? data types
查看Mysql中数
mysql> ? varchar
防火墙打开端口3306设置
五、MySQL安装(windows)
关键一步是环境变量配置,可以设置在cmd黑屏终端中使用
1.安装包安装,一路next安装
2、环境变量配置
(1)计算机–>属性–>高级–>环境变量—>新建Path
C:\Program Files\MySQL\MySQL Server 5.7\bin
(2)打开cmd启动MySql服务
net start mysql57
(3)进入mysql
mysql -u root -p #提示输入密码可进入黑屏中端的Mysql界面
六、Mysql数据类型
数据字段,不同的字段要求有不同的数据类型。
1.整型
数据类型 | 所占字节 | 取值范围 |
---|---|---|
tinyint | 1字节 | -128~127 |
smallint | 2字节 | -32768~32767 |
mediumint | 3字节 | -8388608~8388607 |
int | 4字节 | -2147483648~2147483647 |
bigint | 8字节 | +-9.22*10的18次方 |
无符号-有符号,如何表示负数,最高位代表符号位,如果是1,代表负数,如果是0,代表正数
原码、反码、补码
1000 0001 -1的原码
1111 1110 -1的反码 符号位不变,其它按位取反
1111 1111 -1的补码
八位:表示无符号 0-255 表示有符号 -128-127
int 4个字节
tinyint 1个字节
2.浮点型
数据类型 | 所占字节 | 取值范围 |
---|---|---|
float(m, d) | 4字节 | 单精度浮点型,m总个数,d小数位 |
double(m, d) | 8字节 | 双精度浮点型,m总个数,d小数位 |
decimal(m, d) | decimal是存储为字符串的浮点数 |
浮点是非精确值,会存在不太准确的情况;而decimal叫做定点数,在MySQL内部本质上
是用字符串存储的。实际使用过程中如果存在金额、钱精度要求比较高的浮点数存储,
建议使用decimal(定点数)这个类型。
decimal(m,d) 其本质存字符串
3.字符类型
数据类型 | 所占字节 | 取值范围 |
---|---|---|
char | 0-255字节 | 定长字符串 |
varchar | 0-65535字节 | 变长字符串 |
tinyblob | 0-255字节 | 不超过255个字符的二进制字符串 |
tinytext | 0-255字节 | 短文本字符串 |
blob | 0-65535字节 | 二进制形式的长文本数据 |
text | 0-65535字节 | 长文本数据 |
mediumblob | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
mediumtext | 0-16 777 215字节 | 中等长度文本数据 |
longblob | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
longtext | 0-4 294 967 295字节 | 极大文本数据 |
varbinary(M) | 允许长度0-M个字节 | 不定长字节字符串,值的长度+1个字节 |
binary(M) | M | 允许长度0-M个字节的定长字节字符串 |
区别:
char类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。
varchar把这个大小视为值的大小,长度不足的情况下不用空格补足,只使用存储字符串实际需要的长度,但长于指定的值仍然会被截短。
text类型与blob类型对于字段长度要求超过 255 个的情况下,MySQL提供了text和blob两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像。
binary声音文件等二进制数据类型。
text和blob类型在分类和比较上存在区别。blob类型区分大小写,而 text不区分大小写。大小修饰符不用于各种 blob和text子类型。
4.时间类型
数据类型 | 所占字节 | 取值范围 |
---|---|---|
date | 4字节 | 日期,格式:2014-09-18 |
time | 3字节 | 时间,格式:08:42:30 |
datetime | 8字节 | 日期时间,格式:2014-09-18 08:42:30 |
timestamp | 4字节 | 自动存储记录修改的时间(current_timestamp) |
year | 1字节 | 年份1901~2155 |
datetime : 日期时间
timestamp ;时间戳
int : 时间戳
5.复合类型
数据类型 | 所占字节 | 取值范围 |
---|---|---|
set | 集合类型 | set(“m1”, “m2″, … ,“m63″) |
enum | 枚举类型 | enum(“m1″, “m2″, … ,“m65535″) |
set :多选 比如爱好 篮球-足球-羽毛球
enum : 单选 性别 男-女
6.Enum类型
ENUM 类型因为只允许在集合中取得一个值,有点类似于单选项。在处理相互排拆的数据时容易让人理解,比如人类的性别。ENUM 类型字段可以从集合中取得一个值或使用null值,除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配,MySQL会自动使用插入值的大小写转换成与集合中大小写一致的值。
ENUM 类型在系统内部可以存储为数字,并且从1开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,这个错误值用索引 0 或者一个空字符串表示。
MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。
7.set类型
SET 类型与 ENUM 类型相似但不相同。SET类型可以从预定义的集合中取得任意数量的值。并且与 ENUM 类型相同的是任何试图在 SET 类型字段中插入非预定义的值都会使MySQL插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录,MySQL 将会保留合法的元素,除去非法的元素。
一个 SET 类型最多可以包含 64 项元素。在 SET 元素中值被存储为一个分离的“位”序列,这些“位”表示与它相对应的元素。“位”是创建有序元素集合的一种简单而有效的方式。
并且它还去除了重复的元素,所以SET类型中不可能包含两个相同的元素。
希望从 SET 类型字段中找出非法的记录只需查找包含空字符串或二进制值为 0 的行。
8.Unsigned
UNSIGNED(无符号) 主要用于整型和浮点类型,使用无符号。即没有前面面的负号,所有的数都为正数。
存储位数更长。tinyint整型的取值区间为,-128~127。而使用无符号后可存储0-255个长度。
创建时在整型字段语句后接上unsigned
9.ZEROFILL(0填充-了解)
0(不是空格)可以用来增补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值。
创建时在整型字段语句后接上zerofill
10.auto_increment
自动增加,只用于整型,可以设置起始值,默认为1
常与后面primary key一起使用
创建表时在整型字段后加上:auto_increment=起始值 primary key
修改起始值:alter table user auto_increment=起始值
11.default默认值
default属性确保在没有任何值可用的情况下,赋予某个常量值,这个值必须是常量,因为MySQL不允许插入函数或表达式值。
此外,此属性无法用于BLOB或TEXT列。如果已经为此列指定了NULL属性,没有指定默认值时默认值将为NULL,否则默认值将依赖于字段的数据类型。
创建表时在字段语句后接上:default '值'
12.not null 非空
如果一个字段不能为空,又没有默认值,那么这个字段必须插入值
如果将一个列定义为not null,将不允许向该列插入null值。建议在重要情况下始终使用not null属性,因为它提供了一个基本验证,确保已经向查询传递了所有必要的值。
创建时在字段语句后接上:not null
null为列指定null属性时,该列可以保持为空,而不论行中其它列是否已经被填充。记住,null精确说法是“无”,而不是空字符串或0。
七、Mysql基本操作(crud)
注意书写规范:关键字推荐用大写;SQL语句都要以分号结尾,如果发现指令写错了,添加 \c 清掉所有指令;所有的符号都是英文。
1.注释
在nivacat中写代码用到注释
单行注释:--
多行注释:/* */
也可以在代码后面加comment注释
2.对数据库的操作(database)
(1)连接数据库
mysql -h 服务器地址 -u 用户名 -p密码
(2)创建数据库
分类 | 详解 |
---|---|
基本语法 | create database 数据库名; |
示例 | create database test; |
示例说明 | 创建一个数库,数据库的名字为test |
(3)查看数据库
分类 | 详解 |
---|---|
基本语法 | create database 数据库名; |
示例 | create database test; |
示例说明 | 创建一个数库,数据库的名字为test |
(4)使用数据库(选中库)
分类 | 详解 |
---|---|
基本语法 | use 库名; |
示例 | use test; |
示例说明 | 使用数据库test |
(5)删除数据库
分类 | 详解 |
---|---|
基本语法 | drop database 库名; |
示例 | drop database test; |
示例说明 | 删除一个数据库,数据库的名字为test |
3.表操作(table)
表的基本操作就是增删改查 (crud操作)首先通过mysql -uroot -p 进入数据库系统,创建数据库dudu,进入数据库dudu use dudu,然后才是创建表的过程
创建表开始学习增删改
mysql> create table user(
-> id int auto_increment,
-> name varchar(30) not null,
-> money int not null,
-> province varchar(20) default null,
-> age tinyint unsigned not null,
-> sex enum('女', '男') not null,
-> primary key(id)
-> )engine=innodb default charset=utf8;
【注】单选在插入值的时候,可以直接使用1 2,那么1代表女,2代表男,enum类型如不给值,默认是第一个
(1)创建表
分类 | 详解 |
---|---|
基本语法 | create table 表名(字段名1 字段类型,….字段名n 字段类型n); |
示例 | create table user(username varchar(20),password char(32)); |
示例说明 | 创建一个表名叫user的表,第一个字段为username、表的字段类型为varchar长度为20个长度。第二个字段为password,类型为char,长度也为32个长度。 |
创建表会设置主键primary key
【主键】PRIMARY KEY 约束唯一标识数据库表中的每条记录。
**主键必须包含唯一的值。**
**主键列不能包含 NULL 值。**
**每个表都应该有一个主键,并且每个表只能有一个主键。**
(2)查看表
分类 | 详解 |
---|---|
基本语法 | show tables; |
示例说明 | 显示当前数据库下所有的表 |
(3)查看表字段、表结构
分类 | 详解 |
---|---|
基本语法 | desc 表名; |
示例 | desc user; |
示例说明 | 查看user表的表结构 |
desc user;
(4)删除表:drop table
分类 | 详解 |
---|---|
基本语法 | drop table 表名; |
示例 | drop table user; |
示例说明 | 删除表user |
(5)指定字符集和引擎
查看创建库及表语句
show create database 库名;
show create table 表名;
设置配置文件(统一设置)
存储引擎:default-storage-engine=InnoDB
字符集:character_set_server=utf8
创建表时指定(每次指定)
存储引擎 engine=InnoDB
创建表时指定字符集default charset=utf8
(6)修改字段类型alter
分类 | 详解 |
---|---|
基本语法 | alter table 表名 modify 字段名 varchar(20); |
示例 | alter table user modify username varchar(20); |
示例说明 | 将user表的username的类型改为varchar(20) |
(7)增加字段时控制顺序
分类 | 详解 |
---|---|
基本语法 | alter table 表名 modify 字段名 varchar(20); |
示例 | alter table user modify username varchar(20); |
示例说明 | 将user表的username的类型改为varchar(20) |
分类 | 详解 |
---|---|
基本语法 | alter table 表名 add 字段名 字段类型; |
示例 | alter table user add id int(10) first; |
示例说明 | user表中在最开始位置增加一个字段为id,类型为int,长度为10 |
(8)删除表中字段
分类 | 详解 |
---|---|
基本语法 | alter table 表名 drop 字段名; |
示例 | alter table user drop age; |
示例说明 | 在user表中删除字段age |
(9)表字段改名
分类 | 详解 |
---|---|
基本语法 | alter table 表名 change 字段原名 字段新名 字段类型; |
示例 | alter table user change email em varchar(60); |
示例说明 | 在user表中将字段中的email字段名字为em |
(10)修改表字段排列顺序(了解)
在之前的字段增加和修改语句(add/change/modify)中,最后都可以加一个可选项 first|after。增加表字段时我们已经学过了如何调整顺序。我们现在在来看看另外的change或modify如何来调整顺序。
我们用first做个小实验。
例:alter table user modify em varchar(60) first;
(11)修改表名
分类 | 详解 |
---|---|
基本语法 | alter table 旧表名 rename 新的表名; |
示例 | alter table user rename new_user; |
示例说明 | 将user表名改为new_user |
八.可视化工具
当你去操作数据库的时候,其实有3中方式
(1)使用mysql自带的客户端进行操作
(2)使用一些第三方的可视化工具管理数据库 比如navicate、sqlyog
(3)使用代码去操作数据库,比如python、java、php
九.表之间的实体关系图(ER图)
– 矩形框:实体
– 椭圆:表示属性
– 菱形:关系的从属
十.案例—学校表school
Navicat中打开代码界面(查询)—>查询—>创建查询
1.删除原表===drop
如果存在名为school的数据库就删除它(初次建表的时候用,在公司一般不用,都会提前有人建好)
drop database if exists school;
2..建表===create
创建名为school的数据库并设置默认字符集编码为UTF8 (注意没有破折号),default==代表默认值
drop database if exists school;
create database school default charset utf8; -- 创建名为school的数据库并设置默认字符集为UTF8
3.切换到数据库==use
运行上面语句会创建好名为school的表切换到我们要使用的数据库
-- 切换到schol数据库
use school;
4.创建学院表命名为tb_college
并设置主键primary key
【主键】PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
5.创建学生表(命名为tb_school)
-- 创建学生表(tb_student)
create table tb_student
(
-- 非空约束
给列起名字,然后后面加上数据类型为int
stuid int not null,
-- 数据长度
stuname varchar(4) not null,
-- 设置性别.bit代表一位,设置默认值为1
stusex bit default 1,
stuaddr varchar(50),
-- 设置主键约束
primary key (stuid)
);
删除表(不执行)
drop table if exists tb_student;
-- 创建学生表(tb_student)
create table tb_student
(
stuid int not null comment '学号',
stuname varchar(4) not null comment '姓名',
stusex bit default 1 comment '性别',
stuaddr varchar(50) comment '籍贯',
colid int not null comment '学院编号'
);
-- 添加主键(primary key)约束
alter table tb_student add constraint pk_stuid primary key (stuid);
-- 添加外键(foreign key)约束
alter table tb_student add constraint fk_student_colid
foreign key (colid) references tb_college (colid);
-- 如果存在名为tb_student的表就删除
-- drop table if exists tb_student;
-- 修改名为tb_student的表添加新列
-- alter table tb_student add column stutel char(11);
-- alter table tb_student drop column stutel;
-- 修改表设置stutel列不允许重复(唯一约束/唯一索引)
-- alter table tb_student add constraint uni_tel unique (stutel);
-- 创建课程表(tb_course)
create table tb_course
(
cid int not null comment '课程编号',
cname varchar(20) not null comment '课程名称',
ccredit int not null comment '学分',
primary key (cid)
);
-- 创建学生选课表(tb_sc)
create table tb_sc
(
scid int not null auto_increment comment '选课记录好',
sid int not null comment '学号',
cid int not null comment '课程编号',
scdate datetime default now() comment '选课时间日期',
score decimal(4,1) comment '成绩',
primary key (scid)
);
alter table tb_sc add constraint fk_sc_sid
foreign key (sid) references tb_student (stuid);
alter table tb_sc add constraint fk_sc_cid
foreign key (cid) references tb_course (cid);
-- 插入数据到tb_college表
insert into tb_college (colid, colname, coltel) values
(10, '计算机学院', '028-88556678'),
(20, '外国语学院', '028-88650099'),
(30, '经济管理学院', '028-854440098');
-- 插入数据到tb_student表
insert into tb_student values
(1001, '张三', 1, '四川成都', 10);
-- 删除tb_student表中指定的数据
-- delete from tb_student where stuid=1002;
-- delete from tb_student where stuid in (1001, 1003);
-- delete from tb_student where stuid=1001 or stuid=1003;
-- delete from tb_student where stuid between 1004 and 1010;
-- truncate table tb_student;
-- 更新tb_student表中指定的数据
-- update tb_student set stuaddr='湖南长沙', stutel='13811011119'
-- where stuid=1002 or stuid=1004;