MySQL 常用命令整理

本文以常用的关系型数据库 MySQL 为例,分别从定义、语言分类及具体示例,介绍 MySQL 常用命令。

一、什么是 SQL?

  • SQL 指结构化查询语言,是 “Structured Query Language” 的简写
  • SQL 使我们有能力访问数据库
  • SQL 是一种 ANSI (美国国家标准化组织)的标准计算机语言

二、SQL 语言的分类

  • DDL(Data Definition Languages)语句
    即数据库定义语句,用来创建数据库、表、索引、视图、存储过程、触发器,修改表结构等。
    常用的语句关键字:CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME。
  • DML(Data Manipulation Language)语句
    即数据库操纵语句,用来对表中数据新增、删除、修改等。
    常用的语句关键字:INSERT、UPDATE、DELETE、MERGE、CALL、EXPLAIN PLAN、LOCK TABLE 等。
  • DCL(Data Control Language)语句
    即数据库控制语句,用于用户权限的设置,控制事务。
    常用的语句关键字:GRANT、REVOKE。
  • DQL(DATA Query Language)语句
    即数据库查询语句,用来从表中获取数据。
    常用的语句关键字:SELECT。
    保留字:WHERE、ORDER BY、GROUP BY等。
  • TCL(Transaction Control Language)语句
    即事务控制语句,用于控制事务。
    常用的语句:BEGIN、COMMIT、ROLLBACK等。

三、SQL 语句示例

