Mysql学习

基础命令

mysql -uroot -p -P3306 -h127.0.0.1      # 会提示输入密码
mysql -u root -p -h 127.0.0.1 sampdb # 会提示输出密码,登录后默认使用sampdb数据库
mysql < my.sql  # 执行sql文件(为登录)
SOURCE my.sql   # 执行sql文件(已登录)
quit    # 退出
CREATE DATABASE sampdb;   # 创建sampdb数据库
SHOW DATABASES;        # 显示所有数据库
SELECT DATABASE();      # 查询当前使用的数据库
USE sampdb;          # 指定使用sampdb数据库
# 创建表user
CREATE TABLE `user` (
  `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

DESCRIBE `user`;      # 展示创建表的详细信息
DESCRIBE `user` 'name' # 只展示name字段
DESC `user`;         # 展示创建表的详细信息
SHOW COLUMNS FROM `user`; # 展示创建表的详细信息
SHOW FIELDS FROM `user`; # 展示创建表的详细信息

SHOW TABLES;         # 显示所有表

SELECT * FROM `user`;    # 查询

INSERT INTO `user` VALUES('1', 'zhang1', '11', '11@sampdb.com');  # 按顺序插入一条数据(所有字段)
INSERT INTO `user` VALUES ('2', 'zhang2', '12', '12@sampdb.com'),('3', 'zhang3', '13', '13@sampdb.com');  # 按顺序插入多条数据(所有字段)
INSERT INTO `user` (id, `name`, age, email) VALUES ('4', 'zhang4', '14', '14@sampdb.com');  # 按指定字段插入一条数据
INSERT INTO `user` (id, `name`, age, email) VALUES ('5', 'zhang5', '15', '15@sampdb.com'),('6', 'zhang6', '16', '16@sampdb.com'); # 按指定字段插入多条数据
INSERT INTO `user` SET id='7', `name`='zhang7', age='17', email='17@sampdb.com';  # 使用set添加指定字段

 数据库模式:

  1、STRICT_ALL_TABLES和STRICT_TRANS_TABLES:严格模式,拒绝“坏”数据值

  2、TRADITIONAL:复合模式(类似严格模式),处理”坏“数据更接近于传统SQL服务器

  3、ANSI_QUOTES:识别双引号为【标识符引用字符】

  4、PIPES_AS_CONCAT:识别“||”为标准的SQL【字符串合并操作符】

  5、ANSI:复合模式(ANSI_QUOTES,PIPES_AS_CONCAT和另外几种模式值),更接近于标准的SQL

SET sql_mode = 'TRADITIONAL'           # 设置回话级SQL模式
SET GLOBAL sql_mode = 'TRADITIONAL'    # 设置全局级SQL模式  

SELECT @@SESSION.sql_mode;            # 查看会话级SQL模式
SELECT @@GLOBAL.sql_mode;             # 查看全局级SQL模式

数据库字符集:

SHOW CHARACTER SET LIKE 'latin%';    # 查看字符集种类
SHOW VARIABLES LIKE 'character\_set\_%';    # 查看当前MySQL服务器字符集
SHOW VARIABLES LIKE 'collation\_%';    # 查看当前MySQL服务器排序方式

CREATE DATABASE sampdb CHARACTER SET utf8 COLLATE  utf_danish_ci;    # 创建数据库时设置字符集
CREATE TABLE tb_samp (...)  CHARACTER SET utf8 COLLATE  utf_danish_ci;    # 创建数据表时设置字符集
c_samp CHAR(10) CHARACTER SET utf8 COLLATE  utf_danish_ci;     # 创建属性时设置字符集

数据库存储引擎:

  1、ARCHIVE:用于数据存档(数据插入后不能修改)

  2、BLACKHOLE:写操作是删除数据,读操作是返回空白记录

  3、CSV:存储数据以逗号(,) 作分隔符

  4、EXAMPLE:存根存储引擎

  5、Falcon:事务处理

  6、FEDERATED:访问远程数据表

  7、InnoDB:具备外键,事务处理

  8、MEMORY:基于内存

  9、MERGE:管理有多个MyISAM数据表构成的数据表集合

  10、MyISAM:默认

  11、NDB:MySQL Cluster专用存储引擎

注:这些信息位于information_schema.ENGINES表中

SHOW ENGINES;    # 查看MySQL服务器的存储引擎
ALTER TABLE tb_name ENGINE = engine_name;  # 转换表引擎

数据库操作语法:

USE db_name;    # 选定数据库语法
CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset] [COLLATE collation];    # 创建数据库语法
DROP DATABASE db_name;    # 删除数据库语法
ALTER DATABASE [db_name] [CHARACTER SET charset] [COLLATE collation];    # 变更数据库语法

数据表操作语法:

格式文件:每创建一个数据表,MySQL就会创建一个文件来保存该数据表的格式(.frm)

数据文件:

存储引擎   硬盘上的文件
MyISAM .MYD(数据)、.MYI(索引)
MERGE .MRG(由MyISAM数据表的名字构成的清单)
InnoDB .ibd(数据和索引)
ARCHIVE .ARZ(数据)、.ARM(元数据)
CSV .CSV(数据)、.CSM(元数据)
CREATE [IF NOT EXISTS] [TEMPORARY] tb_name (
    column_name column_type [NULL|NOT NULL] [DEFAULT default_data] [COMMENT comment_info]
)ENGINE=engine_name DEFAULT CHARSET=charset;    # 创建表语法

CREATE [IF NOT EXISTS] [TEMPORARY] TABLE tb_name_1 LIKE tb_name;  # 创建一个原始表的空白副本
INSERT INTO tb_name_1 SELECT * FRAM tb_name;  # 从tb_name填充tb_name_1表

CREATE [IF NOT EXISTS] [TEMPORARY] TABLE tb_name_2 SELECT * FRAM tb_name;  # 创建一个表容纳SELECT查询结果

DROP [TEMPORARY] TABLE [IF EXISTS] tb_name[,tb_name...];  # 删除表
ALTER TABLE tb_name ADD INDEX index_name (index_columns);    # 添加索引
ALTER TABLE tb_name ADD UNIQUE index_name (index_columns);    # 添加唯一性
ALTER TABLE tb_name ADD PRIMARY KEY (index_columns);    # 添加主键
ALTER TABLE tb_name ADD FULLTEXT index_name (index_columns);    # 添加全量索引
ALTER TABLE tb_name ADD SPATIAL index_name (index_columns);    #  添加空间索引

CREATE INDEX index_name ON tb_name (index_columns);
CREATE UNIQUE INDEX index_name ON tb_name (index_columns);
CREATE FULLTEXT INDEX index_name ON tb_name (index_columns);
CREATE SPATIAL INDEX index_name ON tb_name (index_columns);

CREATE TABLE tb_name(
    INDEX index_name (index_columns),
    UNIQUE index_name (index_columns),
    PRIMARY KEY (index_columns),
    FULLTEXT index_name (index_columns),
    SPATIAL index_name (index_columns)
);

CREATE TABLE tb_name (
    i INT NOT NULL PRIMARY KEY,
    j CHAR(10) NOT NULL UNIQUE
);
CREATE TABLE tb_name (
    i INT NOT NULL,
    j CHAR(10) NOT NULL,
    PRIMARY KEY (i),
    UNIQUE (j)
);

CREATE TABLE tb_name (
    name CHAR(30) NOT NULL,
    address BINARY(60) NOT NULL,
    INDEX (name(10)),
    INDEX (address(15))
)    # 字符前缀索引

DROP INDEX index_name ON tb_name;    # 删除索引
ALTER TABLE tb_name DROP INDEX index_name;    # 删除索引

ALTER TABLE tb_name MODIFY i MEDIUMINT UNSIGNED;  # 修改属性类型
ALTER TABLE tb_name CHANGE i k MEDIUMINT UNSIGNED;  # 修改属性i为k,并变更数据类型

ALTER TABLE tb_name ENGINE = engine_name;  # 修改表引擎
ALTER TABLE tb_name RENAME TO new_tb_name;  # 修改表名称
RENAME TABLE tb_name TO new_tb_name[,tb TO new_tb...];  # 修改表名称

CREATE VIEW v_name AS SELECT * FROM tb_name;  # 创建视图(使用方式和表一样)

 事务:

事务问题:

  1、脏读:读取其他事务未提交数据。

  2、不可重复读:两次读取不一致(其他事务修改数据)

  3、幻读:两次读取数据条目不一致(其他事务添加数据)

事务隔离级别:

  1、READ UNCOMMITED:允许读取其他事务未提交数据

  2、READ COMMITED:只允许读取其他事务已提交数据

  3、REPEATABLE READ:两次读取一致,允许其他事务插入或修改(InnoDB)

  4、SERIALIZABLE:两次读取一致,不允许其他事务操作

SELECT @@tx_isolation;  # 查看事务隔离级别

SET GLOBAL TRANSACTION ISOLATION LEVEL level; # 设置全局级事务隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL level; 设置回话级事务隔离级别 SET TRANSACTION ISOLATION LEVEL level; 设置事务级事务隔离级别(适用于下次事务)

LOCK TABLES tb_name_1 WRITE, tb_name_2 READ;  # 给tb_name_1添加写锁,给tb_name_2添加读锁
UNLOCK TABLES;  # 释放前面LOCK所有锁

存储程序:

存储过程:

# 创建存储过程
CREATE PROCEDURE greetings()
BEGIN
    #Routine body goes here...
    DECLARE user_name CHAR(77) CHARACTER SET utf8;
    SET user_name = (SELECT CURRENT_USER());
    IF INSTR(user_name, '@') > 0 THEN
        SET user_name = SUBSTRING(user_name, '@', 1);
    END IF;
    IF user_name = '' THEN
        SET user_name = 'earthling';
    END IF;
    SELECT CONCAT('Greetins, ', user_name, '!') AS greeting;
END;

CALL greetings();    # 调用储存过程

存储函数:

# 创建存储函数
CREATE FUNCTION delimiter(p_year INT) RETURNS INT READS SQL DATA
BEGIN
    #Routine body goes here...
    RETURN (SELECT COUNT(*) FROM `user` WHERE age < p_year);
END;

SELECT delimiter(20) AS year_count;    # 调用存储函数

 触发器:

# 创建触发器  trigger_stmt:触发器语法部分
# NEW.col_name:引用由INSERT或UPDATE处理的新数据行的数据列
# OLD.col_name:引用由DELETE或UPDATE处理的旧数据行的数据列
CREATE TRIGGRT trigger_name 
    {BEFORE | AFTER} 
    {INSERT | UPDATE | DELETE} 
    ON tb_name
    FROM EACH ROW trigger_stmt;

事件:

# 启动mysql前启动事件调度器
[mysqld]
event_scheduler=ON

SHOW VARIABLES LIKE 'event_scheduler';    # 查看时间调度器状态
SET GLOBAL event_scheduler = OFF;    # 停止事件调度器(SUPER权限)0
SET GLOBAL event_scheduler = ON;    # 启动事件调度器(SUPER权限)1

# 创建事件
CREATE EVENT expire_web_session ON SCHEDULE EVERY 4 HOUR
DO
    DELETE FORM web_session WHERE last_visit < CURRENT_TIMESTAMP - INTERVAL 1 DAY;
原文地址:https://www.cnblogs.com/pascall/p/10826657.html