此篇博客将记述在日常工作中,常用的 MySQL SQL 脚本。会持续的更新。
数据库用户创建和权限控制
  # MySQL 创建 user
  # CREATE USER 'username'@'host' IDENTIFIED BY 'password';
  # 例子:
  CREATE USER 'user_test'@'localhost' IDENTIFIED BY '123456';
  # 开通访问权限
  GRANT ALL ON *.* TO 'user_test'@'localhost' WITH GRANT OPTION;
  SHOW GRANTS FOR user_test@localhost;
  # 密码丢失之后处理
  # 用 SET PASSWORD 命令
 mysql -u user_test
 mysql> SET PASSWORD FOR 'user_test'@'localhost' = PASSWORD('newpass');
  # 用 UPDATE 直接编辑 user 表
 mysql -u user_test
 mysql> use mysql;
 mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'user_test';
 mysql> FLUSH PRIVILEGES;
  # 在丢失 user_test 密码的时候,可以这样
 mysqld_safe --skip-grant-tables&
 mysql -u user_test mysql
 mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='user_test';
 mysql> FLUSH PRIVILEGES;
  
数据库备份 mysqldump 和还原 restore
# 从远程机器,导出数据库,包含 Schema 信息 mysqldump -hHost -uRoot -pPassword database_name > database_name20170316.sql # 导出数据库,包含 Schema 信息 mysqldump -uRoot -pPassword database_name > database_name20170316.sql # 指定导出数据表,包含 Schema 信息 mysqldump -uRoot -pPassword database_name user web_user > database_name_user20120907.sql # 导出数据库,不包含 Schema 信息,仅包含数据 mysqldump -uRoot -pPassword --no-create-db --no-create-info database_name > database_name-20180227.sql # 还原数据 mysql -u Root -p database_name < database_name_user20120907.sql
数据库设置。
# mysql error GROUP BY clause; this is incompatible with sql_mode=only_full_group_by SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode; # 一次性设置,服务重启后失效 SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); # 永久设置,重启后永久失效 /etc/mysql/mysql.conf.d mysqld.cnf [mysqld] sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
数据库查看,创建,删除等。
# Mysql create database utf8 编码 CREATE DATABASE IF NOT EXISTS supergw DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; # 查看数据库列表 show databases; # 删除数据 drop database db_name; # 使用数据库 use `test_db`; # 退出 exit;
表的创建,新建字段,新建索引,修改字段类型等。
  # 创建表
  CREATE TABLE `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    `email` int(11) DEFAULT NULL COMMENT '邮箱',
    `name` varchar(255) DEFAULT NULL COMMENT '名称',
    `price` decimal(10, 2) DEFAULT '0.00' COMMENT '定价',
    `position` int(11) DEFAULT 0 COMMENT '排序',
    `status` int(11) DEFAULT 0 COMMENT '状态',
    `created_at` datetime NOT NULL,
    `updated_at` datetime NOT NULL,
    PRIMARY KEY (`id`),
    KEY `index_users_on_name` (`name`),
    UNIQUE KEY `index_users_on_email` (`email`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
  # 查看表的创建结构
  show create table tablename \G;
  # 清空表至初始状态
  truncate table tablename;
  # 删除表
  drop table if exists `table_a`;
  # 增加字段,设置索引
  ALTER table table_name Add column column_name57 integer AFTER column_name56;
  # 修改字段类型
  ALTER TABLE tabel_name CHANGE  column_name column_name LONGTEXT;
  
查询数据,将查询结果保存到临时表。
  # 将查询结果保存到临时表
  insert into temp_user_price(user_id,price,created_at)(select user_id,price,created_at from user_price where user_id = 1);
  # 判断字符的长度
  select id,name from users where CHAR_LENGTH(name) > 7;
  # left join 查询右侧表,为空的情况
  select a.user_id,b.id
    from table_a as a
    left join table_b as b on a.user_id = b.user_id
    where b.id is null;
  # COALESCE 函数从值列表中返回第一个非NULL的值,当遇到NULL值时将其替换为0。
  UPDATE `users` SET `users_count` = COALESCE(`users_count`, 0) + 1 WHERE `users`.`id` = 26;
  
数据更新操作。
  # 更新一条记录
  update table_a set `name` = 'henry' where id = 1 limit 1;
  # 两个表关联后,更新其中一个表
  update table_a,table_b
    set table_a.begin_day = table_b.begin_day,
        table_a.begin_price = table_b.begin_price
    where table_a.user_id = table_b.user_id;
  
  2018-03-09