zoukankan      html  css  js  c++  java
  • MySQL1

    MySQL

    下载安装

    • 一般使用社区版的5.6版本,安装完成后需要添加环境变量(将安装目录下的bin文件夹目录添加到环境变量)便于以后使用,也可不加

    • 可以将mysqld添加到系统服务,跟随开机启动服务端,只需要在终端执行命令(要在管理员权限下进行) mysqld --install(本来是路径 --install,因为其路径已经添加到了环境变量),移除 mysqld --remove,注册完成启动服务后,以后再启动和关闭mysql服务时,只需要net start mysql net stop mysql 退出exit

    • window下查看任务 tasklist |findstr mysql 杀死进程 taskkill /F /PID 号码

    • 直接输入mysql进去,通过select user(); 可以查看当前登录的用户是ODBC@localhost,查看所有用户 select user from mysql.user

    • 初始状态下,管理员root,密码为空,默认只允许从本机登录localhost,比较危险,所以需要为管理员设置密码
      mysqladmin -uroot password "123"        设置初始密码 由于原密码为空,因此-p可以不用
      mysqladmin -uroot -p"123" password "456"    修改mysql密码,因为已经有密码了,所以必须输入原密码才能设置新密码
      
      命令格式:
      [root@egon ~]# mysql -h172.31.0.2 -uroot -p456    #以管理员权限登录但是是在非本机上服务端,需要添加服务端的远程ip地址
      [root@egon ~]# mysql -uroot -p      以管理员权限登录
      [root@egon ~]# mysql                    以root用户登录本机,密码为空
      
      创建用户
          create user '用户名'@'IP地址' identified by '密码';
      删除用户
          drop user '用户名'@'IP地址';
      修改用户
          rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';;
      修改密码
          set password for '用户名'@'IP地址' = Password('新密码')
          
      show grants for '用户'@'IP地址'                  -- 查看权限
      grant  权限 on 数据库.表 to   '用户'@'IP地址'      -- 授权
                  grant all privileges on db1.tb1 TO '用户名'@'IP'   授权db1.tb1所有权限
                  grant select on db1.* TO '用户名'@'IP'         授权db1下所有数据表的查看权限
                grant select,insert on *.* TO '用户名'@'IP'    授权所有数据库下所有数据表的查看,插入权限
                  revoke select on db1.tb1 from '用户名'@'IP'    取消db1.tb1下的查看权限
      revoke 权限 on 数据库.表 from '用户'@'IP地址'      -- 取消权限
      
    • 忘记root 密码时,跳过密码登录

      关闭mysql(因为mysqld已经加入到了系统服务项中,所以可以通过net stop mysql)
      # 先关闭mysqld
      #2 在cmd中执行:mysqld --skip-grant-tables  在服务端进行
      #3 在cmd中执行:mysql   在客户端进行登录进去后
      #4 执行如下sql:改密码
      update mysql.user set authentication_string=password('') where user = 'root';
      flush privileges;
      #5 tskill mysqld #或taskkill -f /PID 7832
      #6 重新启动mysql
      """
      基本的原理时,再登录mysql时,由于mysql服务端是运行在本地,所以root账号密码会存在本地的数据文件mysql中,在登陆过程中会进行密码的校验,在启动过程中不加载这些文件(即跳过授权表),即可达到跳过密码的验证。是在服务端进行
      """
      
      或者
      关闭mysql,可以用tskill mysqld将其杀死
      #2. 在解压目录下,新建mysql配置文件my.ini
      #3. my.ini内容,指定
      [mysqld]
      skip-grant-tables
      #4.启动mysqld
      #5.在cmd里直接输入mysql登录,然后操作
      update mysql.user set authentication_string=password('') where user='root and host='localhost';
      flush privileges;
      #6.注释my.ini中的skip-grant-tables,然后启动myqsld,然后就可以以新密码登录了
      
    # 修改默认字符编码 需要新建一个.ini的文件,然后将配置文件放入,如果未修改成,可能出现的原因是配置文件的命名加载有问题,未第一个加载,可以设置成my.ini来避免这个问题;也有可能是拷贝过程中字符编码没有统一,导致写入的配置文件错误。 通过s;查看当前使用的字符编码
      #mysql5.5以上:修改方式有所改动
      [mysqld]
      character-set-server=utf8
      collation-server=utf8_general_ci
      [client]
      default-character-set=utf8
      [mysql]
      default-character-set=utf8
    

    数据库

    • 创建数据库 CREATE DATABASE 数据库名 charset utf8; 不区分大小写(指create,datebase等)

    • 数据库命名规则

      可以由字母、数字、下划线、@、#、$  区分大小写(指数据库名)   唯一性   不能使用关键字如 create select
      不能单独使用数字   最长128位
      
      查看数据库
      show databases;  查看所有
      show create database db1;查看数据表创建的过程
      select database();  查看当前的数据库名称
      
      2 选择数据库
      USE 数据库名
      
      3 删除数据库
      DROP DATABASE 数据库名;
      
      4 修改数据库
      alter database db1 charset utf8;
      
      image-20200903121711310
      # 备份:数据表结构+数据
      mysqldump -u root db1 > db1.sql -p  将数据库db1中的所有导入到db1.sql ,文件路径指的时当前运行终端的位置
      备份:数据表结构
      mysqldump -u root -d db1 > db1.sql -p   只备份表结构
      # 将数据导入到数据库
      create datebase db5;   # 要先创建数据库
      mysqldump -u root -d db5 < db1.sql -p   导入数据
      
    • 基本命令

      #2. 操作文件   (数据表)
          先切换到文件夹下:use db1,如果不切换到文件夹下则需要写绝对目录  
      增:create table t1(id int,name char);
      查:show tables  查看某一个库下所有的表   desc 表名 查看表结构   select * from 表名 查看表下所有的内容
              show create table t1G; #查看表详细结构,可加G
              改:alter table t1 modify name char(3);
                  alter table t1 change name name1 char(2),change id id1 char(4);修改多个字段
       		create table t2 select user,host,password from mysql.user; 复制表结构和特定的字段
      create table t2 select user,host,password from mysql.user where 1=2;  # 只复制表结构不会将附带之前的记录
              create table t3 like t2; # 只复制表结构
      删:drop table t1; # 不会将表的记录删除,如果主键设置了自增类型,那么下次再建立相同类型的表格时,可能会出现主键跟随着上次的地方增加
              # truncate t2删除整张表 
         
      #3. 操作文件中的内容/记录  
              增:insert (into) t1 values(1,'egon1'),(2,'egon2'),(3,'egon3');
              查:select * from t1;
              改:update t1 set name='sb' where id=2;
              删:delete from t1 where id=1;
              清空表:
                  delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
                  truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,
      
                  auto_increment 表示:自增
                  primary key 表示:约束(不能重复且不能为空);加速查找
      

    数据表

    create table 表名(
    字段名1 类型[(宽度) 约束条件],
    字段名2 类型[(宽度) 约束条件],
    字段名3 类型[(宽度) 约束条件]
    );
    #注意:
    1. 在同一张表中,字段名是不能相同
    2. 宽度和约束条件可选
    3. 字段名和类型是必须的,多个字段时,最后的字段不能加逗号
    
    1. 修改表名
          ALTER TABLE 表名 
                              RENAME 新表名;
    2. 增加字段
          ALTER TABLE 表名
                              ADD 字段名  数据类型 [完整性约束条件…],
                              ADD 字段名  数据类型 [完整性约束条件…];
          ALTER TABLE 表名
                              ADD 字段名  数据类型 [完整性约束条件…]  FIRST;
          ALTER TABLE 表名
                              ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;                  
    3. 删除字段
          ALTER TABLE 表名 
                              DROP 字段名;
    4. 修改字段
          ALTER TABLE 表名 
                              MODIFY  字段名 数据类型 [完整性约束条件…];
          ALTER TABLE 表名 
                              CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
          ALTER TABLE 表名 
                              CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
    

    数据类型

    1. 整型:tinyinit  int  bigint  为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了   # 一般使用int
        小数:
            float :在位数比较短的情况下不精准   # 一般使用float
            double :在位数比较长的情况下不精准
            decimal:(如果用小数,则用推荐使用decimal) 精准 内部原理是以字符串形式去存   
    
    2. 字符串:  length:查看字节数 char_length:查看字符数  select x,length(x),y,length(y) from t1;
       #  char和varchar括号内的参数指的都是字符的长度
        char(10):简单粗暴,浪费空间,存取速度快
        字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
        存储:
            存储char类型的值时,会往右填充空格来满足长度       root存成root000000
            例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储
        检索:
            在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)
            
        varchar:精准,节省空间,存取速度慢   # 一般用varchar
    字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
        存储:
            varchar类型存储数据的真实内容,不会用空格填充,如果'ab  ',尾部的空格也会被存起来
            强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用
        sql优化:创建表时,定长的类型往前放,变长的往后放
                        比如性别           比如地址或描述信息
        >255个字符,超了就把文件路径存放到数据库中。比如图片,视频等找一个文件服务器,数据库中只存路径或url。
    
    3. 时间类型:
        最常用:datetime
         YEAR
                YYYY(1901/2155)
            DATE
                YYYY-MM-DD(1000-01-01/9999-12-31)
            TIME
                HH:MM:SS('-838:59:59'/'838:59:59')
            DATETIME
                YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)
            TIMESTAMP
                YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时
    create table t1(x datetime not null default now()); # 需要指定传入空值时默认取当前时间
    create table t2(x timestamp); # 无需任何设置,在传空值的情况下自动传入当前时间
    create table t9(name varchar(5),x datetime not null default now());  # 一般用于注册时间,该时间不会变更
    create table t10(name varchar(5),x datetime not null default now() on update now()) # 更新时间那么需要额外指定on update now()  
    create table t11(name varchar(5),x timestamp);  # 会再修改其他字段的信息时自动修改更新时间,一般用于记录更新的时间
    
    4. 枚举类型与集合类型
    create table consumer( 
        -> name varchar(50),
        -> sex enum('male','female'),
        -> level enum('vip1','vip2','vip3','vip4','vip5'), #在指定范围内,多选一
        -> hobby set('play','music','read','study') #在指定范围内,多选多
        -> );
    insert into consumer values  
        -> ('QQ','male','vip5','read,study'),
        -> ('WC','female','vip1','girl');  # 指定为范围内没有将会空下来
    
    image-20200902091223520

    约束

    约束条件与数据类型的宽度一样,# 都是可选参数
    PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录  # 一张表中必须有且只有一个主键。
    FOREIGN KEY (FK)    标识该字段为该表的外键
    NOT NULL    标识该字段不能为空
    UNIQUE KEY (UK)    标识该字段的值是唯一的
    AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)  #可以设置起始值和步长,默认都为1
    DEFAULT    为该字段设置默认值
    UNSIGNED 无符号
    ZEROFILL 使用0填充
    
    ==========单列做主键===============
    #方法一:not null+unique
    create table department1(
    id int not null unique, #主键
    name varchar(20) not null unique,
    comment varchar(100)
    );
    ==================多列做主键================
    create table service(
    ip varchar(15),
    port char(5),
    service_name varchar(10) not null,
    primary key(ip,port)  # 多列主键
    );
    
    """
    表的三种关系
    """
    =================foreign key===============  多对一  多对多   一对一   主要看主键写在哪个地方
    表类型必须是innodb存储引擎,且被关联的字段,即references指定的另外一个表的字段,必须保证唯一,关联父表,同步更新,同步删除
    # 先创建被关联表  再创建关联表  先往被关联表插入数据  再往关联表插入数据
    ==============一对一====================
    create table department(
    id int primary key,
    name varchar(20) not null
    )engine=innodb;
    
    #dpt_id外键,关联父表(department主键id),同步更新,同步删除
    create table employee(id int primary key,name varchar(20) not null,dpt_id int,
    foreign key(dpt_id) references department(id) on delete cascade on update cascade 
    )engine=innodb;
    
    
    #先往父表department中插入记录
    insert into department values
    (1,'欧德博爱技术有限事业部'),
    (2,'艾利克斯人力资源部'),
    (3,'销售部');
    
    
    #再往子表employee中插入记录
    insert into employee values
    (1,'egon',1),
    (2,'alex1',2),
    (3,'alex2',2),
    (4,'alex3',2),
    (5,'李坦克',3),
    (6,'刘飞机',3),
    (7,'张火箭',3),
    (8,'林子弹',3),
    (9,'加特林',3);
    #删父表department,子表employee中对应的记录跟着删
    mysql> delete from department where id=3;
    mysql> select * from employee;
    
    #更新父表department,子表employee中对应的记录跟着改
    mysql> update department set id=22222 where id=2;
    mysql> select * from employee;
    =====================多对一=====================
    create table press(
    id int primary key auto_increment,
    name varchar(20)
    );
    
    create table book(
    id int primary key auto_increment,
    name varchar(20),
    press_id int not null,
    foreign key(press_id) references press(id)
    on delete cascade
    on update cascade
    );
    
    
    insert into press(name) values
    ('北京工业地雷出版社'),
    ('人民音乐不好听出版社'),
    ('知识产权没有用出版社')
    ;
    
    insert into book(name,press_id) values
    ('九阳神功',1),
    ('九阴真经',2),
    ('九阴白骨爪',2),
    ('独孤九剑',3),
    ('降龙十巴掌',2),
    ('葵花宝典',3)
    ;
    =====================多对多==================         foreign key+一张新的表
    create table author(
        id int primary key auto_increment,
        name varchar(10)
    );
    create table book(
        id int primary key auto_increment,
        name varchar(16)
    );
    create table author2book(
        id int primary key auto_increment,
        author_id int,
        book_id int,
        foreign key(author_id) references author(id) on delete cascade on update cascade,
        foreign key(book_id) references book(id) on delete cascade on update cascade
    );
    ===============一对一================
    create table customer(
        id int primary key auto_increment,
        name varchar(16),
        phone char(11)
    );
    
    create table student(
        id int primary key auto_increment,
        class varchar(10),
        course varchar(16),
        c_id int unique,
        foreign key(c_id) references customer(id) on delete cascade on update cascade
    );
    
    
  • 相关阅读:
    如何创建并运行Java线程
    PHP捕获Fatal error错误与异常处理
    WEB系统启动时加载Log4j的配置文件
    Log4j日志配置
    CharacterEncodingFilter-Spring字符编码过滤器
    Struts2的属性驱动与模型驱动的区别
    Filter之——GZIP全站压缩
    乱码问题总结
    【总结】编写自己的JDBC框架
    四大域总结
  • 原文地址:https://www.cnblogs.com/feiguoguobokeyuan/p/13640121.html
Copyright © 2011-2022 走看看