数据库------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的一些基本操作,谢谢