数据的存储
单程序的数据存储在文件中(独有)
但程序程序(共有)数据库MySql
MySQL:是用于管理文件的软件
服务端软件
- socket服务端
- 本地文件操作
- SQL语句解析
客户端软件
- socket客户端
- 发送命令
- SQL语句解析
技能
- 安装客户端 服务端
- 连接
学习SQL语句
其他类似软件:
关系型数据库:sqllite,db2,oracle,access,sql server MySQL 非关系型数据库:MongoDB,redis
MySql安装
Windows版本
安装版本就是一路next
- 解压版的安装方式
- 初始化 找到bin文件下的mysqld
- 服务端 E:\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld --initialize-insecure
- 用户名默认是 root 面默认为空
- 启动服务端
- E:\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld
- 客户端连接
- E:\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld -u root -p
- 通过设置环境变量的方式
- 添加环境变量 E:\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld
- windows服务
- 制作Windows服务 E:\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld --install
- 可以用 net start mysql启动服务 net stop mysql停止服务
- 初始化 找到bin文件下的mysqld
linux -cenos7
CentOS 7的yum源中没有正常安装mysql时的mysql-sever文件,需要去官网上下载
# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm# rpm -ivh mysql-community-release-el7-5.noarch.rpm# yum install mysql-community-server
成功安装之后重启mysql服务
service mysqld restart 初次安装mysql是root账户是没有密码的 设置密码的方法mysql -u root mysql> set password for ‘root’@‘localhost’ = password('mypasswd'); mysql> exitMySQL连接
数据库的格式是:
- (文件夹)数据库
- (文件)表
- (行)数据行
- 数据行
- (文件)表
数据库的连接
默认的是 mysql -u root -p
查看数据库:show databases; # 最后是s 代表多个 分号结尾创建数据库: create database db1; #没有s db1是数据库的名字进入数据库:use db1;查看数据库中的表: show tables;查看所有的表:select * from 表名字; # 查看表中的内容查看所有的用户:用户存在在mysql的user表中,select user,host from user;查看+------+-----------+| user | host |+------+-----------+| abc | % || root | 127.0.0.1 || root | ::1 || | haha || root | haha || | localhost || root | localhost |+------+-----------+
创建用户
创建一个用户,用户名是aaa,密码是123 ,只能是192.168.1.0登录 create user 'aaa'@'192.168.1.0' identified by '123';创建一个用户,用户名是bbb,密码是123 ,只能是192.168.1.% 在这个范围内登录 create user 'bbb'@'192.168.1.%' identified by '123';任意IP都能登录create user 'ccc'@'%' identified by '123';最后查看所有的用户:mysql> select user,host from user;+------+-------------+| user | host |+------+-------------+| abc | % || root | 127.0.0.1 || bbb | 192.168.1.% || aaa | 192.168.1.0 || root | ::1 || | haha || root | haha || | localhost || root | localhost |+------+-------------+
在操作Linux登录mysql的时候,用户用空的密码也可以登录。通过查找是是因为mysql 系统表(mysql.user)里默认有几条空用户与空密码的数据,所以导致以上的问题,使用如下命令,把空用户的数据行删除掉即可;
mysql> select * from mysql.user; mysql> delete from mysql.user where user = "";mysql> flush privileges;
http://63638790.blog.51cto.com/513514/1556935
授权
部分授权grant select,insert,update on db1.t1 to 'abc'@'%';全部授权grant all privileges on db1.t1 to 'abc'@'%';取消授权mysql> revoke all privileges on db1.t1 from 'abc'@'%';
显示用户自己的权限: show grants;
mysql> show grants;+---------------------------------------------------------------------+| Grants for root@localhost |+---------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION || GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |+---------------------------------------------------------------------+
注意:授权的时候是 TO 取消授权的是From
配置远程连接的权限:grant all privileges on *.* to 'root'@'%' with grant option;
取消用户的所有权限:revoke all privileges on *.* from 'root'@'%';
普通用户在设置数据库的具体权限的时候可以直接用grant all privileges on db1.* to 'hzx'@'%';
但是在取消权限的时候需要revoke all privileges on
db1.* from 'hzx'@'%';
注意数据库的部分用反引号 mysql> show grants;+------------------------------------------------------------+| Grants for hzx@% |+------------------------------------------------------------+| GRANT ALL PRIVILEGES ON *.* TO 'hzx'@'%' WITH GRANT OPTION || GRANT ALL PRIVILEGES ON `db1`.* TO 'hzx'@'%' |+------------------------------------------------------------+2 rows in set (0.00 sec)mysql> revoke all privileges on 'db1'.* from 'hzx'@'%';ERROR 1064 (42000): You have an error in your SQL syntax; check the manual thatcorresponds to your MySQL server version for the right syntax to use near ''db1'.* from 'hzx'@'%'' at line 1mysql> revoke all privileges on `db1`.* from 'hzx'@'%';Query OK, 0 rows affected (0.01 sec)mysql>
http://www.cnblogs.com/zhangqunshi/p/6942051.html
http://www.cnblogs.com/wupeiqi/articles/5713315.html http://blog.csdn.net/andy_yf/article/details/7487519SQL语句规则
操作文件夹(数据库)
- 查看所有的数据库 show databases;
- 创建数据库 create database db1;
- 设置数据库的编码 create database db1 default charset utf8; # 这里没有等号
- 删除数据库 drop database db1;
操作文件(表)
注意在创建表的时候,首先要选择具体的数据库
- 查看所有的表 showtables;
- 创建表 create table t1(id int ,name char(10));
- 创建表的时候设置字符编码 create table t1(id int ,name char(10)) engine=innodb default chatset=utf8; # 注意这里有等号,Innode是事务操作,支持自动的回滚(主要用在转账操作,一方转账失败,自动回滚) - innodb 支持事务,原子性操作 - myisam myisam
create table t1( id int not null auto_increment primary key, name char(10) )engine=innodb default charset=utf8;
auto_increment 表示自增
primary key;# 主键 表示约束,不能重复切不能为空以后通常的设置
create table t2( id int not null auto_increment primary key,name char(10))engine=innodb default charset=utf8;
清空表
delete from t1;#这种删除不会删除索引 插入内容从原来的索引位置 truncate table t1;# 会删除索引 alter table class auto_increment = 1 # 重新设置表的自增值为1删除表 drop table t1;
数据类型
数字
- tinyint
- int
- bigint
- FLOAT
- DOUBLE
- decimal 可以定制精确的小数 decimal(a,b);a是数据的总长度 b是小数位数
- 字符串
- char(10) 定义了10个就会占用10个,空的用空格补齐,速度快
varhar(10) 可变长度 节省空间
** ps: 数据库优化,创建表的时候吧定长的房前面 不定长的放后面**- text 存放大的数据
更大的数据就是文件,存放在文件服务器中,db中存放路径
- 时间类型 DATATIME
- 枚举
set
操作文件中的内容(表的内容)
- 插入数据 insert into t1(id,name) values(1,'aaa');
- 删除 delete from t1 where id<6
- 修改 update t1 set age=18; update t1 set age=18 where age=17;
- 查看 select * from t1;
外键
要先创建没有外键的表,然后再创建与外键有关联的表
先操作用户表,然后操作部门表
外键的数据类型要一样
# 班级表classcreate table class( cid int auto_increment primary key, caption varchar(12))engine=innodb default charset=utf8;# 老师表create table teacher( tid int auto_increment primary key, caption varchar(12))engine=innodb default charset=utf8;# 学生表 有外键create table student( sid bigint auto_increment primary key, sname varchar(10), -- gneder enum('男','女') not null, gneder varchar(20), class_id int, constraint fk_stuendt_key foreign key (class_id) references class(cid))engine=innodb default charset=utf8; # 课程表 有外键create table course( cid int auto_increment primary key, cname varchar(20), teacher_id int, constraint fk_course_key foreign key (teacher_id) references teacher(tid))engine=innodb default charset=utf8;# 成绩表 有外键create table score( sid int auto_increment primary key, student_id bigint, course_id int, score_number int, constraint fk_stu_key foreign key (student_id) references student(sid), constraint fk_score_key foreign key (course_id) references course(cid))engine=innodb default charset=utf8;
主键
一个表只有一个主键,可以关联多个列外键
外键可以有多个CREATE TABLE t1( pid int NOT NULL auto_increment , nid int NOT NULL auto_increment , PRIMARY KEY(pid,nid))ENGINE=INNODB DELETE CHARSET=utf8;create table t2( sid int auto_increment primary key, id1 int, id2 int, constraint fk_key foreign key (id1,id2) references t1(pid,nid),)engine=innodb default charset=utf8;
对于自增可以修改
show create table t1 ;#横屏显示
show create table t1 \G; # 旋转90度 alter table t1 auto_increment=2; # 修改这个值可以改变自增的值