1-MySQL - 其他操作
关于prompt参数
当我们登录到MySQL后,MySQL只是简单的提示mysql>
,没有其他的信息,对我们来说,意义不大,那么通过prompt
参数就可以来自定义显式一些重要的信息,比如:登录的用户名、主机地址、当前所在的数据库等信息。
那么如何使用prompt
参数呢?有两种方式:
- 登录MySQL时,在命令行中使用。
- 定义在配置文件中。
命令行中配置
在登录MySQL时,跟参数:
[root@cs ~]# mysql -uroot -p --prompt="\\u@\\h : \\d \\r:\\m:\\s>"
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.20 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
root@localhost : (none)05:41:53>use data_test;
Database changed
root@localhost : data_test 05:42:11>
注意,--prompt="\\u@\\h : \\d\\r:\\m:\\s>"
参数后的值一定是双引号标识,单引号不行!
这种方式,仅适用于本次登录生效。
配置文件中配置
如果在命令行中写太麻烦,想要永久生效,就要在配置文件中定义,编辑配置文件/etc/my.cnf
:
[mysql]
prompt="\\u@\\h :\\d \\r:\\m:\\s>"
# 也可以这么写
# prompt=3306 [\\d]>
这样,每次登录就会自动生效了。
PS:每个参数都加两个\\
,但我看加一个也能行!
常用的prompt参数
这里列出常用的参数:
参数 | 描述 |
---|---|
\u |
登录用户名 |
\h |
登录主机 |
\d |
此时use的数据库,没有则显式none |
\r:\m:\s |
当前的时分秒 |
\U |
显式你的全名user_name@host_name ,等价于\u@\h |
更多参考官网:
三元表达式
用到的数据:school.sql
-- mysql -uroot -p <school.sql
DROP DATABASE IF EXISTS school;
CREATE DATABASE school CHARSET utf8;
USE school;
SET AUTOCOMMIT=0;
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for `class`
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`caption` varchar(32) NOT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of `class`
-- ----------------------------
BEGIN;
INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班');
COMMIT;
-- ----------------------------
-- Table structure for `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`cname` varchar(32) NOT NULL,
`teacher_id` int(11) NOT NULL,
PRIMARY KEY (`cid`),
KEY `fk_course_teacher` (`teacher_id`),
CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of `course`
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '体育', '3'), ('4', '美术', '2');
COMMIT;
-- ----------------------------
-- Table structure for `score`
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`sid` int(11) NOT NULL AUTO_INCREMENT,
`student_id` int(11) NOT NULL,
`course_id` int(11) NOT NULL,
`num` int(11) NOT NULL,
PRIMARY KEY (`sid`),
KEY `fk_score_student` (`student_id`),
KEY `fk_score_course` (`course_id`),
CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of `score`
-- ----------------------------
BEGIN;
INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'), ('10', '3', '1', '77'), ('11', '3', '2', '66'), ('12', '3', '3', '87'), ('13', '3', '4', '99'), ('14', '4', '1', '79'), ('15', '4', '2', '11'), ('16', '4', '3', '67'), ('17', '4', '4', '100'), ('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'), ('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'), ('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'), ('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'), ('44', '11', '3', '43'), ('45', '11', '4', '87'), ('46', '12', '1', '90'), ('47', '12', '2', '77'), ('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87');
COMMIT;
-- ----------------------------
-- Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sid` int(11) NOT NULL AUTO_INCREMENT,
`gender` char(1) NOT NULL,
`class_id` int(11) NOT NULL,
`sname` varchar(32) NOT NULL,
PRIMARY KEY (`sid`),
KEY `fk_class` (`class_id`),
CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of `student`
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES ('1', '男', '1', '理解'), ('2', '女', '1', '钢蛋'), ('3', '男', '1', '张三'), ('4', '男', '1', '张一'), ('5', '女', '1', '张二'), ('6', '男', '1', '张四'), ('7', '女', '2', '铁锤'), ('8', '男', '2', '李三'), ('9', '男', '2', '李一'), ('10', '女', '2', '李二'), ('11', '男', '2', '李四'), ('12', '女', '3', '如花'), ('13', '男', '3', '刘三'), ('14', '男', '3', '刘一'), ('15', '女', '3', '刘二'), ('16', '男', '3', '刘四');
COMMIT;
-- ----------------------------
-- Table structure for `teacher`
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`tid` int(11) NOT NULL AUTO_INCREMENT,
`tname` varchar(32) NOT NULL,
PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of `teacher`
-- ----------------------------
BEGIN;
INSERT INTO `teacher` VALUES ('1', '张磊老师'), ('2', '李平老师'), ('3', '刘海燕老师'), ('4', '朱云海老师'), ('5', '李杰老师');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
在Python种,三元表达式在某些时候非常方便,经过了解,MySQL也能支持三元运算!!所以特来记录下!!!!
丑话说在前头,MySQL中这种三元运算性能低下!这些是其实在后端处理更好!!
先来看示例:
-- 统计每个同学的总分数
SELECT
student.sid,
student.sname,
SUM(num)
FROM student LEFT JOIN score ON student.sid=score.student_id
GROUP BY student.sid;
+-----+--------+----------+
| sid | sname | SUM(num) |
+-----+--------+----------+
| 1 | 理解 | 85 |
| 2 | 钢蛋 | 175 |
| 3 | 张三 | 329 |
| 4 | 张一 | 257 |
| 5 | 张二 | 257 |
| 6 | 张四 | 276 |
| 7 | 铁锤 | 264 |
| 8 | 李三 | 264 |
| 9 | 李一 | 268 |
| 10 | 李二 | 297 |
| 11 | 李四 | 297 |
| 12 | 如花 | 297 |
| 13 | 刘三 | 87 |
| 14 | 刘一 | NULL |
| 15 | 刘二 | NULL |
| 16 | 刘四 | NULL |
+-----+--------+----------+
16 rows in set (0.00 sec)
我想将那些结果为NULL
的替换为0,或者其他自定义字符,这里就用到了三元表达式了,MySQL中支持两种三元运算:
-- 简单,性能低下
IF (条件表达式,条件为true的结果, 条件为false的结果)
-- 稍微复杂的,但性能高点(有限!)的
case when 条件 then (条件为true时执行) else(条件为false时执行) end -- end不可少
-- 用法:
SELECT
student.sid,
student.sname,
-- IF (SUM(num),SUM(num), 0) -- if的示例
(CASE WHEN SUM(num) THEN SUM(num) ELSE 0 END) AS '总分' -- 为了避免意外,我将三元表达式用括号整体括起来了,和后面 AS 分开
FROM student LEFT JOIN score ON student.sid=score.student_id
GROUP BY student.sid;
+-----+--------+--------+
| sid | sname | 总分 |
+-----+--------+--------+
| 1 | 理解 | 85 |
| 2 | 钢蛋 | 175 |
| 3 | 张三 | 329 |
| 4 | 张一 | 257 |
| 5 | 张二 | 257 |
| 6 | 张四 | 276 |
| 7 | 铁锤 | 264 |
| 8 | 李三 | 264 |
| 9 | 李一 | 268 |
| 10 | 李二 | 297 |
| 11 | 李四 | 297 |
| 12 | 如花 | 297 |
| 13 | 刘三 | 87 |
| 14 | 刘一 | 0 |
| 15 | 刘二 | 0 |
| 16 | 刘四 | 0 |
+-----+--------+--------+
16 rows in set (0.00 sec)
在MySQL中执行系统命令
centos7.3 + mysql5.7.20
MySQL客户端中可以通过system
命令来执行系统的shell命令:
mysql> system cat /data/mysql/auto.cnf
[auto]
server-uuid=f352c664-a926-11ea-a90d-000c29872edd
mysql> system ls /data/mysql/
auto.cnf cs.pid data_test ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 ibtmp1 mysql performance_schema
that's all, see alse:
see also:mysql prompt的用法详解 | MySQL5.7官网手册