MySQL

mysql8安装(数据和配置放在/usr/local/docker/mysql/目录下)

1.先运行一个容器

docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql 

2.从容器中复制出data(这个不要)

docker cp mysql:/var/lib/mysql/ /usr/local/docker/mysql/data/

3.同理复制出配置文件

docker cp mysql:/etc/mysql/my.cnf /usr/local/docker/mysql/conf/my.cnf

4.停止容器 删除容器

docker rm -f mysql

5.映射启动 mysql镜像 --privileged=true 是对容器赋予权限-v是将容器内部的文件映射到外部

docker run -d --restart unless-stopped --name mysql --privileged=true -p 3306:3306 -v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /usr/local/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

编写docker-compose.yml

docker network create --subnet=172.10.0.0/24 kexianjun_network

version: '3'
services:
  db:
    image: mysql
    container_name: mysql
    restart: always
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: kexianjun
      MYSQL_PASSWORD: 123456
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
    ports:
    - '3360:3306'
    volumes:
    - "/usr/local/docker/mysql/data:/var/lib/mysql"
    - "/usr/local/docker/mysql/conf/conf.d:/etc/mysql/conf.d"
#如果复制了docker中的my.cnf就就上下面这一句,如果没有复制则不能加,上面的可以直接使用
    - /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf
    networks:
      default:
        ipv4_address: 172.10.0.5
networks:
  default:
    external:
      name: kexianjun_network

最简单的docker-compose.yml

version: '3'
services:
  mysql:
    image: mysql
    restart: always
    container_name: mysql
    privileged: true
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf
      - /usr/local/docker/mysql/data:/var/lib/mysql

mysql8版本order by查询报错问题解决

修改/usr/local/docker/mysql/conf/my.cnf

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

查询字符集

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; 

用户权限

查询所有用户

select user,host from mysql.user;

创建用户test设置密码:123456

create user 'test'@'%' identified by '123456';

插入上述是报错:1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解决:
1.查看sql_mode,sql语句为:

select version(), @@sql_mode;
select @@GLOBAL.sql_mode;