3.1 DDL 语句示例(CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME)
--如果存在数据库 testdb,就删除
DROP DATABASE IF EXISTS testdb;
-- 创建数据库 testdb
CREATE DATABASE IF NOT EXISTS testdb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
-- 使用数据库 testdb
USE testdb;
-- 如果存在表 tbl_test_menu,就删除
DROP TABLE IF EXISTS `tbl_test_menu`;
-- 创建表 tbl_test_menu
CREATE TABLE `tbl_test_menu` (
  `menu_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '菜单主键',
  `menu_name` varchar(30) NOT NULL DEFAULT '' COMMENT '菜单名称',
  `menu_logo` varchar(50) NOT NULL DEFAULT '' COMMENT '菜单logo',
  `menu_seq` int(2) NOT NULL DEFAULT '0' COMMENT '菜单顺序',
  `rec_st` char(1) NOT NULL DEFAULT '1' COMMENT '记录状态,0:无效;1:有效',
  `rec_crt_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `rec_upd_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 为表 tbl_test_openid 字段 open_id 创建唯一索引
CREATE UNIQUE INDEX idx_open_id ON tbl_test_openid(open_id);

-- 将 tbl_test_mchnt 表字段 cert_nm 修改为 cert_content,字段类型是 BLOB,含义是“证书内容”
ALTER TABLE tbl_test_mchnt CHANGE COLUMN cert_nm cert_content BLOB COMMENT "证书内容";
-- 将 tbl_test_app 表字段 app_ids_incl 类型修改为 VARCHAR(256),名字不变
ALTER TABLE tbl_test_app CHANGE app_ids_incl app_ids_incl VARCHAR(256) NOT NULL DEFAULT '' COMMENT '内含APPID';
-- 将 tbl_test_qr 表字段 rec_upd_ts 值修改为当前记录修改时间,同时调整表字段顺序,在字段 rec_crt_ts 之后
ALTER TABLE tbl_test_qr CHANGE rec_upd_ts rec_upd_ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' AFTER rec_crt_ts;

-- 修改表 tbl_test_order 字段 access_md 为 CHAR(1)
ALTER TABLE tbl_test_order MODIFY COLUMN access_md CHAR(1) NOT NULL DEFAULT '0' COMMENT "交易模式 0:直连模式 1:间连模式 2:大商户接入模式";
-- 调整表格属性列顺序
ALTER TABLE tbl_test_student MODIFY class_id INT(10) AFTER class_name;
ALTER TABLE tbl_test_student MODIFY class_id INT(10) FIRST;

-- 在表 tbl_test_order 字段 order_st 后新增应答码 resp_code 字段,类型为 VARCHAR(10)
ALTER TABLE tbl_test_order ADD COLUMN resp_code VARCHAR(10) NOT NULL DEFAULT '' COMMENT "应答码" AFTER order_st;

-- 修改表 tbl_test_order 的默认编码格式
ALTER TABLE `tbl_test_order` DEFAULT CHARACTER SET utf8;

-- 删除表 tbl_test_trade 全部数据
TRUNCATE TABLE tbl_test_trade;
3.2 DML语句示例(INSERT、UPDATE、DELETE、MERGE、CALL、EXPLAIN PLAN、LOCK TABLE )
-- 向表 tbl_test_question 的部分字段插入数据
INSERT INTO tbl_test_question (app_id, open_id, month_id, question_id, answer) VALUES ("1", "2", "201812", "5", "ABCDE");
-- 向表 tbl_test_menu 全部字段插入值的几种方式
INSERT INTO tbl_test_menu VALUES (2, "1", "美食节", "testdd", "sds", 1, "0", NOW(), NOW());
INSERT INTO tbl_test_menu VALUE (3, "1", "美食节", "testdd", "sds", 1, "0", NOW(), NOW());
INSERT INTO tbl_test_menu VALUES (6, "1", "美食节", "testdd", "sds", 1, "0", NOW(), NOW()), (7, "1", "美食节", "testdd", "sds", 1, "0", NOW(), NOW());
INSERT INTO tbl_test_menu VALUE (4, "1", "美食节", "testdd", "sds", 1, "0", NOW(), NOW()), (5, "1", "美食节", "testdd", "sds", 1, "0", NOW(), NOW());

-- 按条件修改部分表数据
UPDATE tbl_test_user SET user_name = "123" WHERE user_id = "02323";
-- 将表 tbl_test_order 字段 card_tp 值修改为字段 order_st 的值
UPDATE tbl_test_order SET card_tp = order_st;
-- 去掉字段值右侧的空格
UPDATE tbl_test_campus SET campus_name = RTRIM(campus_name);
-- 去掉字段值左侧的空格
UPDATE tbl_test_campus SET campus_name = LTRIM(campus_name); 

--删除 tbl_test_user 表中 phone 字段不是数字的记录
DELETE FROM tbl_test_user WHERE user_id NOT IN (SELECT user_id FROM (SELECT user_id FROM tbl_test_user WHERE phone REGEXP '^[0-9]+$')b);
3.3 DCL语句示例(GRANT、REVOKE)
-- 创建用户 “testuser”,密码是 “Campus@2018”,赋予其在任何 IP 地址操作 数据库 testdb 的所有权限
-- 命令格式为:grant 权限列表 on 库.表.* to 用户名@'ip' identified by "明文密码",或者先创建用户再授权
CREATE USER 'testuser'@'%' IDENTIFIED BY 'Campus@2018';
GRANT ALL PRIVILEGES ON testdb.* TO testuser;
FLUSH PRIVILEGES;

-- 回收 testuser 用户操作数据库testdb 的部分权限
REVOKE DROP, CREATE, ALTER ON testdb.* FROM testuser@'%';
FLUSH PRIVILEGES;

-- 回收 testuser 用户操作数据库testdb 的所有权限(下面示例前两行取其一即可)
REVOKE ALL ON *.* FROM testuser@'%';                  
REVOKE ALL PRIVILEGES ON *.* FROM testuser@'%';              
FLUSH PRIVILEGES;
3.4 DQL语句示例(SELECT)
-- 查询 tbl_test_token 表的全量数据
select * from tbl_test_token;
-- 查询 tbl_test_token 表中手机号字段 phone_no 等于 13011112222 的部分数据
-- SQL 语句后加 \G 可将结果纵向展示
select * from tbl_test_token where phone_no = "13011112222" \G 
-- 分组统计每个月的订单量(order_dt 字符串格式为 yyyyMMdd)
SELECT SUBSTRING(order_dt, 1, 6), COUNT(1) FROM tbl_test_order GROUP BY SUBSTRING(order_dt, 1, 6);
-- 多条件查询,汇总每个月的订单总额
SELECT SUBSTRING(order_dt, 1, 6), SUM(order_at) FROM tbl_test_order WHERE biz_tp LIKE '%03%' AND card_tp IN (01, 02) GROUP BY SUBSTRING(order_dt, 1, 6);
-- 汇总符合条件的订单总额
SELECT SUM(order_at) FROM tbl_test_order WHERE biz_tp = '03' AND order_st IN (10, 01);
-- 将符合条件的结果集导出到 /home/testuser/ 路径下,文件命名为 result_20200117.csv
SELECT * FROM tbl_test_order WHERE biz_tp = '01' INTO OUTFILE '/home/testuser/result_20200117.csv' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
-- BETWEEN AND 条件查找,并对手机号 phone 字段去重
SELECT DISTINCT(phone) FROM tbl_test_user WHERE create_ts BETWEEN '2016-08-01 00:00:00' AND '2016-08-17 23:59:59';
-- 统计表 tbl_test_user 中注册手机号数量(要求去重)
SELECT COUNT(DISTINCT(phone_no)) FROM tbl_test_user;
-- 判断 campus_name 字段是否只含汉字
SELECT campus_id, campus_name FROM tbl_test_campus WHERE LENGTH(campus_name) != 3*CHAR_LENGTH(campus_name);
-- 查询 tbl_test_user 表中 organizer 等于 “qingdao” 且注册手机号有重复值的数据
SELECT phone FROM tbl_test_user WHERE organizer = "qingdao" GROUP BY phone HAVING COUNT(1) > 1; 
-- 查询 tbl_test_send 表中最近2秒的数据总量
SELECT COUNT(1) FROM tbl_test_send WHERE send_ts > SUBDATE(NOW(),INTERVAL 2 SECOND); 
-- 查看 MySQL 版本号
SELECT VERSION();
-- 统计 testdb 数据库中每个表的数据量,按数据量对表做降序排列
USE information_schema;
SELECT table_name, table_rows FROM TABLES WHERE TABLE_SCHEMA = 'testdb' ORDER BY table_rows DESC;

-- 查看数据库 testdb 中的 tbl_test_order 表的表结构的几种方式
SELECT COLUMN_COMMENT 中文数据名称, COLUMN_NAME 数据名称, COLUMN_TYPE 数据类型, IS_NULLABLE 是否为空, COLUMN_DEFAULT 取值说明 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'testdb' AND table_name = 'tbl_test_order';
DESC tbl_test_order;
SHOW FULL COLUMNS FROM tbl_test_order;
3.5 TCL语句示例(BEGIN、COMMIT、ROLLBACK)
-- 开启事务,将数据 (21, '11') 和 (22, '11') 同时插入表 tbl_test_menu 中
BEGIN;
INSERT INTO tbl_test_menu (menu_id, campus_id) VALUES (21, '11');
INSERT INTO tbl_test_menu (menu_id, campus_id) VALUES (22, '11');
COMMIT;

-- 开启事务,将数据 (23, '11') 和 (24, '11') 插入表 tbl_test_menu 中,并回滚,则数据最终未被插入表
BEGIN;       
INSERT INTO tbl_test_menu (menu_id, campus_id) VALUES (23, '11');
INSERT INTO tbl_test_menu (menu_id, campus_id) VALUES (24, '11');
ROLLBACK;
发布了32 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/piaoranyuji/article/details/104018402