数据库------mysql
安装:
linux----centos7:
在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB。
安装mysql
1.下载并安装mysql官方的yum Repository
[root@localhost ~]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
使用yum进行安装:
[root@localhost ~]# yum -y install mysql57-community-release-el7-10.noarch.rpm
2.开始安装myql服务器:
[root@localhost ~]# yum -y install mysql-community-server
这一步会花费不少的时间,请耐心等待,安装完之后就会覆盖掉之前的mariadb
mysql数据库的设置:
3.启动mysql:
[root@localhost ~]# systemctl start mysqld.service
查看mysql运行状态:
[root@localhost ~]# systemctl status mysqld.service
4.找出mysql的root用户密码,通过在日志文件中查找:
[root@localhost ~]# grep "password" /var/log/mysqld.log
5.进入数据库:
[root@localhost ~]# mysql -uroot -p
输入上面查询到的初始密码,之后不能做任何事情,只有在修改了默认密码之后才能够操作数据库:
6.修改密码:
常见的修改密码的方法有:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
mysql> set password for 'root@localhost'=password('Newpassword4!')
但是都会遇到一个问题:
这时候我们必须要用其他的方法:
mysql> set password=password('123456')
此时还是会遇到一个新的问题:
新密码设置过于简单,这个原因是mysql有密码设置的规范,具体是与validate_password_policy的值有关
所以我们先设置一个符合规则的密码,包含大小写数字和符号的密码:
这样我们才能够进行查看密码规则和其他的操作:
或者使用如下的命令修改密码:
[root@localhost ~]#mysqladmin -u root password "new_password";
MySQL完整的初始密码规则可以通过如下命令查看:
mysql> SHOW VARIABLES LIKE 'validate_password%'; +--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | validate_password_check_user_name | OFF | | validate_password_dictionary_file | | | validate_password_length | 8 | | validate_password_mixed_case_count | 1 | | validate_password_number_count | 1 | | validate_password_policy | MEDIUM | | validate_password_special_char_count | 1 | +--------------------------------------+--------+ 7 rows in set (0.01 sec)
validate_password_policy:密码策略,默认为MEDIUM策略
validate_password_dictionary_file:密码策略文件,策略为STRONG才需要
validate_password_length:密码最少长度
validate_password_mixed_case_count:大小写字符长度,
至少1个 validate_password_number_count :数字至少1个
validate_password_special_char_count:特殊字符至少1个 上述参数是默认策略MEDIUM的密码检查规则。
我们修改一下里面的参数:
mysql> set global validate_password_policy=0; mysql> set global validate_password_length=4;
这样我们就能够设置简单的密码:1234,或者root
7.配置默认编码:uft8
首先我们看一下mysql默认的编码:
mysql> show variables like '%character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
修改/etc/my.cnf配置文件,在[mysqld]下添加编码配置,如下所示:
[mysqld] character_set_server=utf8
init_connect='SET NAMES uft8'
重新启动mysql服务,查看看数据库编码,如下所示:
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
8.设置mysql开机启动:
[root@localhost ~]# systemctl enable mysqld
[root@localhost ~]# systemctl daemon-reload
默认配置文件路径:
配置文件:/etc/my.cnf
日志文件:/var/log//var/log/mysqld.log
服务启动脚本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid
windows下安装mysql:
windows上安装mysql相对来说要简单的多,只要下载mysql对应的安装包,
MySQL Installer 下载
mysql-installer-community-5.7.19.0.msi:https://dev.mysql.com/downloads/file/?id=471661
然后运行exe文件进行安装,需要注意的如下:
一般我们选择Custom;
next之后我们会看到下面这个界面:
有的时候他会下载失败,install fail,:The action ‘Install’ for product ‘MySQL Server 5.7.19’ failed.
这是因为我们电脑里面没有安装Visual Studio2013运行库,
32位的Visual C++ Redistributable Packages for Visual Studio 2013!!!注意是32位的。即使你的电脑是64位的
安装网址: https://www.microsoft.com/zh-cn/download/details.aspx?id=40784
之后就设置登录密码,顺利安装成功。
安装成功,进行验证,开始菜单中打开MySQL命令行工具
mysql数据类型
分为:数值,时间和字符(串)类型
数值类型:
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 字节 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 字节 | (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 字节 | (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
时间类型:
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2037 年某时 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符类型:
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
常用操作:(命令结束之后一定要加分号)
查看数据库:show databases;
进入mysql数据库:use mysql;
查看这个库中有什么表:show tables;
查看表的结构:desc 表名;or show columns from 数据表
查看表中数据:select * from 表名 (\G);加上\G,就变成了竖着的显示
创建一个新用户:
use mysql; mysql库里面有mysql自带的用户表,它存了账户的所有信息
我们查询mysql中的user表的User字段,就可以看到你现在的数据库中有多少个用户
grant all on test.* to 'xiaoming'@'localhost' identified by 'xiaoming123'
all:分配给用户的权限,有Select,Insert,Update,Delete,Create,Drop,Re load,Shutdown,Process,File,Grant,References,Index,Alter
test.*:为数据库test的所有表分配的用户。所有就是*.*
‘xiaoming’@'localhost' indentified by 'xiaoming123':用户名为xiaoming,密码xiaoming123
查看创建用户的权限:show grants for 用户名
创建数据库:create database 数据库名 charset utf8
查看创建的数据库的编码:show create database 数据库名
删除数据库:drop database 数据库名
创建数据表:
create table student( id int auto_increment, name char(32) not null, age int not null, register_date date not null, primary key(id) );
如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 同时如果使用多列来定义主键,列间以逗号分隔。
插入数据:
insert into student(name,age,register_date) values ("xiaoming",22,"1996-09-20");
查询数据:
SELECT column_name,column_name FROM table_name [WHERE Clause][LIMIT N] [OFFSET M ]
查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件
使用星号(*)代替其他字段,SELECT语句会返回表的所有字段数据
使用 WHERE 语句来包含任何条件
LIMIT 属性设定返回的记录数
OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0,
OFFSET不能单独使用
offset必须在limit后面添加
where子句:
模糊查询:like: binary '%Li' 只匹配大写
更新数据(Update):
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
删除数据(delete):
DELETE FROM table_name [WHERE Clause]
mysql排序:
SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]]
使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
mysql的group by:
SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;
统计总数:在最后加一个with rollup
mysql alter命令:我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。
删除,添加或修改表字段
alter table student drop register_date; #从student表删除register_date字段 alter table student add telephere int(11) not null; #添加phone字段
alter table student modify sex enum("M","F") not null; #修改sex
修改字段类型和名称:(modify和change)
modify修改字段的类型,如把char(1)变成char(10):
alter table student modify sex int(10)
change语句:在使用change之后紧跟着的是要修改的字段名,然后制定新字段名及类型:
alter table student change sex gender char(32) default 'M';
修改表名:
alter table student rename to student1;
关于外键“:用于关联两个表:
我们创建第二个表:
create table study_record( id int not null auto_increment, day int not null, status char(32) not null default 'YES', stu_id int(11) not null, primary key(`id`), key `fk_student_key` (`stu_id`), constraint `fk_student_key` foreign key (`stu_id`) references `student` (`id`));
首先我们看一下student表中的数据:
现在我们为study_record插入数据
但是当我们输入的stu_id不在student表中的id范围时:
Mysql 连接(left join, right join, inner join ,full join)
JOIN 按照功能大致分为如下三类:
- inner join(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- left join(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- right join(右连接): 与 right join 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
首先我们创建两个数据表:
mysql> select * from A; +---+ | a | +---+ | 1 | | 2 | | 3 | | 4 | +---+
mysql> select * from B; +---+ | b | +---+ | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | +---+
inner join:内连接,就是查询出两个表的共同元素(交集)
select * from A inner join B on A.a = B.b; select A.*,B.* from A,B where A.a = B.b; +---+---+ | a | b | +---+---+ | 3 | 3 | | 4 | 4 | +---+---+
left join:就是查询出两个表的不同元素(差集)
mysql> select * from A left join B on A.a = B.b; +---+------+ | a | b | +---+------+ | 3 | 3 | | 4 | 4 | | 1 | NULL | | 2 | NULL | +---+------+
先把A中的数据取出来,然后看B中有没有相同的数据,如果有就对应取出,没有的数据就用NULL
right join:
mysql> select * from A right join B on A.a = B.b; +------+---+ | a | b | +------+---+ | 3 | 3 | | 4 | 4 | | NULL | 5 | | NULL | 6 | | NULL | 7 | | NULL | 8 | +------+---+
效果和select * from B left join A on A.a=B.b一样的效果
full join:
(mysql不直接支持),即select * from A full join B on A.a = B.b会报错
但是:
mysql> select * from A left join B on A.a = B.b union select * from A right join B on A.a = B.b; +------+------+ | a | b | +------+------+ | 3 | 3 | | 4 | 4 | | 1 | NULL | | 2 | NULL | | NULL | 5 | | NULL | 6 | | NULL | 7 | | NULL | 8 | +------+------+ 8 rows in set (0.00 sec)
通过这种方法间接的实现了full join
事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样就需要用到多条sql语句,但是如果在执行sql语句中突然死机断电,还没有把所有语句执行完,那就会有问题。这样,这些数据库操作语句就构成一个事务!
在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务,事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。同时事务用来管理insert,update,delete语句
事务的4个条件(ACID):
Atomicity(原子性):一组事务,要么成功;要么撤回。
Consistency(稳定性):有非法数据(外键约束之类),事务撤回。
Isolation(隔离性):事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
Durability(可靠性):软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候把事务保存到日志里。
mysql> select * from student; +----+-----------+-----+---------------+--------+ | id | name | age | register_date | gender | +----+-----------+-----+---------------+--------+ | 1 | xiaoming | 22 | 1996-09-20 | NULL | | 3 | xiaoliang | 21 | 1995-09-25 | NULL | | 5 | linhuahua | 27 | 1993-06-07 | NULL | | 9 | xiaoming | 26 | 1993-06-02 | NULL | | 11 | haha | 26 | 2011-01-01 | M | +----+-----------+-----+---------------+--------+ 5 rows in set (0.00 sec) mysql> begin; #开始一个事务 mysql> insert into student (name,age,register_date,gender) values("wangsen",25,"2016-09-22","M"); mysql> insert into student (name,age,register_date,gender) values("wangqing",26,"2016-09-12","F"); mysql> select * from student; +----+-----------+-----+---------------+--------+ | id | name | age | register_date | gender | +----+-----------+-----+---------------+--------+ | 1 | xiaoming | 22 | 1996-09-20 | NULL | | 3 | xiaoliang | 21 | 1995-09-25 | NULL | | 5 | linhuahua | 27 | 1993-06-07 | NULL | | 9 | xiaoming | 26 | 1993-06-02 | NULL | | 11 | haha | 26 | 2011-01-01 | M | | 12 | wangsen | 25 | 2016-09-22 | M | | 13 | wangqing | 26 | 2016-09-12 | F | +----+-----------+-----+---------------+--------+ 7 rows in set (0.00 sec) mysql>rollback; 回滚 , 这样数据是不会写入的 mysql> select * from student; +----+-----------+-----+---------------+--------+ | id | name | age | register_date | gender | +----+-----------+-----+---------------+--------+ | 1 | xiaoming | 22 | 1996-09-20 | NULL | | 3 | xiaoliang | 21 | 1995-09-25 | NULL | | 5 | linhuahua | 27 | 1993-06-07 | NULL | | 9 | xiaoming | 26 | 1993-06-02 | NULL | | 11 | haha | 26 | 2011-01-01 | M | +----+-----------+-----+---------------+--------+ 5 rows in set (0.00 sec)
如果一切操作正常的话,用mysql> commit;进行提交就可以了,这个时候你所插入的数据就能够正常的插入到数据库中了
索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
数据表可以有很多的字段,但是主键只有一个,索引可以有多个,比如:个人信息表,每个人可以包含多个字段:姓名,年龄,性别,生日等等,一个个人信息有50列,我们最关注的也就是姓名和身份证号,我们可以对这两个字段做两个索引。索引就是通过哈希的形式把一列的数据转成数字,然后再排序,通过二分查找查找数据。这样检索速度就提高了。
索引分单列索引和组合索引。
单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。
组合索引,即一个索引包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
索引的缺点:
虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件
查看一个表的索引:
show index from student; +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | student | 0 | PRIMARY | 1 | id | A | 7 | NULL | NULL | | BTREE | | | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
一个表中的主键自动就是索引,主键就是一种索引,默认的
创建索引:
CREATE INDEX indexName ON table(username(length));
mysql> create index index_name on student(name(32)); mysql> show index from student; +---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | student | 0 | PRIMARY | 1 | id | A | 6 | NULL | NULL | | BTREE | | | | student | 1 | index_name | 1 | name | A | 4 | NULL | NULL | | BTREE | | | +---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 2 rows in set (0.00 sec)
在创建表的时候就添加索引:
create table tablename( id int not null, username varchar(16) not null, index [indexName] (username(length)) );
删除索引:
drop index [indexName] on tablename
唯一索引:
索引列的值必须唯一,但是允许有空值。如果是组合索引,则列值的组合必须唯一。
创建,删除索引等操作就是在前面的普通索引之前加一个unique:如创建唯一索引|:create unique index indexName on tablename(username(length))
以上就是mysql的一些基本操作,谢谢