zoukankan      html  css  js  c++  java
  • python---mysql 学习笔记

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

  • 相关阅读:
    JS中短路运算符&&和||
    jadx 调整jvm参数
    python 面向对象(进阶篇)
    Python 面向对象(初级篇)
    python+requests接口自动化测试实战
    Jmeter-接口压测
    敬请指正-我进行单元测试的分享
    现在的开发都要懂测试了,为什么?这一份书单告诉你!
    你不得不看-自动化测试工程师面试总结:技术面试
    web自动化快速使用
  • 原文地址:https://www.cnblogs.com/charles8866/p/8489556.html
Copyright © 2011-2022 走看看