#查看数据版本、查看数据库默认字符集
select VERSION();
show variables like 'character%'

#显示数据库
SHOW DATABASES;

#创建数据库,CHARSET指定数据库采用的字符集,默认utf8mb3(即utf8),COLLATE指定数据库字符集校对规则,默认utf8_general_ci(不区分大小写),utf8_bin(区分大小写)
#MySQL数据库的"utf8"并不是真正概念里的 UTF-8,UTF-8编码是应该能支持4字节的字符
CREATE DATABASE IF NOT EXISTS testDB DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

#显示数据库创建语句
SHOW CREATE DATABASE testDB;

#删除数据库
DROP DATABASE testDB;

#数据库备份与恢复
#备份数据库 /usr/bin/mysqldump -u root -p -B testDB > /opt/bak.sql
#备份数据库的表 /usr/bin/mysqldump -u root -p testDB testTable > /opt/bakTable.sql
#恢复 source /opt/bak.sql (在MySQL命令行执行)

#创建表:字符集和字符集校对规则如果不指定则为所在数据库的字符集、字符集校对规则
USE testDB;

CREATE TABLE t4
(
    id INT UNSIGNED AUTO_INCREMENT,
    username CHAR(10),
    address  VARCHAR(40)
,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE utf8mb4_unicode_ci;

#插入数据
INSERT INTO t4 (username, address) VALUES ('小明', '💋');

#删除
DROP TABLE testTable;

#修改表
#增加列
ALTER TABLE t4
 ADD image VARCHAR(32) NOT NULL DEFAULT '' AFTER username;
#修改列
ALTER TABLE t4
 MODIFY image VARCHAR(64) NOT NULL DEFAULT '';
DESC t4;
#删除列
ALTER TABLE t4 DROP image;
#修改表名
RENAME TABLE t4 TO employee;
#修改列名
ALTER TABLE employee CHANGE address address_city VARCHAR(32) NOT NULL DEFAULT '';
DESC employee;


#MySQL NULL处理
MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符,不能使用= NULL 或 != NULL
IFNULL(expression, alt_value):expression IS NOT NULL ? expression : alt_value 

#MySQL自增长
#一个表只能有一个AUTO_INCREMENT,一般和PRIMARY KEY一起使用(也可和UNIQUE使用),自增长的字段类型一般为整型(小数也可,但一般不会这样用)
CREATE TABLE t8
(
    id     TINYINT PRIMARY KEY AUTO_INCREMENT,
    //id     FLOAT UNIQUE AUTO_INCREMENT,
    `name` VARCHAR(32)
);
INSERT INTO t8 VALUES (NULL, '小明');
INSERT INTO t8 (`name`)VALUES ('小王');
#修改默认的自增长开始值
ALTER TABLE t8 AUTO_INCREMENT = 100;
INSERT INTO t8 (`name`) VALUES ('小张');

#返回两张表的笛卡尔积
SELECT * FROM table1,table2;
#多表查询条件不能少于表的个数-1,否则会出现笛卡尔积
SELECT * FROM table1,table2 WHERE table1.field = table2.field;

#自连接
mysql有时在信息查询时需要进行对自身连接(自连接),我们需要为表定义别名

#子查询
SELECT * FROM xxx WHERE col > [ANY|ALL](SELECT * FROM xxx);
SELECT * FROM xxx WHERE col IN (SELECT ... FROM xxxx);
SELECT * FROM (SELECT ...) AS name WHERE ...
SELECT * FROM xxx WHERE (field1,field2...) = (SELECT field1,field2... FROM xxx)
#将子查询当做一张临时表
SELECT ... FROM (SELECT ... FROM xxx) temp,table2 WHERE ...;

#表复制
CREATE TABLE targetTable LIKE sourceTable;
#复制表结构到新表
INSERT INTO targetTable SELECT * FROM sourceTable;#复制表结构及数据到新表

#UNION ALL 和 UNION(会去重)
SELECT COLUMN,...FROM table1
UNION [ALL]
SELECT COLUMN,...FROM table2

SELECT name,english FROM student
UNION ALL
SELECT id,math FROM student; 

#MySQL中的8个character_set变量
一、character_set_client
  主要用来设置'客户端'使用的字符集。

二、character_set_connection
  主要用来设置'连接数据库'时的字符集,如果程序中没有指明连接数据库使用的字符集类型则按照这个字符集设置。

三、character_set_database
  主要用来设置'默认创建数据库'的编码格式,如果在创建数据库时没有设置编码格式,就按照这个格式设置。

四、character_set_filesystem
  文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的。

五、character_set_results
  '数据库给客户端返回时'使用的编码格式,如果没有指明,使用服务器默认的编码格式。

六、character_set_server
  服务器安装时指定的默认编码格式,这个变量建议由系统自己管理,'不要人为定义'。

七、character_set_system
  数据库系统使用的编码格式,这个值一直是utf8,'不需要设置',它是为存储系统元数据的编码格式。

八、character_sets_dir
  这个变量是字符集安装的目录。