Mysql -- -- 常见操作

MySQL
 数据库理论
  概念
   概念:特殊格式的数据文件集合
   特点
    持久化存储
    读写速度极高
    保证数据的有效性
    对程序支持性非常好,容易扩展
  数据设计
   E-R模型
    作用:提供实体、属性和联系的方法,用来描述现实世界的概念模型
    实体型用矩形表示,属性用椭圆形表示,联系
   三范式
    1NF:强调是列的原子性,列的数据不能够再拆掉成几列
    2NF:一个表中必须有一个主键,非主键字段必须完全依赖于主键,不能依赖于主键的一部分(注:主键可以设置成多字段,当一个字段无法唯一标示数据时)
    3NF:非主键必须直接依赖于主键,不能够间接依赖
    即一个字段一个数据,每个表必须有主键,一个对象一个表
   口诀
    1.一个字段一个数据
    2.表必须有主键
    3.一张表一个对象
  配置
   服务端配置
    安装
     安装:sudo apt-get install mysql-server
    配置项
     bind-address表示服务器绑定的ip,默认为127.0.0.1
     port表示端口,默认为3306
     datadir表示数据库目录,默认为/var/lib/mysql
     general_log_file表示普通日志,默认为/var/log/mysql/mysql.log
     log_error表示错误日志,默认为/var/log/mysql/error.log
    查看配置
     配置文件目录为/etc/mysql/mysql.cnf
     cd进入conf.d目录,打开mysql.cnf,发现并没有配置
     cd进入mysql.conf.d目录,vi打开mysql.cnf,可以看到配置项
   客户端配置
    安装
     下载
      可以到Navicat官网下载
      将压缩文件拷贝到ubuntu虚拟机中,放到桌面上,解压
     安装
      解压:tar zxvf navicat112_mysql_cs_x64.tar.gz
      进入解压目录运行:./start_navicat
      未找到.NET应用组件-----点击两次取消
      评估试用版-----试用
    故障解决
     中文乱码
      打开start_navicat文件
      
      将export LANG="en_US.UTF-8"改为export LANG="zh_CN.UTF-8"
     试用期
      解决:删除用户目录下的.navicat64目录
      cd ~
      rm -r .navicat64
  关系型数据库MySQL
   核心元素
    数据行(记录)
    数据列(字段)
    数据表(数据行的集合)
    数据库(数据表的集合)
   语句分类
    DQL:数据查询语言,用于对数据进行查询,如select
    DML:数据操作语言,对数据进行增加、修改、删除,如insert、update、delete
    TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback
    DDL:数据定义语言,进行数据库、表的管理等,如create、drop
    DCL:数据控制语言,进行授权与权限回收,如grant、revok
    不区分大小写
  Navicat图形化操作
   创建数据表
    点击工具栏“表”,在第二行显示关于表的命令,点击“创建表”
    弹出新窗口,按照上节的设计,创建班级表,填写各字段,选择相应的类型
    对于id字段,需要设置为int类型,无符号,自动增长,主键,非空
    对于字符串类型,必须指定包含字符个数,还需要指定字符集、排序规则,默认与数据库的一致
    datetime的默认值可以设置成now(),也可以是一个具体值,如'2000-1-1'
   编辑数据表
    选择一张表后,工具栏的第二行“打开表”、“设计表”、“删除表”都变的可用
    打开表会查看表的当前数据,可以在这个窗口中增加、修改、删除数据
    设计表和创建表的窗口一样,可以增加、修改、删除字段,或编辑字段的类型、约束
    删除表会将表物理删除
   增
    默认没有数据,可以在对应的列中填写数据,点击底部的对勾完成添加
    注意:自动增长的主键列不需要填写值
    如果需要继续添加数据,点击询问的加号,会出现一个新的空白行,填写数据即可
   删
    点击某个单元格,再点击询问的减号,可以删除
    说明:对于重要数据,推荐将isdelete属性改为1,而不是进行物理删除.
   查
    双击表,或者选择表后,点击工具栏第二行的“打开表”,可以查看表的数据
   改
    点击某个单元格,即可编辑值,修改完后,点击底部的勾生效.
  数据的CURD
   curd的解释: 代表创建(Create)、更新(Update)、读取(Retrieve/Read)和删除(Delete)
  事务四大特性ACID
   原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability)
 数据类型与约束
  数据类型
   整数:int,bit
   小数:decimal
   字符串:varchar,char
   日期时间: date, time, datetime
   枚举类型(enum)
   特殊类型说明
    decimal表示浮点数,如 decimal(5, 2) 表示共存5位数,小数占 2 位.
    char表示固定长度的字符串,如char(3),如果填充'ab'时会补一个空格为'ab '.
    varchar表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab'
    字符串 text 表示存储大文本,当字符大于 4000 时推荐使用, 比如技术博客.
    对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径.
   数据类型附录表
    整数
     类型 字节大小 有符号范围(Signed) 无符号范围(Unsigned)
     TINYINT 1 -128 ~ 127 0 ~ 255
     SMALLINT 2 -32768 ~ 32767 0 ~ 65535
     MEDIUMINT 3 -8388608 ~ 8388607 0 ~ 16777215
     INT/INTEGER 4 -2147483648 ~2147483647 0 ~ 4294967295
     BIGINT 8 -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709551615
    字符串
     类型 字节大小 示例
     CHAR  0-255 类型:char(3) 输入 'ab', 实际存储为'ab ', 输入'abcd' 实际存储为 'abc'
     VARCHAR 0-255 类型:varchar(3) 输 'ab',实际存储为'ab', 输入'abcd',实际存储为'abc'
     TEXT  0-65535 大文本
    日期
     类型 字节大小 示例
     DATE  4 '2020-01-01'
     TIME  3 '12:29:59'
     DATETIME 8 '2020-01-01 12:29:59'
     YEAR  1 '2017'
     TIMESTAMP 4 '1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC
  数据约束
   主键 primary key: 物理上存储的顺序.
   外键 foreign key: 对关系字段进行约束,
   惟一 unique: 此字段的值不允许重复.
   默认 default: 当不填写字段对应的值会使用默认值,如果填写时以填写为准.
   非空 not null: 此字段不允许填写空值.
 数据库命令行基本操作
  sql服务
   启动sql服务器  sudo service mysql start
   关闭sql服务 sudo service mysql stop
   重启服务 sudo service mysql restart
   检查是否启动 ps ajx|grep mysql
   登录服务器 mysql -u用户名 -p密码  密码可以先不明文输入
   查看版本 select version();
   查看当前时间 select new();
  数据库
   查看所有数据库 show databases;
   使用数据库  use 数据库名;
   查看当前使用的数据库 select database();
   查看当前数据库下所有表 show tables;
   创建数据库 create database 数据库名 charset=utf8;
   删除数据库 drop database 数据库名;
   查看创建数据库的语句 show create database 数据库名;
   数据库备份 mysqldump –uroot –p 数据库名 > 备份名称.sql;
   数据库恢复  mysql -uroot -p 新数据库名 < 备份数据库.sql;  需要先创建一个新数据库
   数据库克隆:导入数据库:第一步:创建空数据库,第二步:use 新数据库 第三步:source 导入的数据库路径
  数据表
   查看当前数据库中所有的表 show tables;
   查看表结构 desc 表名;
   创建表 create table 表名(字段1 类型 约束,字段2 类型 约束,)
   删除表 drop table 表名;
   查看表的创建语句:show create table 表名;
  字段
   添加字段 alter table 表名 add 字段 类型 约束;
   修改字段类型及约束  alter table 表名 modify 字段  新的类型 约束;
   修改字段名 类型 约束   alter table 表名 字段 新字段名 新的类型 约束
   删除字段 alter 表名 drop 字段;
  记录
   查看字段的数据 select 字段 from 表名;
   插入记录 insert into 表名(字段)values(字段对应的值);
   插入多条记录 insert into 表名(字段)  values(字段对应的值) (字段对应的值)
   auto_increment表示自动增长,0可以进行占位
   修改  update 表名 set 字段1=值1,字段2=值2 where 条件; !!!条件不加,全列(字段)将都会被更改
   物理删除记录 delete from 表名 where 条件;
   逻辑删除记录  update 表名 set is_delete=1 where 条件 !!!条件不要忘 ,需要存在一个is_delete字段
 数据库命令行拓展
  常见数据操作命令
   原名 as 别名  as可省略
   消除重复行 distinct 列名
   where 条件
    比较运算符
     等于: =
     大于: >
     大于等于: >=
     小于: <
     小于等于: <=
     不等于: != 或 <>
    逻辑运算符
     and
     or
     not
    模糊查询
     like
     %表示任意多个任意字符
     _表示一个任意字符
    范围查询
     in (值1,值2,...)表示在一个非连续的范围内
      between 初始值 and 结束值 表示在一个连续的范围内
    空判断
     is null
     is not null
   排序
    select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]
    将行数据按照列1进行排序,如果某些行 列1 的值相同时,则按照 列2 排序,以此类推
    asc从小到大排列,即升序   ase可省略,默认升序
    desc从大到小排序,即降序
    默认按照列值从小到大排列(即asc 关键字)
   limit 分页
    select * from 表名 [ where 条件] limit start=0,count
    从start开始,获取count条数据
    start默认值为0
    也就是当用户需要获取数据的前n条的时候可以直接写上 xxx limit n;
   聚合函数
    概念
     组函数,默认情况下 聚合函数会对当前所在表当做一个组进行统计
    特点
     每个组函数接收一个参数(字段名或者表达式)
     * 统计结果中默认忽略字段为NULL的记录 要想列值为NULL的行也参与组函数的计算,必须使用IFNULL函数对NULL值做转换。
     * 不允许出现嵌套 比如sum(max(xx))
    max(列名) 求出集合中数据的最大值
    min(列名)  求出集合中数据的最小值
    count(列名或*)  求出集合中数据的数量
    sum(列名)  求出集合中数据的和
    avg(列名)  求出集合中数据的平均值
   group by 分组 + with rollup