查询出来的值为:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
2.去掉ONLY_FULL_GROUP_BY,重新设置值

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
set @@global.sql_mode=(select replace(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 
在my.cnf 里面设置
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
在sql_mode 中去掉only_full_group_by 

授权数据库并刷新生效

grant all privileges on h**a.* to 'test'@'%';
flush privileges;
# 授权management库给test在任何地方登陆
grant all privileges on management.* to 'kexianjun'@'%'; #所有权限
grant select,insert,update,delete on management.* to 'text'@'%';#只能增删改查,不能删除表

接触test用户所有权限

revoke all privileges on *.* from 'test';

删除test用户

drop user 'test';

修改用户密码

alter user 'root'@'%' identified by '123456';
flush privileges;
alter user 'root'@'localhost' identified by '123456';

1.数据类型

数字:int decimal

字符串:char ,varchar,text

日期:datetime

布尔:bit

2.约束

主键 primary key

非空 not null

唯一 unique

默认 default

外键 foreign key

3.数据库连接数设置

show variables like '%max_connections%'; -- 显示数据库最大连接数量

set GLOBAL max_connections=400; -- 设置数据库最大连接数

二、基本操作

说明8.0版本

-- 修改原来的加密方式
ALTER USER 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
-- 修改密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 刷新
FLUSH PRIVILEGES;

1.登录mysql数据库

mysql -u root -p  #然后数据密码即可登录
quit #退出

2.建立数据库

create database 数据库名 charset=utf8; -- 建立数据库项目

3.删除数据库

drop database 数据库名;

4.切换/使用数据库

use 数据库名;

5.查看当前数据库

select database();

6.创建表

create table user(  -- 建立一个名为user的表
    id int primary key auto_increment,-- primary key 主键约束:
    username varchar(20) unique, -- nuique 唯一约束
    password varchar(20) not null,-- not null 非空约束
    gender bit default 1,
    age int,
    birthday date
);

7.显示数据库

show databases ;

8.显示所有表

show tables ;

9.删除表

drop table user;

10.显示表结构

desc user;

11.显示建表语句

show create table 表名;

三、修改表

1.添加列

alter table 表名 add 列名 类型(长度) 约束;

2.修改列

alter table 表名 modify 列名 类型(长度) 约束; -- 修改列类型

3.删除列

alter table 表名 drop 列名;

4.修改列

alter table 表名 change 旧列名 新列名 类型(长度) 约束;

5.修改表名

rename table 表名 to 新的表名;

6.设置表的字符集

alter table 表名 character set 字符集;

7.外键关联

alter table 表名 add constraint 约束名字 foreign key(外键字段) reference 表名(表中字段/主键);

四、添加数据

1.没有设置主键自增

insert into 表名(列名1,列名2) values(值1,值2);
insert into 表名 values(值1,值2);

2.主键自增型

insert into 表名 values(值2,值3);

五、修改数据

update 表名 set 列名1=值1,列名2=值2 [where 条件];
update 表名 set 列名1=值1,列名2=值2 where 列名3=值3;

六、删除数据

delete from 表名 [where 条件];-- 删除表中的数据,如果没有条件就是清空表中的所有数据
delete from user;-- 删除user表中的数据,回滚可恢复,属于dml语句
truncate table user;-- 删除user表中的数据,不可恢复,属于ddl语句

七、查询数据

1.不带条件的查所有

select * from user;

2.带条件查询

1.连接符and、or、not

select * from user where username='柯贤军' and age=28;

2.模糊查询like、_ 、in、between……and

select * from user where username like '张%/_';
#查询名字中有张的/和张一个字的
select username from user where username in('xxx','yyy');

3.判断空:is null、is not null

3.去除重复

select distinct * from user where  age=28;

4.分组查询

select 列1,列1,聚合 from 表名 group by 列1,列2 having 列1="" and 列2 like '';
select * from 表名 where 列1="条件" order by 列名 asc/desc; #排序 asc是正序
select * from 表名 limit 1,5;# 查询第2也的5条信息

select distinct * from 表名 where 条件 group by 列名 having 条件 order by 列名 limit start,count

5.连接查询

select …… from 表1 inner join 表2 on 条件;

select ……from 表1 left join 表2 on 条件;

select …… from 表1 right join 表2 on 条件;

select distinct 列* from 表1 inner|left|right join 表2 on 表1和表2的关系 where 条件

group by 列名 having 条件 order by 列名* asc|desc limit start,count ;

6.子查询

7.视图

语法

create view 视图名 as (select *from 表名 join 表名2 on 条件)
alter view 视图名 as  (sql语句)

8.索引

show index from 表名;#显示表的索引
create index 索引名 on 表名(字段(长度)); #创建索引
drop index [索引名称] on 表名;
reate index userid_index on hy_order_2018 (USERID); 

9.性能检测

set profiling=1;#这里相当于开启性能检测
需要测试的sql都在这里写
show profiles;#显示性能检测结果

八、集群

replication集群方案:读写非强一致,不适合保存高价值数据

PXC集群方案:读写强一致性,适合高价值数据

mycat:同时管理两种集群方案

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 了解SQL 1.1 数据库基础 ​ 学习到目前这个阶段,我们就需要以某种方式与数据库打交道。在深入学习MyS...
    锋享前端阅读 1,129评论 0 1
  • 手动不易,转发请注明出处 --Trance 数据库系统命令: (1).查看存储过程状态:show pro...
    Trance_b54c阅读 1,699评论 0 8
  • 1.数据库简介 人类在进化的过程中,创造了数字、文字、符号等来进行数据的记录,但是承受着认知能力和创造能力的提升,...
    大熊_7d48阅读 563评论 0 1
  • mysql数据库中 :database : 文件夹table : 数据表(数据文件) 进入mysqlmysql -...
    赋闲阅读 580评论 0 0
  • MySQL技术内幕:SQL编程 姜承尧 第1章 SQL编程 >> B是由MySQL创始人之一Monty分支的一个版...
    沉默剑士阅读 2,473评论 0 3