数据库
数据库
1.数据库管理系统:是一个软件用来处理数据的
2.关系型数据库:mysql,orcale,db2,mariadb,sql server,存在硬存
方式:打开连接,切到一个文件下/找到一个文件/打开文件/读写记录/关闭文件(优化,加锁处理,权限认证),关闭连接
3.安装数据库:安装数据库管理系统;
创建数据库:创建一个文件夹
4.非关系数据库:数据都是以key=value的形式存放的,放在内存中,支持持久化;redis,mecache
5.数据库服务器:安装有数据库管理系统软件的一台机器
6.数据库中的一条记录相当于文件中的一行内容;数据库中的一个表相当于一个文件;数据库中的一个库相当于一个文件夹。
7.mysql基本使用
(1)登录数据库
mysql -uroot -p123
(2)查看用户
select user();
(3)退出
quit exit \q
(4)查看帮助信息
help create user;
(5)创建账号
- create user '用户名'@'192.168.32.*(ip地址)' identified by '密码'; #同一局域网之类的可以远程连接
- create user '用户名'@'192.168.32.3(ip地址)' identified by '密码'; #只有'192.168.32.3'可以远程连接
- create user '用户名'@'%' identified by '密码'; #所有的电脑可远程连接
(6)授权
- grant all privileges;
- grant all on db1.t1 to 'egon'@'%';
- grant all on *.* to 'egon'@'%';
- flush privileges; #刷新权限
(7)创建账号同时授权
grant all on *.* to 'alex'@'%' identified by '123';
flush privileges;
(8)远程连接mysql
mysql -uegon -p123 -h 192.168.11.55
(9)查看所有的数据库
show databases;
(10)查看数据库里的用户名与ip
select user,host from mysql.user;
8.数据库中的增删改查
(1)操作库(文件夹)
- 增 create database db1 charset utf8;
- 查 show databases; show create database db1;
- 改 alter database db1 charset gbk;
- 删 drop databae db1;
(2)操作表(文件)
- 切换到某一个库(文件夹) use db1; select database(); #查看当前所在的库
- 增 creat table t1(id int,name char(10),age int)engine=innodb default charset utf8; #最后一个字段不加逗号
- 查 show tables; show create table t1; desc t1; #查看表结构
- 改 alter table t1 charset gbk; alter table t1 add sex char; alter table t1 drop sex;
alter table t1 modify sex char(6); alter table t1 change sex Sex char(6)
- 删 drop table table66;
(3)操作记录
- 增
insert into db1.t1(id,name,age,Sex) values
(1,'egon1',18,'male'),
(2,'egon2',28,'male');
insert into db1.t1(id,name) values(5,'egon3');
- 查 select name,id from db1.t1; select * from db1.t1;
- 改 updata db1.t1 set name='EGON';
updata db1.t1 set name='alex' where id=5;
updata db1.t1 set name='qqq' where Sex='male';
- 删
delete from db1.t1; #仅仅只有删除记录的效果,不能把表重置到初始状态
truncate db1.t1; #清空+重置
delete from db1.t1 where id=3;
delete from db1.t1 where name='dddd';
- 自增id
create table t1(id int not null unique auto_increment,name char(4); #自增的字段必须是PRI
insert into db1.t1(name) values
('egon1'),
('egon2');
9.把mysql做成系统服务
- 查看系统服务,在运行里输入services.msc
mysqld--install
mysqld--remove
- 在服务中可以直接鼠标操作mysql服务的启动与停止
- 在cmd中操作
net start mysql
net stop mysql
10.存储引擎
(1)InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys
(2)查看支持的搜索引擎:show engines;
(3)创建表使用不同的引擎,文件保存格式不同(系统默认innodb);
create table t1(x int)engine=myisam;
create table t2(x int)engine=blackhole;
create table t3(x int)engine=memory;
create table t4(x int)engine=innodb;
11.配置文件管理
在存放数据库mysql-5.6.38-winx64的目录下创建一个文件后缀为‘.ini’的文件,在该文件中存放一些配置信息。
例如:
[client] #客户端配置信息(全局) user='root' password='' default-character-set=utf8 #将客户端的编码配置为'utf-8' [mysql] #配置某一用户信息 user='alex' password='123' host=192.168.43.181 default-character-set=utf8 #将用户的数据编码配置为'utf-8' [mysqld] #配置服务端信息 ;skip-grant-tables #可破解密码 character_set_server=utf8 #将服务端的编码配置为'utf-8' default-storage-engine=innodb #将服务端的存储引擎配置为'innodb'
12.数据类型
(1)整数类型:tingyint smallint mediumint int或integer bigint
- 作用:存储年龄、等级、id、各种号码等
- 默认有符号
- 整形宽度指的是显示宽度,并不是存储宽度
- 一般用int就用其默认值就可以了
- 以int为例
默认有符号,显示长度11位 create table t1(id int); insert into t1 values(66666); select * from t3; 改变为无符号,显示长度10位 create table t2(id int unsigned); insert into t1 values(66666); select * from t3;
(2)浮点类型:float、double、decimal
- 作用:体重、薪资、价格等
- float:精确到小数后7位
- double:精确到小数后15位
- decimal:精确到小数存储长度的最后一位
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
float: mysql> create table t3(weight float(256,56) unsigned); ERROR 1425 (42000): Too big scale 56 specified for column 'weight'. Maximum is 30. mysql> create table t3(weight float(256,30) unsigned); ERROR 1439 (42000): Display width out of range for column 'weight' (max = 255) mysql> create table t3(weight float(255,30) unsigned); Query OK, 0 rows affected (0.37 sec) double: mysql> create table t4(weight double(256,33) unsigned); ERROR 1425 (42000): Too big scale 33 specified for column 'weight'. Maximum is 30 mysql> create table t4(weight double(256,30) unsigned); ERROR 1439 (42000): Display width out of range for column 'weight' (max = 255) mysql> create table t4(weight double(255,30) unsigned); Query OK, 0 rows affected (0.36 sec) decimal: mysql> create table t5(weight decimal(66,33) unsigned); ERROR 1425 (42000): Too big scale 33 specified for column 'weight'. Maximum is 30. mysql> create table t5(weight decimal(66,30) unsigned); ERROR 1426 (42000): Too big precision 66 specified for column 'weight'. Maximum is 65. mysql> create table t5(weight decimal(65,30) unsigned); Query OK, 0 rows affected (0.39 sec)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
float: insert into t3 values(1.1111111111111111111111111111111111111111111111111111); 结果: mysql> select * from t3; +----------------------------------+ | weight | +----------------------------------+ | 1.111111164093017600000000000000 | +----------------------------------+ 1 row in set (0.00 sec) 精确到小数后7位 double: insert into t4 values(1.1111111111111111111111111111111111111111111111111111); 结果: mysql> select * from t4; +----------------------------------+ | weight | +----------------------------------+ | 1.111111111111111200000000000000 | +----------------------------------+ 1 row in set (0.00 sec) 精确到小数后15位 decimal: insert into t5 values(1.1111111111111111111111111111111111111111111111111111); 结果: mysql> select * from t5; +----------------------------------+ | weight | +----------------------------------+ | 1.111111111111111111111111111111 | +----------------------------------+ 精确到小数存储长度的最后一位
(3)bit类型
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
mysql> create table t6(x bit(1)); mysql> insert into t6 values(2); 取值 mysql> select bin(x) from t6; mysql> select hex(x) from t6; 结果 +--------+ | bin(x) | +--------+ | 1 | +--------+ row in set (0.02 sec) +--------+ | hex(x) | +--------+ | 1 | +--------+ row in set (0.00 sec)
(4)日期类型
- DATE:2017-11-11 出生年月日
- TIME:10:14:11 上课时间
- DATETIME:2017-11-11 10:14:11 注册时间,文章发布时间,员工入职时间
- TIMESTAMP:2017-11-11 10:14:11
- YEAR :1970 出生年
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
create table t7( born_date date, class_time time, reg_time datetime, born_year year ); insert into t7 values ('1999-11-11','08:30:00','2017-11-11 11:11:11',2011); insert into t7 values (now(),now(),now(),now());
-
datetime与timestamp的区别
1)datetime默认值为null,timestamp将当前时间作为默认值,在传空时使用默认值;
2)datetime的日期范围是1001——9999年,timestamp的时间范围是1970——2038年;
3)datetime使用8字节的存储空间,timestamp的存储空间为4字节,因此,timestamp比datetime的空间利用率
更高。
(5)字符串类型(编码为utf-8)
- char
1)范围:0-255
2)特点:定长,简单粗暴,浪费空间(待存储的数据长度<宽度限制),存取速度快
- varchar
1)范围:0-21844
2)特点:变长,精准,节省空间(待存储的数据长度<宽度限制),存取速度慢
(6)枚举与集合类型
- 枚举
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
create table t8( id int, name char(10), sex enum('male','female','None') #在其中选一个 ); alter table t8 modify sex enum('male','female','None') not null default 'male'; insert into t8 values(1,'egon','xxxxx'); insert into t8(id,name) values(1,'egon');
- 集合
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
create table t9( id int, name char(10), hobbies set('music','read','basketball','football','eat','sleep') #在其中可多选 ); insert into t9 values(1,'egon','music,read,eat');
13.约束
http://www.cnblogs.com/meng0410/articles/7725140.html
14.修改表
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
语法: 1. 修改表名 ALTER TABLE 表名 RENAME 新表名; 2. 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; 3. 删除字段 ALTER TABLE 表名 DROP 字段名; 4. 修改字段 ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…]; 示例: 1. 修改存储引擎 mysql> alter table service engine=innodb; Query OK, 0 rows affected (1.72 sec) Records: 0 Duplicates: 0 Warnings: 0 2. 添加字段 mysql> alter table service -> add message varchar(20) not null, -> add age int(3) not null default 22; Query OK, 0 rows affected (2.12 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table service -> add ser_num varchar(10) not null after name; //添加name字段之后 mysql> alter table service -> add sex enum('male','female') default 'male' first; //添加到最前面 mysql> desc service; +---------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+-----------------------+------+-----+---------+----------------+ | sex | enum('male','female') | YES | | male | | | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(5) | YES | | NULL | | | ser_num | varchar(10) | NO | | NULL | | | message | varchar(20) | NO | | NULL | | | age | int(3) | NO | | 22 | | +---------+-----------------------+------+-----+---------+----------------+ 6 rows in set (0.04 sec) 3. 删除字段 mysql> alter table service -> drop sex; 4. 修改字段类型modify mysql> alter table servce -> modify age int(); mysql> alter table service -> modify id int(11) not null primary key auto_increment; //修改为主键 5. 增加约束(针对已有的主键增加auto_increment) mysql> alter table service modify id int(11) not null primary key auto_increment; ERROR 1068 (42000): Multiple primary key defined mysql> alter table service modify id int(11) not null auto_increment; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 6. 对已经存在的表增加复合主键 mysql> alter table service2 -> add primary key(host_ip,port); 7. 增加主键 mysql> alter table student1 -> modify name varchar(10) not null primary key; 8. 增加主键和自动增长 mysql> alter table student1 -> modify id int not null primary key auto_increment; 9. 删除主键 a. 删除自增约束 mysql> alter table student10 modify id int(11) not null; b. 删除主键 mysql> alter table student10 -> drop primary key;
15.复制表
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
复制表结构+记录 (key不会复制: 主键、外键和索引) mysql> create table new_service select * from service; 只复制表结构 mysql> select * from service where 1=2; //条件为假,查不到任何记录 Empty set (0.00 sec) mysql> create table new1_service select * from service where 1=2; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> create table t4 like employees;