zoukankan      html  css  js  c++  java
  • MySQL操作

    mysql架构

    类似socket客户端和服务端

    流程:

    1. mysql服务端先启动,监听在一个特定的关口,默认3306
    2. mysql客户端连接服务端
    3. mysql客户端可以发送相关操作命令,操作服务端存储的数据

    mysql操作

    初始化:

    mysqld --initialize-insecure

    启动mysql服务:

    mysqld 启动mysql服务

    启动mysql客户端并连接mysql服务:

    mysql -uroot -p

    修改mysql密码:
    C:Windowssystem32>mysqladmin -uroot -p "原密码"  password  "新密码"
    	
    出现的错误
    C:Windowssystem32>mysql -uroot -p
    Enter password:
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    如果出现上述错误,代表密码输入错误
    
    常用参数:

    -u : user 用户名

    -p : password 密码

    -h : host 主机名或ip mysql -uroot -p -h 192.168.0.1

    -P : port 端口号,默认3306 mysql -uroot -p -h 192.168.0.1 -P 3306

    忘记密码:
    1. 关闭mysql服务 管理员cmd中 net stop mysql57

    2. 在cmd中执行:mysqld --skip-grant-tables 绕过密码验证的过程

    3. 在cmd中执行:mysql mysql -uroot -p 走无密码通道

    4. 执行下列sql指令:

      update mysql.user set authentication_string = password('') where user = 'root';

      flush privileges;一定要做

    5. 重启mysql服务

    SQL指令

    操作数据库

    ​ create database 数据库名 charset utf8;

    ​ 命名规范:

    ​ 可以由字母,数字,下划线,@,#,$组成

    ​ 区分大小写

    ​ 唯一性

    ​ 不能使用关键字

    ​ 不能使用单独数字

    ​ 最长128位

    ​ drop database 数据库名;

    ​ 删除再添加

    ​ 如果数据库中由数据的话,直接drop会导致数据库中的数据丢失

    改和删之前一定要备份,或者不用

    ​ show databases;

    ​ show create database 数据库名; 查看建立的数据库

    ​ select database();

    使用数据库(可不加;)

    ​ use 数据库名;

    操作表

    创建表
    create table 表名(
        字段名1  列类型  [可选的参数],
        字段名1  列类型  [可选的参数]  --最后一行不加逗号
        ) charset=utf8;
    增加字段
    ALTER TABLE 表名
    	ADD 字段名 列类型 [可选的参数],
    	ADD 字段名 列类型 [可选的参数];	
    alter table t1 add name varcher(32) not null default '';--在表尾部追加
    
    ALTER TABLE 表名 DD 字段名 列类型 [可选的参数] FIRST;
    alter table t1 add name varcher(32) not null default '' first;--在头部追加
    
    ADD 字段名 列类型 [可选的参数] AFTER 字段名;
    alter table t1 add name varcher(32) not null default '' after id;
    

    列约束:

    auto_increment 自增

    primary key 主键索引 列的值不可重复

    NOT NULL 标识该字段不能位空

    注意:null占长度为null,''占空间为0

    mysql> select length(NULL),length(''),length('1'),length('abc');
    +--------------+------------+-------------+---------------+
    | length(NULL) | length('') | length('1') | length('abc') |
    +--------------+------------+-------------+---------------+
    |         NULL |          0 |           1 |             3 |
    +--------------+------------+-------------+---------------+
    1 row in set (0.00 sec)
    

    DEFAULT 为字段设置默认值

    删(线上禁用)
    删除表
    drop table 表名:
    删除字段
    alter table 表名 drop 字段名;
    

    1.修改表名

    alter table 旧表名 rename 新表名;
    

    2.修改(增加)字段

    ALTER TABLE 表名
    	ADD 字段名 列类型 [可选的参数],
    	ADD 字段名 列类型 [可选的参数];	
    alter table t1 add name varcher(32) not null default '';--在表尾部追加
    
    ALTER TABLE 表名 DD 字段名 列类型 [可选的参数] FIRST;
    alter table t1 add name varcher(32) not null default '' first;--在头部追加
    
    ADD 字段名 列类型 [可选的参数] AFTER 字段名;
    alter table t1 add name varcher(32) not null default '' after id;
    

    3.删除字段

    ALTER TABLE 表名  DROP 字段名;
    mysql> alter table t88 drop name4;
    Query OK, 0 rows affected (0.66 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    4.修改字段

    ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…];
    mysql> alter table t88 modify name2 char(20);
    Query OK, 1 row affected (0.88 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    				
    				
    ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
    				
    mysql> alter table t88 change name2 name22 varchar(32) not null default '';
    Query OK, 1 row affected (0.82 sec)
    Records: 1  Duplicates: 0  Warnings: 0	
    				
    mysql> alter table t88 change name22 name23;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
    
    show tables;--显示目前数据库下所有表
    show create table 表名;--显示表名表所有信息
    

    复制表结构:

    create table t2 like t1;--创建t2与t1表结构相似
    

    操作表数据行

    增加数据
    insert into 表名 (列1,列2) values (值1,值2);
    insert into t1 (id,name) values (1,'tom'),(2,'jerry'),(3,'James');
    insert into t1 (name) select name from t2;
    
    delete from 表名 where 条件;--删除满足条件的值
    delete from 表名;--删除表中所有数据,后面再添加数据,自增从之前的数据继续加1
    truncate 表名;--删除表中所有内容,后面再添加数据,从1开始
    

    注意:delete删除是一行一行的删除,truncate是全选删除,truncate删除的效率高于delete

    update 表名 set 列名1=新值1,列名2=新值2 where 条件;
    update t1 set name = 'tooom' where id = 1;
    
    定区间查询
    select 列1,列2 from 表名 between 30 and 40;(*代表所有查询结果)
    去重查询
    select distinct name from t1;--返回不重复的值
    

    %代表所有,_代表一个

    单表操作

    分组 group by

    将所有记录按照某个相同的字段进行归类.

    select 聚合函数,选取的字段 from employee group by 分组的字段;

    group by 必须和 聚合函数连用

    二次筛选 having

    对group by 之后的数据进行二次筛选

    升序降序 order by

    order by 字段名 asc (默认升序) desc (降序)

    分页 limit

    limit offset ,size;

    offset表示行数据索引,默认从第一行(索引为0)开始;

    size 表示 取多少条数据

    总结

    使用顺序

    select * from 表名 where 条件 group by 条件 having 条件 order by 条件 limit 条件;

    where > group by > having > order by > limit

    多表操作

    外键

    方便多个表之间的查询及连接

    外键自动生成为普通索引.

    一对多:

    constraint 外键名 foreign key (被约束的字段) references 约束的表(约束的字段)

    constraint fk_user_depart foreign key (depart_id) references department(id),
    
    多对多:

    生成中间表对应多个表,谈恋爱

    多表联查:--⬇

    连接JOIN

    交叉连接cross join

    笛卡尔乘积,全部交叉,在MySQL中,cross join从语法上说于inner join等同,数据量大,慎用

    SELECT * from employees CROSS JOIN salaries
    
    内连接

    inner join,省略为join

    • 等值连接,只选默写field相等的元组(行),使用ON限定关联的结果.
    SELECT * from employees INNER JOIN ON employees.emp_no= salaries.emp_no;
    
    • 自然连接,是一种特殊的等值连接,会自动去掉重复的列.用的少
    --自然连接,去掉了重复列,且自行使用employees.emp_no= salaries.emp_no的条件
    SELECT * from employees NATRUAL JOIN salaries;
    
    外连接

    outer join,可以省略为join

    分为左外连接,即左连接;右外连接,即右连接;全外连接

    --左连接
    SELECT * from employees LEFT JOIN salaries ON employees.emp_no= salaries.emo_no;
    --右连接
    SELECT * from employees RIGHT JOIN salaries ON employees.emp_no= salaries.emo_no;
    --这个右连接等价于上面的左连接
    SELECT * from salaries RIGHT JOIN employees ON employees.emp_no= salaries.emo_no;
    

    左外连接,右外连接

    看表的数据的方向,谁是主表,谁的所有数据都显示,匹配不上的显示null

    自连接

    表自己和自己连接

    本质上是把一张表当成两张表来用

    select manager.* from emp manager,emp worker where manaer.empno=worker.mgr and worker.empno=1;
    select manager.* from emp manager inner join emp worker on manaer.empno=worker.mgr where
    worker.empno=1;
    

    索引

    使用索引的作用:

    使用索引为了提高查询的效率.

    索引的本质:

    一个特殊的文件

    索引的底层原理:

    B+树

    索引的种类
    • 主键索引:加速查找 + 不能重复 + 不能为空 primary key pri
      • auto_increment 依赖primary key
      • 想要删除主键要先删除auto_increment
    • 唯一索引:加速查找 + 不能重复 unique(name) uni
      • 联合唯一索引: unique(name,age) 将两列看成一个,两列不可同时重复
      • 支持索引最左前缀
    • 普通索引: 加速查找 index 索引名 (name) mul 这是一个字典目录
      • 联合索引: index (name,age)
      • 支持索引最左前缀

    注意:外键自动为普通索引键类型.

    普通索引重复不重复无所谓,A在第几行或第几行出现过

    唯一键索引.不能重复,A只在第几行出现过

    主键索引.不能重复,A只在第几行出现过

    主键索引:
    增加:
    方法一
    create table user(
        id int auto_increment primary key,
        )
        auto_increment 依赖 primary key
    方法二:
    alter table user change id id int auto_increment primary key
    删除:
    先删除auto_increment,才能删除 primary key
    alter table user drop primary key
    唯一键索引:
    增加:
    方法一:
    create table user(
    	id int auto_increment primary key,
        phone int not null default 0,
        name varchar(32),
        unique ix_phone(索引名)  (phone(字段名))
    )
    方法二:
    alter table user add unique index ix_phone (phone);
    方法三:
    create unique index ix_phone on user (phone);
    删除:
    alter table user drop index ix_phone;
    普通索引:
    增加:
    方法一:
    create table user(
        id int auto_uncrement primary key,
        name varchar(32) not null default '',
        index ix_name(name)
        );
    方法二:
    alter table user add undex ix_name (name);
    方法三:
    create index ix_name on user (name);
    删除:
    alter table user drop index ix_name;
    
    索引的创建

    主键一般不另设主键名,唯一键和普通索引建议加键名

    1. 创建表时创建
    create table xxx(
    	id int auto_increment primary key
      --或者primary key  (id)
    );
    
    1. 使用alter方法
    --add方法
    alter table t1 add primary key 键名 (id);
    --change方法
    alter table t1 change id id int auto_increment primary key;
    
    索引的删除

    alter table t2 drop index [键名]

    索引的有缺点

    用空间换时间

    1. 索引加快了查询速度
    2. 会占用更大的磁盘空间
    索引不会被命中的情况(拉低效率)
    1. 不能在SQL语句进行四则运算

    2. 不要使用函数

    3. 类型不一致

      如果列是字符串类型,传入条件是必须用引号引起来,不然无法命中
      select * from tb1 where email = 999;
      #排序条件为索引,则select字段必须也是索引字段,否则无法命中
      
    4. order by

      select name from s1 order by email desc;
      当根据索引排序时候,select查询的字段如果不是索引,则速度仍然很慢
      					
      select email from s1 order by email desc;
      特别的:如果对主键排序,则还是速度很快:
      select * from tb1 order by nid desc;
      

      order by 后面的字段如果没有设置索引,那么排序就很慢

    5. 不要使用count(*)

    最左前缀索引
    explain方法

    在SQL语句前加explain ,结尾使用G结尾执行,显示参数

    mysql> explain select * from teacher_info where name = 'echo'G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: teacher_info
       partitions: NULL
             type: ALL
    possible_keys: NULL
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 4
         filtered: 25.00
            Extra: Using where
    1 row in set, 1 warning (0.00 sec)
    
    慢查询

    查看相关变量

    mysql> show variables like '%slow%';
    +---------------------------+--------------------------+
    | Variable_name             | Value                    |
    +---------------------------+--------------------------+
    | log_slow_admin_statements | OFF                      |
    | log_slow_slave_statements | OFF                      |
    | slow_launch_time          | 2                        |
    | slow_query_log            | ON                       |
    | slow_query_log_file       | DESKTOP-OKFL3T1-slow.log |
    +---------------------------+--------------------------+
    5 rows in set, 1 warning (0.25 sec)
    
    mysql> show variables like  '%long%';
    +----------------------------------------------------------+-----------+
    | Variable_name                                            | Value     |
    +----------------------------------------------------------+-----------+
    | long_query_time                                          | 10.000000 |
    | performance_schema_events_stages_history_long_size       | 10000     |
    | performance_schema_events_statements_history_long_size   | 10000     |
    | performance_schema_events_transactions_history_long_size | 10000     |
    | performance_schema_events_waits_history_long_size        | 10000     |
    +----------------------------------------------------------+-----------+
    5 rows in set, 1 warning (0.00 sec)
    

    配置慢SQL的变量:

    set global 变量名 = 值
    				 
    set global slow_query_log = on;
    				
    set global slow_query_log_file="D:/mysql-5.7.28/data/myslow.log";
    				
    set global long_query_time=1;
    
    约束constrain
    • unique约束 唯一键约束

      定义了唯一键索引,就定义了唯一键约束.

    • primary key约束

      定义了主键,就定义了主键约束.

    • 外键约束 foreign key

      外键,在表B中的列,关联表A中的主键,表B中的列就是外键.

      不易过多使用

      如果B表中某一列关联表A中的主键,那么B键的这一列就是A的外键

      外键可设外键约束

      设置外键约束之后,若想删除表A主键中数据,需先删除表B中的引用,若表A想要更改主键中信息,需要先删除表B的相关记录后,才可以修改表A的主键.

      外键约束,为了保证数据完整性,一致性,杜绝数据冗余,数据讹误.

  • 相关阅读:
    hdu5119 DP
    poj3692 最大点权独立集/最大独立集
    poj2125 最小点权覆盖集
    二分图总结
    poj2531 Network Saboteur
    poj1573 Robot Motion
    poj2632 Crashing Robots
    poj1068
    动态规划的思考(三)
    代刷题目分类(三)
  • 原文地址:https://www.cnblogs.com/agsol/p/11753509.html
Copyright © 2011-2022 走看看