group_concat + having
    注意
     select 后的字段只能出现在以下两种情况:
     在group by后出现过
     在聚合函数中出现
    select 字段(列名) from 表名 group by 分组依据(列名);
    select 字段,group_concat(字段名) from 表名 group by 分组依据;
    select 字段 ,avg(字段) from 表名 group by 字段;
    select 字段,count(*) from students group by gender having count(*)>2(过滤条件);
    select 字段,count(*) from 表名 group by 字段 with rollup;
   连接
    内连接 inner join
     内连接查询:查询的结果为两个表匹配到的数据
    右(外)连接 right join
    左(外)连接 left join
    对于外连接 outer关键字可以省略
select * from 表1 inner或left或right join 表2 on 表1.列 运算符 表2.列
   自连接
    当需要将多张"表"的相关数据汇总一个结果集中, 并且多张"表"的数据来自于同一张表
    自连接就是一种特殊的连接方式
    需要对表起多个不同的别名才能进行自连接查询
   子查询
    概念
    理解
     子查询是嵌入到主查询中
     子查询是辅助主查询的,要么充当条件,要么充当数据源
     子查询是可以独立存在的语句,是一条完整的 select 语句
    标量子查询: 子查询返回的结果是一个数据(一行一列)
     查询班级学生平均年龄
     查询大于平均年龄的学生
     select * from students where age > (select avg(age) from students);
    列子查询: 返回的结果是一列(一列多行)
     查询还有学生在班的所有班级名字
     找出学生表中所有的班级 id
     找出班级表中对应的名字
     select name from classes where id in (select cls_id from students);
    行子查询: 返回的结果是一行(一行多列)
     需求: 查找班级年龄最大,身高最高的学生
     行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素
     select * from students where (height,age) = (select max(height),max(age) from students);
   总结
    SELECT select_expr [,select_expr,...] [     
          FROM tb_name
          [JOIN 表名]
          [ON 连接条件]
          [WHERE 条件判断]
          [GROUP BY {col_name | postion} [ASC | DESC], ...]
          [HAVING WHERE 条件判断]
          [ORDER BY {col_name|expr|postion} [ASC | DESC], ...]
          [ LIMIT {[offset,]rowcount | row_count OFFSET offset}]
    ]
  关联查询
   能用子查询就不要用连接
   大量的数据进行连接查询,会导致内存暴增
   除了左右连接,其他情况下都可以用子查询代替
  批量处理数据
              批量插入数据
