数据库基本概念
1.数据库是什么
存储数据的仓库
1.列表 字典....等等 都是内存中的 缺点:断电丢失 优点:速度快
2.文件存储 缺点:速度慢 优点:可以实现永久保存
本质就是一套基于CS结构的 客户端和服务器程序,最终的数据存储在服务器端的磁盘中
2.为什么要使用数据库
直接使用文件存储带来的问题
1.速度慢
2.我们的程序将来 可能后分布在不同的机器上
单台机器 性能肯定有上限,如果一台机器不能够满足,你可以用多个机器共同完成任务
分布式 每个服务器提供不同的服务,有时候某个业务流程可能会涉及到多个服务器
优点: 耦合度降低 易维护,缺点:通讯繁琐,容灾性没有集群好
集群 所有服务器提供的服务是一模一样的, 其优点:容灾性强,易扩展 可插拔
问题:数据分布在不同机器上 如何访问? 通过网络 访问
-
用户权限管理
-
多个客户端并发访问 数据要保证安全
数据库的分类
分为
1.关系型数据库
数据之间可以村存在关联关系 数据库会帮我们维护这种关系
通常存储介质都是磁盘
常见的关系型:
mysql
是我们学习的重点: 是目前最流行的关系型数据库,因为其免费开源,性能不错
目前已经被oracle收购了, 适用于中小型企业
sqlserver
是微软推出的, 因为其只能运行在windows平台所以发展不咋地
oracle sun
目前最强大的关系型数据库,主要是在集群,和用户管理上,非常适合大型企业
db2
IBM的产品,主要面向企业级用户,不差钱的用户 捆绑硬件销售
2.非关系型数据库
没有能帮我们维护数据之间的关系,
通常存储介质都是内存
常见的非关系型:
mongoDB
redis
memcache
数据库重要概念
数据(Column) 文件中的某个字符串
记录(Row) 文件中的某一行
表(Table) 某个文件
库(DataBase) 就是一个文件夹
DBMS 数据库管理系统 (指的就是数据库软件)
数据库服务器 运行DBMS的计算机
3.安装数据库
采用压缩包的方式来安装,解压到本地即可
bin 存储所有执行文件
data 存储数据的位置
简单的使用步骤:
bin下有 mysqld.exe 是服务器端程序 mysql.exe是客户端程序
需要先运行mysqld.exe
运行客户端时,如果直接双击运行进入游客模式
正确的运行方式 是在终端里指定 用户名密码等参数
常见的参数 -h 主机名称 如果是本机 可以忽略
-P 指定端口 默认3306 可以不写
-u 指定用户名
-p 指定密码
添加环境变量
注册系统服务
注册 mysqld --install
删除 sc delete mysql (注意 是服务名称不是文件名称)
启动服务 net start mysql;
停止 服务 net stop mysql;
查找某个进程
tasklist | findstr mysqld
杀死进程
taskkill /f /pid 111111
4.mysql 5.6管理员密码的设置
1.知道原始密码
1.1登录到mysql,进入到mysql数据库,执行更新语句来修改
update user set password = password("123") where host="localhost" and user="root";
刷新全新 flush privileges; 或者重启mysqld
2.2 mysqladmin小工具
mysqladmin -uroot -p123 password 321
-p是原始密码
2.不知道原始密码
2.1删除权限相关的文件 (容易挨打)
2.2 跳过授权表
手动启动mysqld 指定参数
mysqld --skip-grant-tables
update user set password = password("111") where host="localhost" and user="root";
重启mysqld 即可
5.简单的使用
数据必须找个文件存起来 也就是表 , 表必须存在于库中也就是文件夹
第一步应该创建数据库 创建表
库的操作
#切换数据库
use 数据库名称 可以不加分号
#查看所有数据库
show databases;
show create databases; #查看数据库详细信息
#创建新的数据库
create database 数据库名称;
create database 数据库名称 charset utf8; # 指定编码方式
# 删除数据库
drop database 数据库名称;
#修改数据库编码 可以进入到数据库文件夹中修改db.opt
#第一行是编码 第二行是排序规则 自己搜索一个
#修改数据库名 可以直接修改对应的文件夹名称
命名规范:
1.不区分大小写
2.不要使用关键字 例如create select 等.....
3.不能使用纯数字
4.可以下滑线 通常字符下滑线数字的组合
表的操作
#创建表
create table 表名称(列名称 列的数据类型,列名称2 类型2,....) charset gbk;
# 指定编码
create table 表名称(列名称 列的数据类型,列名称2 类型2,....) charset gbk;
#查看当前库下所有表
show tables;
#查看表结构
desc 表名称;
#查看表的创建语句
show create table 表名称;
# 删除表
drop table 名称;
# 清空表数据 重建表
truncate table 名称;
# 修改表结构
# 添加字段
alter table 表名 add 列名称 数据类型;
# 删除字段
alter table 表名 drop 列名称;
# 修改数据类型
alter table 表名 modify 列名称 新的数据类型;
# 修改列名
alter table 表名 change 旧的列名 新的列名称 新的类型;
# 修改表的名称
rename table 旧名称 to 新名称;
# 修改编码
alter table 表名 charset utf8;
7.配置文件的使用
配置文件需要放在 安装目录的根目录,bin同一级
文件名称:my.ini
内容和使用 cfg格式 即 section+option
[mysqld] 分区服务器端配置 修改后需要重启服务器
[mysql] 客户端配置 修改后需要重连
统一编码方式 配置文件如下:
# 客户端 除了mysql之外的 客户端的配置修改后 只需要退出重新连接即可
[client]
user = root
password = 111
default-character-set = utf8
# 服务器端配置 需要重启服务器
[mysqld]
character-set-server = utf8
8.表的分类 数据库引擎
引擎是什么?
引擎就是一个系统最核心的部分,比如汽车的发动机,人的心脏
数据库引擎指的是真正的负责存储数据的模块:
不同的引擎具备不同的特点: 需要根据实际需求来选择最合适的
补充: SQL 全程是结构化查询语句,在关系型数据库中是通用的
查看支持的引擎:
show engines;
创建表指定引擎
create table 名称(字段 类型 ) engine = XXXX;
默认的也是最常用的引擎是innodb
简单的增删改查 CRUD *****
插入数据
insert into 表名 values(v1,v2,....) # 该方式必须保证 插入的数据个数与 表格字段一 一对应
insert into 表名(字段名称1,字段名称2) values(v1,v2) # 该方式必须保证 插入的数据个数与 必须与指定的字段一 一对应
insert into 表名(字段名称1,字段名称2) values(v1,v2),(v1,v2) # 同时插入多条记录
查询
select * from 表名; # *表示全部字段 查询所有记录
select 字段 from 表名 where 条件;
更新:
update 表名 set 字段名称=新的值,字段名称2=值2; #修改所有记录
update 表名 set 字段名称=新的值,字段名称2=值2 where 条件 ; #修改满足条件的记录
删除数据
delete from 表名 ; #删除所有记录
delete from 表名 where 条件; #删除满足条件的记录
#### 练习
创建 student表 包含 姓名 性别 年龄 三个字段
把你周围的4个同学的数据插入表中
把你左边的同学的 性别改为 woman
删除右边的同学
查看所有 年龄 大于 20的 人员
补充: 修改数据库的语法
alter database 数据库名称 cahrset utf8;
select database() 查看当前库
符号必须用英文 插入多条 定义语句 不加符号 中文乱码在创建库的时候指定编码 无法结束 参数没有引号
9.创建表的完整写法
create table 表名称(字段名称 字段类型[(长度整数) 约束]) charset utf8;
10.mysql中的数据类型
1.整数
tinyint 1个字节 无符号的8bit 最大255 有符号7个bit 127 -128
smallint 2个
mediumint 3个
int 4个 最常用 如果你的数据超过10位 用bigint
bigint 8个
注意:1.默认情况整数是有符号的
设置为无符号 unsigned
alter table t2 modify age tinyint unsigned;
create table t2(age tinyint unsigned);
-
mysql5.6 默认是非严格模式, 如果你的数据超出范围 会自动取最大值 一般不要这么搞 会丢失数据
查看当前的sql模式:
select @@sql_mode; @表示全局变量 @@表示会话级变量(局部)
临时设置sql_mode
set @@sql_mode = "xxxxx"
建议直接修改配置文件:
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
指定长度
int(10) 如果你的数据不足10位 用0填充 (需要添加zerofill 这个约束)
对于整数和小数而言 都是用控制 显示填充的最小长度
2.浮点
两种不精确的小数
float 可以精确到 大约5位
double 比float更精确
如果对精确度要求比较高 需要使用decimal 类型
decimal 需要指定 位数如下: 位数不包括小数点
decimal(65,30) 总长最大65 小数30
3.字符串
char 定长字符串
varchar 长度可变的字符串
char(10) 存储abc 占10个字符长度
优点:读取存储速度快于 varchar
缺点: 浪费与磁盘空间
varchar(10) abc 3个字符长度外加一个bit 存储字符长度
优点:节省空间
缺点:速度慢于char类型
如果字符长度不大 建议使用char类型 反之则选择varchar
char 最大范围255
varchar最大 65535
如果不够那就采用text 最大可以存储2的32次方
text
具备编码的大字符串
blob
没有编码的大二进制 可以用来存储 多媒体数据 视频 音频等..... 一般不会存这种数据
都是建一个文件服务器 数据库只保存文件的地址信息
字符串类型中 需要掌握的 char varchar text blob也不常用
注意: mysql会自动将字符串后面的空格删掉 所以你的数据在存储前应该先把空格处理掉
枚举和集合
枚举是提前规定一个范围 你的值只能是其中之一 多选一
集合是提前规定一个范围 你的值可以是其中的多个 多选多
集合在插入数据时 ,多个值之前用逗号隔开 但他们必须包含在同一个字符串内!
4.日期和时间
year
date
time
year date time 都可以用字符串或数字两种方式输入值
datetime
datestamp
datetime和datestamp 只能使用字符串输入
上述所有类型的年份都可以是两位数
0-69 翻译为 2000-2069 70-99 翻译为1790-1999
时间相关的函数和常量
CURRENT_TIME 获取当前时间
now()获取当前时间
11.小结
1.创建表指定引擎 :create table t1(name char(10),age int) engine=innodb;
2.插入数据:insert into t1 values('gg',18),('mm',17);
3.查询:select *from t1;
4.更新:update t1 set name='dd' where name='gg';
5.删除列:delete from t1 where name='dd';
6.测试整型是否有符号:create table t2(age tinyint);
7.测试严格模式:insert into t2 values(200); #会超出范围
8.设置为无符号:alter table t2 modify age tinyint unsigned;
9.测试指定宽度:create table t3(age int(10));
10.浮点float:create table t4(bmi float);
11.浮点decimal指定位数:create table t5(length decimal(20,10)); # 固定位20位,小数点后10位
12.定长字符串:create table t6(name char(10));
13.长度可变字符串:create table t7(name varchar(10));
14.测试字符串后空格的影响: insert into t7 values('ww '); #mysq会自动删除
15.枚举:create table t8(name enum('a','b','c')); insert into t9 values('a'); # 多选一
16.集合:create table t9(name set('a','b','c')); insert into t9 values('a,b'); # 多选多
17.year:create table t10(ind year); insert into t10 values(2019);
18.date:create table t11(ind date); insert into t11 values(20190711);
19.time:create table t12(ind time); insert into t12 values(102030);
20.datetime: create table t13(ind datetime); insert into t13 values(now());
21.timestamp: create table t14(ind timestamp); insert into t14 values(now());