• MySQL数据库


    Python之MySQL

     

     一.概述

      数据库(Database,简称DB)

      数据库技术是计算机应用领域中非常重要的技术,它产生于20世纪60年代末,是数据管理的最新技术,也是软件技术的一个重要分支。

      简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据。更简单的形象理解,数据库和我们生活中存放杂物的仓库性质一样,区别只是存放的东西不同。

      数据库表(table)

      数据表是关系数据库中一个非常重要的对象,是其它对象的基础,也是一系列二维数组的集合,用来存储、操作数据的逻辑结构。根据信息的分类情况。
    一个数据库中可能包含若干个数据表,每张表是由行和列组成,记录一条数据,数据表就增加一行,每一列是由字段名和字段数据集合组成,列被称之为字段,
    每一列还有自己的多个属性,例如是否允许为空、默认值、长度、类型、存储编码、注释等.例如

       

       数据(data)

        存储在表中的信息就叫做数据.

      数据库系统有3个主要的组成部分

       1.数据库(Database System):用于存储数据的地方。

       2.数据库管理系统(Database Management System,DBMS):用户管理数据库的软件。

       3.数据库应用程序(Database Application):为了提高数据库系统的处理能力所使用的管理数据库的软件补充。

      数据库的发展史(五个阶段)

       1.文件系统
          数据库系统的萌芽阶段,通过文件来存取数据.
              文件系统是数据库系统的萌芽阶段,出现在上世纪五六十年代,可以提供简单的数据存取功能,但无法提供完整、统一的数据管理功能,例如复杂查询等。所以在管理较少、较简单的数据或者只是用来存取简单数据,没有复杂操作的情况下,会使用文件系统
       
       2.层次型数据库       数据库系统真正开始阶段,数据的存储形式类似树形结构,所以也叫树型数据库.    
       3.网状数据库       数据的存储形式类似网状结构. 从二十世纪六十年代开始,第一代数据库系统(层次模型数据库系统、网状模型数据库系统)相继问世,它们为统一管理和共享数据提供了有力的支撑 在这个阶段,网状模型数据库由于它的复杂、专用性,没有被广泛使用。而在层次模型数据库中,IBM公司的IMS(Information Management System,信息管理系统)层次模型数据库系统则得到了极大的发展,一度成为最大的数据库管理系统,拥有巨大的客户群    4.关系型数据库 二十世纪七十年代初,关系型数据库系统开始走上历史舞台,并一直保持着蓬勃的生命力.关系型数据库系统使用结构化查询语言(Structured Query Language,SQL)作为数据库定义语言DDL和数据库操作语言DML    5.面向对象数据库 把面向对象的方法和数据库技术结合起来,可以使数据库系统的分析、设计最大程度地与人们对客观世界的认识相一致,并且能够有效的为面向对象程序提供更好的数据库支撑

    二.数据库的特点

      ⑴ 实现数据共享
        数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。
     
      ⑵ 减少数据的冗余度
        同文件系统相比,由于数据库实现了数据共享,从而避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的一致性。
     
      ⑶ 数据一致性和可维护性,以确保数据的安全性和可靠性
        主要包括:①安全性控制:以防止数据丢失、错误更新和越权使用;
             ②完整性控制:保证数据的正确性、有效性和相容性;
             ③并发控制:使在同一时间周期内,允许对数据实现多路存取,又能防止用户之间的不正常交互作用。
     
      ⑷ 故障恢复
          由数据库管理系统提供一套方法,可及时发现故障和修复故障,从而防止数据被破坏。数据库系统能尽快恢复数据库系统运行时出现的故障,可能是物理上或是逻辑上的错误。比如对系统的误操作造成的数据错误等。

    三.系统数据库

    • information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等
    • mysql:核心数据库,里面包含用户、权限、关键字等信息。不可以删除
    • performance_schema:mysql 5.5版本后添加的新库,主要收集系统性能参数,记录处理查询请求时发生的各种事件、锁等现象 
    • sys : mysql5.7版本新增加的库,通过这个库可以快速的了解系统的元数据信息,可以方便DBA发现数据库的很多信息,解决性能瓶颈都提供了巨大帮助

    四.数据库操作

      1、创建数据库

    #语法:CREATE  DATABASE db_name charset utf8;

      2、查看数据库

    复制代码
    #查看当前用户下所有数据库
    show  databases;
    
    #查看创建数据库的信息
    show   create  database db_name;
    
    #查看数据库版本
    select  version();
    
    #查看当前登录用户
    select user();
    
    #查看当前数据库里有哪些用户
    select user,host  from  mysql.user;
    
    #删除数据库
    drop database  db_name;
    
    
    #选择数据库
    use  db_name;
    复制代码

      3、数据库的用户权限

    复制代码
    创建用户
    create  user  '用户名'@'ip地址' identified  by  '密码';
    
    删除用户
    drop user  '用户名'@'ip地址';
    
    修改用户
    rename user  '用户名'@'ip地址';to  '新用户名'@'ip地址'
    
    查看用户权限
    show  grants  for   '用户名'@'ip地址';
    
    授权
    grant  权限  on  数据库.表  to   '用户名'@'ip地址';
    
    取消权限
    revoke   权限  on  数据库.表  from    '用户名'@'ip地址';

    授权用户所有权限
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123.com' WITH GRANT OPTION;
    复制代码
     权限列表

       4、忘记密码和修改数据库密码;

        1:使用mysqladmin修改用户密码;

        2:进入数据库直接设置用户名密码:(注意:下图为mysql5.7版本的)

    mysql5.6版本修改密码为:
    update mysql.user set password = password('新密码') where user= '用户名'
    flush privileges; -- 刷新权限

         3:忘记密码:

    复制代码
    忘记密码:
    1、首先关闭mysql服务:
        service  mysqld stop
    2、跳过权限检查,启动mysql并进入mysql
        mysqld_safe --skip-grant-tables&
         mysql
    3、进入mysql数据库并更新用户的密码:
        use  mysql;
        update mysql.user set authentication_string=password('新密码') where user='root';
    4、刷线权限
        flush privileges;
    5、停止后台的跳过权限检查任务,然后启动数据库;
        kill %后台任务的pid
        services mysqld start
    复制代码

    五.数据表操作

      1、表操作

    复制代码
    创建表:
    CREATE TABLE 表名(
    字段名1 类型[(宽度) 约束条件],
    字段名2 类型[(宽度) 约束条件],
    字段名3 类型[(宽度) 约束条件]
    )ENGINE=innodb DEFAULT CHARSET utf8;
    
    
    约束条件:
    not null :表示此列不能为空
    auto_increment :表示自增长,默认每次增长+1
    注意:自增长只能添加在主键或者唯一索引字段上
      
    primary key :表示主键(唯一且不为空)
    engine =innodb :表示指定当前表的存储引擎
    default charset utf8 :设置表的默认编码集

     #查询表数据
     select 字段(多个以","间隔) from 表名;

     #查看表结构
     desc 表名;

     #查看创建表信息
     show create table 表名;

     删除表;

     drop tables 表名; 

    复制代码

      示例

      2、修改表结构:

    复制代码
    #添加表字段
    alter table 表名 add 字段名 类型 约束;
    ps: after name 表示在name字段后添加字段 age.
      
    #修改表字段
    方式一: alter table student modify 字段 varchar(100) null;
    方式二: alter table student change 旧字段 新字段 int not null default 0;
    ps:二者区别:
    change 可以改变字段名字和属性
    modify只能改变字段的属性
        
    #删除表字段 :
    alter table student drop 字段名;
      
    #更新表名称:
    rename table 旧表名 to 新表名;
    复制代码

    六.数据操作 

       1、数据操作语法

    复制代码
    插入数据
    #语法一: 按字段进行插入
    insert into 表(字段1,字段2 ...) values (值1,值2 ...);
     
    #语法二:按字段顺序插入
    insert into 表 values (值1,值2 ...);
     
    #语法三: 插入多条记录
    insert into 表 values (值1,值2 ...) ,(值1,值2 ...)  ,(值1,值2 ...);
     
    #语法四:插入查询结果
    insert into 表(字段1,字段2 ...)  select 字段1,字段2 ... from 表;
    
    更新操作
    #语法一: 更新整表数据
    update 表 set 字段1= '值1', 字段2='值2' ... ;
     
    #语法二:更新符合条件字段3的数据
    update 表 set 字段1= '值1', 字段2='值2' ... where 字段3 = 值3;
    
    删除操作
    #语法一:整表数据删除
    delete from 表 ;
     
    #语法二:删除符合 where后条件的数据
    delete from 表 where 字段1=值1;
    复制代码

      2、单表查询

    复制代码
    简单查询
    #查询语法: 
    select [distinct]*(所有)|字段名,...字段名 from 表名;
    
    条件查询
    #查询格式:
    select [distinct]*(所有)|字段名,...字段名 from 表名 [where 条件过滤]
    
    区间查询
    关键字 between 10 and  20 :表示 获得10 到 20 区间的内容
    # 使用  between...and  进行区间 查询
    select * from person where salary between 4000 and 8000;
    ps: between...and 前后包含所指定的值
    等价于 select * from person where salary >= 4000 and salary <= 8000;
    
    集合查询
    关键字: in, not null
    #使用 in 集合(多个字段)查询
    select * from person where age in(23,32,18);
    等价于: select * from person where  age =23 or age = 32 or age =18;
     
    #使用 in 集合 排除指定值查询
    select * from person where age not in(23,32,18);
    
    模糊查询
    关键字 like , not like
            %:  任意多个字符
            _  : 只能是单个字符     
    
    排序查询
      关键字: ORDER BY  字段1 DESC, 字段2 ASC
        #排序查询格式:
        select 字段|* from 表名 [where 条件过滤] [order by 字段[ASC]    [DESC]]
     
        升序:ASC 默认为升序
        降序:DESC
        PS:排序order by 要写在select语句末尾 
    
    聚合查询
        聚合:  将分散的聚集到一起.
      聚合函数: 对列进行操作,返回的结果是一个单一的值,除了 COUNT 以外,都会忽略空值
    
      COUNT:统计指定列不为NULL的记录行数;
      SUM:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
      MAX:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
      MIN:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
      AVG:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
        
    #格式:
    select 聚合函数(字段) from 表名;
    
    分组查询
    分组的含义: 将一些具有相同特征的数据 进行归类.比如:性别,部门,岗位等等
    怎么区分什么时候需要分组呢?  
    套路: 遇到 "每" 字,一般需要进行分组操作.
    分组查询格式:
    select 被分组的字段 from 表名 group by 分组字段 [having 条件字段]
    ps: 分组查询可以与 聚合函数 组合使用.
    where 与 having区别:
    #执行优先级从高到低:where > group by > having 
    #1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
    #2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
    
    分页查询:
    好处:限制查询数据条数,提高查询效率
    
    正则查询
    MySQL中使用 REGEXP 操作符来进行正则表达式匹配。
    # ^  匹配 name 名称 以 "e" 开头的数据
    select * from person where name REGEXP '^e';
     
    # $  匹配 name 名称 以 "n" 结尾的数据
    select * from person where name REGEXP 'n$';
     
    # . 匹配 name 名称 第二位后包含"x"的人员 "."表示任意字符
    select * from person where name REGEXP '.x';
     
    # [abci] 匹配 name 名称中含有指定集合内容的人员
    select * from person where name REGEXP '[abci]';
     
    # [^alex] 匹配 不符合集合中条件的内容 , ^表示取反
    select * from person where name REGEXP '[^alex]';
    #注意1:^只有在[]内才是取反的意思,在别的地方都是表示开始处匹配
    #注意2 : 简单理解 name  REGEXP '[^alex]' 等价于 name != 'alex'
     
    # 'a|x' 匹配 条件中的任意值
    select * from person where name REGEXP 'a|x';  
     
    #查询以w开头以i结尾的数据
    select * from person where name regexp '^w.*i$';
    #注意:^w 表示w开头, .*表示中间可以有任意多个字符, i$表示以 i结尾
    复制代码
    模式描述
    ^ 匹配输入字符串的开始位置。 
    $ 匹配输入字符串的结束位置。
    . 匹配任何字符(包括回车和新行)
    [...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
    [^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
    p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

      3、多表查询

    复制代码
    多联合查询
    select  字段1,字段2... from 表1,表2... [where 条件]
    注意: 如果不加条件直接进行查询,则会出现以下效果,这种结果我们称之为 笛卡尔乘积
    
    多表连接查询
    #多表连接查询语法(重点)
    SELECT 字段列表
        FROM 表1  INNER|LEFT|RIGHT JOIN  表2
    ON 表1.字段 = 表2.字段;
    
    内连接查询
    select * from person inner join dept  on person.did =dept.did;
    
    左外连接查询
    #查询人员和部门所有信息
    select * from person left join  dept  on  person.did =dept.did;
    
    右外链接查询
    #查询人员和部门所有信息
    select * from person right join  dept  on  person.did =dept.did;
    
    全连接查询
    全连接查询:是在内连接的基础上增加 左右两边没有显示的数据
      注意: mysql并不支持全连接 full JOIN 关键字
      注意: 但是mysql 提供了 UNION 关键字.使用 UNION 可以间接实现 full JOIN 功能
    #查询人员和部门的所有数据
    SELECT * FROM person LEFT JOIN dept ON person.did = dept.did
    UNION
    SELECT * FROM person RIGHT JOIN dept ON person.did = dept.did;
    复制代码
  • 相关阅读:
    这些哭笑不得的情景,每一个程序猿都可能面对
    创建并使用静态库(ar 命令)
    C++中typename和class的区别
    C++11 tuple
    c++ map与 qt QMap insert 区别
    各个函数消耗的时间profiling和内存泄漏valgrind
    Linux查看代码量
    Linux应用程序打包
    静态代码检查工具 cppcheck 的使用
    制作Linux下程序安装包——使用脚本打包bin、run等安装包
  • 原文地址:https://www.cnblogs.com/yangxinpython/p/11378970.html
Copyright © 2020-2023  润新知