(将查询的数据直接插入表中)
    将select语句的结果集插入到一个表中,select查询到的字段名要与插入的字段名依次对应
    insert into 表名(字段名) select 语句
    步骤
     查询出自己想要的数据
     insert into表名(字段名) (select查询语句)
   批量修改数据
(连续更新)
    update 表1 join 表2 on 连接条件 set 某表.字段=值
    步骤
  外键的使用
   外键作用
    约束子表插入或更新数据,必须满足主表对该数据的要求
    外键的数据必须属于在外键表中
    使用到外键约束会极大的降低表更新的效率, 所以在追求读写效率优先的场景下一般很少使用外键
   添加外键
    创建表时字段名 类型 约束,foreign key(字段名) references 主表名(字段名)
    alter table 表名 add foreign key(字段名) references 主表名(字段名)
   删除外键
    删除约束 alter table 表名 drop foreign key 外键名; 外键名可以通过查看表创建语句获取
    删除记录 alter table 表名 drop key 外键绑定的字段名;
  案例:根据商品表中的分类信息创建分类表
   创建 "商品分类"表
   将分类信息导入到分类中
   将商品表中的分类名称更改为分类名称对应的分类id
   根据商品表中的品牌信息创建品牌表
    创建 "商品品牌表" 表并导入品牌名称
    使用商品品牌表中的信息更新商品表信息
    修改商品表表结构
   添加外键
 数据库编程
  事务
   概念
    事务Transaction,是指作为一个基本工作单元执行的一系列SQL语句的操作,要么完全地执行,要么完全地都不执行。
   特性ACID
    原子性(Atomicity):整个事务被视为一个整体最小单位,要么整体都执行,要么没有执行,不可能只执行其中一部分操作
    一致性(Consistency):事务的状态与数据库状态保证一致
    隔离性(Isolation):事务与事务之间完全隔离,互不影响
    持久性(Durability:一旦事务提交,其修改会永久保存到数据库中,不可撤销
   使用方法
    数据库引擎必须是innodb类型支持事务
    开启事务 begin;或者start transaction;
    提交事务  commit;
    回滚事务 rollback;
    回滚只支持对于数据记录,对于删除表删库不可回滚(撤销)
   使用注意
    修改数据会自动触发事务:insert、update、delete
    mysql命令行中会自动提交事务
    键入 set autocommit=0 不进行自动提交
    需要进行多次数据修改是,手动开启提交,成功一起成功,失败回滚到之前
    不可撤销
  索引
   一种特殊的文件,包含数据表里所有记录的位置信息,类似于目录,加快数据库的查询速度
   索引的使用
    查看表中的索引:show index from 表名;
    创建索引 create index 索引名称 on 表名(字段名称(长度))
     如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
     字段类型如果不是字符串,可以不填写长度部分
    使用 使用索引名称直接代替原表名即可
     创建 create index xxx on 表名(字段名[(索引长度 字符串类型才需要指定)])
     查看 show index for xxx
     使用时 使用索引代替原表名
    删除索引 drop index 索引名称 on 表名;
    总结
     索引可以明显提供某些字段的查询效率
     建立索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件,对于需要常更新和插入的表格以及较小的表没有必要建立
     建立索引将会增加占用磁盘空间
  Python操作mysql
步骤
   初始化步骤
    1.导入  from pymysql import connect
    2.连接数据库  连接对象 = connect(host='Ip地址', port=数据库端口, user='用户名', password='密码', database='数据库名', charset='utf8')     IP地址填写localhost 代表本机
    3.创建游标 游标对象 = conn.cursor()
   装载sql执行语句
    4.执行sql语句  cs.execute("mysql语句%s",(参数1,...))  安全传参,避免sql注入
   装载后处理处理
    查询语句,获取查询结果
     获取一条数据     游标对象.fetchone()
     获取所有查询到的数据    游标对象.fetchall()
    增删改语句,提交数据
     提交数据 连接对象.commit()   查询可以省略这条语句
     撤销数据 连接对象.rollback()
   关闭游标和连接
    关闭游标 游标对象.close()
    关闭连接  连接对象.close()
  总结
  字符串替换
   sql语句使用字符串拼接时,'数据',两边的引号不能省略
   安全传参时,使用%s占位时引号必须省略
 数据库维护管理
  视图
   简介
    替换(封装)复杂的sql语句功能,简化操作,增强可读性
   定义视图
    creat view 视图名称 as select复杂语句;
   查看视图
    show tables;
   使用视图
    select * from 视图名称;
   删除视图
    drop view 视图名称;
   总结
    视图封装了对多张基本表的复杂操作,简化用户操作
    视图只是一个虚表,并不存储任何基本表的表数据,当用户使用视图的时候 视图会从基本表中取出
    通过视图可以对用户展示指定字段从而屏蔽其他字段数据,更加安全
  用户管理
   权限分类-用户
    服务实例级账号,启动一个mysql即为一个实例,此为管理员
    数据库级账号,对特定的数据库执行增删改查的所有操作
    数据表级账号,对特定表执行增删改查等所有操作
    字段级的权限,对某些表的特定字段进行操作
    存储程序级的账号,对存储程序进行增删改查的操作
   用户管理
    查看用户表 desc user
     Host表示允许访问的主机
     User表示用户名
     authentication_string表示密码,为加密后的值
    查看所有用户 select host,user,authentication_string from user
    创建用户 grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码'
     权限列表 select读...all 所有
     访问主机  %代表任意ip都可以访问 localhost或具体ip代表本机或特定主机
    删除用户 drop user '用户名'@'主机'
    delete from user where user = '用户名';
    学习网址 http://blog.csdn.net/lxpbs8851/article/details/10895085
   权限管理
    grant 权限名称 on 数据库 to 账户@主机 with grant option;
    修改密码 usdate user set authentication_string=password('新密码') where user='用户名';
    password( )函数加密
    修改后需要刷新权限 flush privileges
   远程登录(危险-慎用)
    修改vim /etc/mysql/mysql.conf.d/mysqld.cnf
    在bind-addr = 127.0.0.1 前用#注释,不注释只能本地登录
    重启mysql  service mysql restart
  主从配置
   作用
    从机数据库同步主机数据库,提高数据安全以及服务的稳定性
    可以通过增加从服务器提高数据库性能
    主机用于增删改,从机用于查询
   备份
    mysqldump –uroot –p 数据库名 > python.sql;
   恢复
    mysql -uroot –p 新数据库名 < python.sql
    导入数据库:第一步:创建空数据库,第二步:use 新数据库 第三步:source 导入的数据库路径
   步骤
  数据库备份与恢复
   查看所有数据库 show databases;
   使用数据库  use 数据库名;
   查看当前使用的数据库 select database();
   查看当前数据库下所有表 show tables;
   创建数据库 create database 数据库名 charset=utf8;
   删除数据库 drop database 数据库名;
   查看创建数据库的语句 show create database 数据库名;
   数据库备份 mysqldump –uroot –p 数据库名 > 备份名称.sql;
   数据库恢复  mysql -uroot -p 新数据库名 < 备份数据库.sql;  需要先创建一个新数据库
   数据库克隆:导入数据库:第一步:创建空数据库,第二步:use 新数据库 第三步:source 导入的数据库路径
 查询美化l分类展示内容: 查询语句最后面 \G

你可能感兴趣的:(mysql--常用)