25.第19章 MYSQL數據庫


一.mysql數據庫基於二進制包一鍵安裝腳本

#mysq5.6基於二進制包一鍵安裝腳本
[root@centos7 ~]# cat install_mysql5.6_v3.sh
#!/bin/bash
#
#******************************************************************************
#Author:        zhanghui
#QQ:            19661891
#Date:          2021-06-01
#FileName:      install_mysql5.6_v3.sh
#URL:           www.cnblogs.com/neteagles
#Description:   install_mysql5.6 for centos 7/8 & ubuntu 18.04/20.04
#Copyright (C): 2021 All rights reserved
#******************************************************************************
SRC_DIR=/usr/local/src
COLOR="echo -e \\033[01;31m"
END='\033[0m'
MYSQL_URL=https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-
MYSQL_VERSION=5.6
MYSQL_APP='mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz'

os(){
    if grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release;then
        rpm -q redhat-lsb-core &> /dev/null || { ${COLOR}"安裝lsb_release工具"${END};yum -y install  redhat-lsb-core &> /dev/null; }
    fi
    OS_ID=`lsb_release -is`
    OS_RELEASE_VERSION=`lsb_release -rs |awk -F'.' '{print $1}'`
}

check_file(){
    cd  ${SRC_DIR}
    if [ ${OS_ID} == "CentOS" ] &> /dev/null;then
        rpm -q wget &> /dev/null || yum -y install wget &> /dev/null
    fi
    if [ !  -e ${MYSQL_APP} ];then
        ${COLOR}"缺少${MYSQL_APP}文件"${END}
        ${COLOR}'開始下載MYSQL二進制安裝包'${END}
        wget ${MYSQL_URL}${MYSQL_VERSION}/${MYSQL_APP} || { ${COLOR}"MYSQL二進制安裝包下載失敗"${END}; exit; } 
    else
        ${COLOR}"相關文件已准備好"${END}
    fi
}

install_mysql(){
    [ -d /usr/local/mysql ] && { ${COLOR}"數據庫已存在,安裝失敗"${END};exit; }
    ${COLOR}"開始安裝MySQL數據庫..."${END}
    cd  ${SRC_DIR}
    ${COLOR}'開始安裝MYSQL依賴包'${END}
    if [[ ${OS_RELEASE_VERSION} == 8 ]] &> /dev/null;then
        yum install -y libaio perl-Data-Dumper autoconf ncurses-compat-libs &> /dev/null
    elif [[ ${OS_RELEASE_VERSION} == 7 ]] &> /dev/null;then
        yum install -y libaio perl-Data-Dumper &> /dev/null
    else
        apt update &> /dev/null;apt -y install numactl libaio-dev libtinfo5 &> /dev/null
    fi
    tar xf ${MYSQL_APP} -C /usr/local/
    MYSQL_DIR=`echo ${MYSQL_APP}| sed -nr 's/^(.*[0-9]).*/\1/p'`
    ln -s  /usr/local/${MYSQL_DIR} /usr/local/mysql
    id mysql &> /dev/null || { useradd -s /sbin/nologin -r  mysql ; ${COLOR}"創建mysql用戶"${END}; }
    chown -R  mysql.mysql /usr/local/mysql/
    [  -d /data/mysql ] || mkdir -pv /data/mysql &> /dev/null
    chown -R mysql.mysql /data/mysql
    /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --basedir=/usr/local/mysql/ &> /dev/null
    cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    chmod a+x /etc/init.d/mysqld
    echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
    .  /etc/profile.d/mysql.sh
    cat > /etc/my.cnf <<-EOF
[mysqld]
socket=/data/mysql/mysql.sock
user=mysql
symbolic-links=0
datadir=/data/mysql
innodb_file_per_table=1
[client]
port=3306
socket=/data/mysql/mysql.sock
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/tmp/mysql.sock
EOF
    if [ ${OS_ID} == "CentOS" ] &> /dev/null;then
        chkconfig --add mysqld
    else
        update-rc.d -f mysqld defaults
    fi

    cat > /lib/systemd/system/mysqld.service <<-EOF
[Unit]
Description=mysql database server
After=network.target

[Service]
Type=notify
PrivateNetwork=false
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/mysqld start
ExecStop=/etc/init.d/mysqld stop
ExecReload=/etc/init.d/mysqld reload

[Install]
WantedBy=multi-user.target
Alias=mysqld.service
EOF

    systemctl enable --now mysqld &> /dev/null
    [ $? -ne 0 ] && { ${COLOR}"數據庫啟動失敗,退出!"${END};exit; }	
    ${COLOR}"數據庫安裝完成"${END}
}

main(){
    os
    check_file
    install_mysql
}

main


#mysq5.7基於二進制包一鍵安裝腳本
[root@centos7 ~]# cat install_mysql5.7_v3.sh
#!/bin/bash
#
#******************************************************************************
#Author:        zhanghui
#QQ:            19661891
#Date:          2021-06-01
#FileName:      install_mysql5.7_v3.sh
#URL:           www.cnblogs.com/neteagles
#Description:   install_mysql5.7 for centos 7/8 & ubuntu 18.04/20.04
#Copyright (C): 2021 All rights reserved
#******************************************************************************
SRC_DIR=/usr/local/src
COLOR="echo -e \\033[01;31m"
END='\033[0m'
MYSQL_URL=https://mirrors.cloud.tencent.com/mysql/downloads/MySQL-
MYSQL_VERSION='5.7/'
MYSQL_FILE='mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz'
MYSQL_ROOT_PASSWORD=123456

os(){
    if grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release;then
        rpm -q redhat-lsb-core &> /dev/null || { ${COLOR}"安裝lsb_release工具"${END};yum -y install  redhat-lsb-core &> /dev/null; }
    fi
    OS_ID=`lsb_release -is`
    OS_RELEASE_VERSION=`lsb_release -rs |awk -F'.' '{print $1}'`
}

check_file(){
    cd  ${SRC_DIR}
    if [ ${OS_ID} == "CentOS" ] &> /dev/null;then
        rpm -q wget &> /dev/null || yum -y install wget &> /dev/null
    fi
    if [ ! -e ${MYSQL_FILE} ];then
        ${COLOR}"缺少${MYSQL_FILE}文件"${END}
        ${COLOR}'開始下載MYSQL二進制安裝包'${END}
        wget ${MYSQL_URL}${MYSQL_VERSION}${MYSQL_FILE} || { ${COLOR}"MYSQL二進制安裝包下載失敗"${END}; exit; }
    else
        ${COLOR}"${MYSQL_FILE}文件已准備好"${END}
    fi
}

install_mysql(){
    [ -d /usr/local/mysql ] && { ${COLOR}"MySQL數據庫已存在,安裝失敗"${END};exit; }
    ${COLOR}"開始安裝MySQL數據庫..."${END}
    ${COLOR}'開始安裝MYSQL依賴包'${END}
    if [[ ${OS_RELEASE_VERSION} == 8 ]] &> /dev/null;then
        yum -y install libaio perl-Data-Dumper ncurses-compat-libs &> /dev/null
    elif [[ ${OS_RELEASE_VERSION} == 7 ]] &> /dev/null;then
        yum -y install libaio perl-Data-Dumper &> /dev/null
    else
        apt update &> /dev/null;apt -y install numactl libaio-dev libtinfo5 &> /dev/null
    fi
    cd  ${SRC_DIR}
    tar xf ${MYSQL_FILE} -C /usr/local/
    MYSQL_DIR=`echo ${MYSQL_FILE}| sed -nr 's/^(.*[0-9]).*/\1/p'`
    ln -s  /usr/local/${MYSQL_DIR} /usr/local/mysql
    id mysql &> /dev/null || { useradd -s /sbin/nologin -r  mysql ; ${COLOR}"創建mysql用戶"${END}; }
    chown -R  mysql.mysql /usr/local/mysql/
    echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
    .  /etc/profile.d/mysql.sh
    cat > /etc/my.cnf <<-EOF
[mysqld]
server-id=1
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
EOF
    [ -d /data/mysql ] || mkdir -p /data/mysql &> /dev/null
    chown -R  mysql.mysql /data/mysql
    mysqld --initialize --user=mysql --datadir=/data/mysql 
    cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld
    if [ ${OS_ID} == "CentOS" ] &> /dev/null;then
        chkconfig --add mysqld
    else
        update-rc.d -f mysqld defaults
    fi
    cat > /lib/systemd/system/mysqld.service <<-EOF
[Unit]
Description=mysql database server
After=network.target

[Service]
Type=notify
PrivateNetwork=false
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/mysqld start
ExecStop=/etc/init.d//mysqld stop
ExecReload=/etc/init.d/mysqld reload

[Install]
WantedBy=multi-user.target
Alias=mysqld.service
EOF
    systemctl daemon-reload
    systemctl enable --now mysqld &> /dev/null
    [ $? -ne 0 ] && { ${COLOR}"數據庫啟動失敗,退出!"${END};exit; }
    MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
    mysqladmin  -uroot -p${MYSQL_OLDPASSWORD} password ${MYSQL_ROOT_PASSWORD} &>/dev/null
    ${COLOR}"MySQL數據庫安裝完成"${END}
}

main(){
    os
    check_file
    install_mysql
}

main

#mysq8.0基於二進制包一鍵安裝腳本
[root@centos7 ~]# cat install_mysql8.0_v3.sh
#!/bin/bash
#
#******************************************************************************
#Author:        zhanghui
#QQ:            19661891
#Date:          2021-06-01
#FileName:      install_mysql8.0_v3.sh
#URL:           www.cnblogs.com/neteagles
#Description:   install_mysql8.0 for centos 7/8 & ubuntu 18.04/20.04
#Copyright (C): 2021 All rights reserved
#******************************************************************************
SRC_DIR=/usr/local/src
COLOR="echo -e \\033[01;31m"
END='\033[0m'
MYSQL_URL=https://mirrors.cloud.tencent.com/mysql/downloads/MySQL-
MYSQL_VERSION='8.0/'
MYSQL_FILE='mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz'
MYSQL_ROOT_PASSWORD=123456

os(){
    if grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release;then
        rpm -q redhat-lsb-core &> /dev/null || { ${COLOR}"安裝lsb_release工具"${END};yum -y install  redhat-lsb-core &> /dev/null; }
    fi
    OS_ID=`lsb_release -is`
    OS_RELEASE_VERSION=`lsb_release -rs |awk -F'.' '{print $1}'`
}

check_file(){
    cd  ${SRC_DIR}
    if [ ${OS_ID} == "CentOS" ] &> /dev/null;then
        rpm -q wget &> /dev/null || yum -y install wget &> /dev/null
    fi
    if [ ! -e ${MYSQL_FILE} ];then
        ${COLOR}"缺少${MYSQL_FILE}文件"${END}
        ${COLOR}'開始下載MYSQL二進制安裝包'${END}
        wget ${MYSQL_URL}${MYSQL_VERSION}${MYSQL_FILE} || { ${COLOR}"MYSQL二進制安裝包下載失敗"${END}; exit; }
    else
        ${COLOR}"${MYSQL_FILE}文件已准備好"${END}
    fi
}

install_mysql(){
    [ -d /usr/local/mysql ] && { ${COLOR}"MySQL數據庫已存在,安裝失敗"${END};exit; }
    ${COLOR}"開始安裝MySQL數據庫..."${END}
    ${COLOR}'開始安裝MYSQL依賴包'${END}
    if [[ ${OS_RELEASE_VERSION} == 8 ]] &> /dev/null;then
        yum -y install libaio perl-Data-Dumper ncurses-compat-libs &> /dev/null
    elif [[ ${OS_RELEASE_VERSION} == 7 ]] &> /dev/null;then
        yum -y install libaio perl-Data-Dumper &> /dev/null
    else
        apt update &> /dev/null;apt -y install numactl libaio-dev libtinfo5 &> /dev/null
    fi
    cd  ${SRC_DIR}
    tar xf ${MYSQL_FILE} -C /usr/local/
    MYSQL_DIR=`echo ${MYSQL_FILE}| sed -nr 's/^(.*[0-9]).*/\1/p'`
    ln -s  /usr/local/${MYSQL_DIR} /usr/local/mysql
    id mysql &> /dev/null || { useradd -s /sbin/nologin -r  mysql ; ${COLOR}"創建mysql用戶"${END}; }
    chown -R  mysql.mysql /usr/local/mysql/
    echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
    .  /etc/profile.d/mysql.sh
    cat > /etc/my.cnf <<-EOF
[mysqld]
server-id=1
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
EOF
    [ -d /data/mysql ] || mkdir -p /data/mysql &> /dev/null
    chown -R  mysql.mysql /data/mysql
    mysqld --initialize --user=mysql --datadir=/data/mysql 
    cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld
    if [ ${OS_ID} == "CentOS" ] &> /dev/null;then
        chkconfig --add mysqld
    else
        update-rc.d -f mysqld defaults
    fi
    cat > /lib/systemd/system/mysqld.service <<-EOF
[Unit]
Description=mysql database server
After=network.target

[Service]
Type=notify
PrivateNetwork=false
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/mysqld start
ExecStop=/etc/init.d//mysqld stop
ExecReload=/etc/init.d/mysqld reload

[Install]
WantedBy=multi-user.target
Alias=mysqld.service
EOF
    systemctl daemon-reload
    systemctl enable --now mysqld &> /dev/null
    [ $? -ne 0 ] && { ${COLOR}"數據庫啟動失敗,退出!"${END};exit; }
    MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
    mysqladmin  -uroot -p${MYSQL_OLDPASSWORD} password ${MYSQL_ROOT_PASSWORD} &>/dev/null
    ${COLOR}"MySQL數據庫安裝完成"${END}
}

main(){
    os
    check_file
    install_mysql
}

main

二.時間字段進行過濾查詢,並且timestamp可以隨其它字段的更新自動更新

mysql>  create table testdate (id int auto_increment primary key,name varchar(10),date timestamp DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.01 sec)


mysql> desc testdate;
+-------+-------------+------+-----+-------------------+-------------------+
| Field | Type        | Null | Key | Default           | Extra             |
+-------+-------------+------+-----+-------------------+-------------------+
| id    | int         | NO   | PRI | NULL              | auto_increment    |
| name  | varchar(10) | YES  |     | NULL              |                   |
| date  | timestamp   | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+-------+-------------+------+-----+-------------------+-------------------+
3 rows in set (0.00 sec)

mysql> insert testdate (name) value('alice');
Query OK, 1 row affected (0.01 sec)

mysql> select * from testdate;
+----+-------+---------------------+
| id | name  | date                |
+----+-------+---------------------+
|  1 | alice | 2021-01-30 23:40:41 |
+----+-------+---------------------+
1 row in set (0.00 sec)

mysql> insert testdate (name) value('bom');
Query OK, 1 row affected (0.00 sec)

mysql> select * from testdate;
+----+-------+---------------------+
| id | name  | date                |
+----+-------+---------------------+
|  1 | alice | 2021-01-30 23:40:41 |
|  2 | bom   | 2021-01-30 23:41:29 |
+----+-------+---------------------+
2 rows in set (0.00 sec)

mysql> update testdate set name='hong' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from testdate;
+----+------+---------------------+
| id | name | date                |
+----+------+---------------------+
|  1 | hong | 2021-01-30 23:40:41 |
|  2 | bom  | 2021-01-30 23:41:29 |
+----+------+---------------------+
2 rows in set (0.00 sec)


mysql> insert testdate (name) value('ming');
Query OK, 1 row affected (0.00 sec)

mysql> insert testdate (name) value('zhang');
Query OK, 1 row affected (0.00 sec)

mysql> select * from testdate;
+----+-------+---------------------+
| id | name  | date                |
+----+-------+---------------------+
|  1 | hong  | 2021-01-30 23:40:41 |
|  2 | bom   | 2021-01-30 23:41:29 |
|  3 | ming  | 2021-01-30 23:47:12 |
|  4 | zhang | 2021-01-30 23:47:16 |
+----+-------+---------------------+
4 rows in set (0.00 sec)

mysql> select * from testdate where date >= '2021-01-30 23:40:00' and date <= '2021-01-30 23:47:00';
+----+------+---------------------+
| id | name | date                |
+----+------+---------------------+
|  1 | hong | 2021-01-30 23:40:41 |
|  2 | bom  | 2021-01-30 23:41:29 |
+----+------+---------------------+
2 rows in set (0.00 sec)

mysql> select * from testdate where date between '2021-01-30 23:40:00' and '2021-01-30 23:47:00';
+----+------+---------------------+
| id | name | date                |
+----+------+---------------------+
|  1 | hong | 2021-01-30 23:40:41 |
|  2 | bom  | 2021-01-30 23:41:29 |
+----+------+---------------------+
2 rows in set (0.00 sec)

三.Mysql數據庫DQL語句-select查詢

[root@centos8 ~]# cat hellodb_innodb.sql 
-- MySQL dump 10.13  Distrib 5.5.33, for Linux (x86_64)
--
-- Host: localhost    Database: hellodb
-- ------------------------------------------------------
-- Server version	5.5.33-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `hellodb`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hellodb` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `hellodb`;

--
-- Table structure for table `classes`
--

DROP TABLE IF EXISTS `classes`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `classes` (
  `ClassID` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `Class` varchar(100) DEFAULT NULL,
  `NumOfStu` smallint(5) unsigned DEFAULT NULL,
  PRIMARY KEY (`ClassID`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `classes`
--

LOCK TABLES `classes` WRITE;
/*!40000 ALTER TABLE `classes` DISABLE KEYS */;
INSERT INTO `classes` VALUES (1,'Shaolin Pai',10),(2,'Emei Pai',7),(3,'QingCheng Pai',11),(4,'Wudang Pai',12),(5,'Riyue Shenjiao',31),(6,'Lianshan Pai',27),(7,'Ming Jiao',27),(8,'Xiaoyao Pai',15);
/*!40000 ALTER TABLE `classes` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `coc`
--

DROP TABLE IF EXISTS `coc`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `coc` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `ClassID` tinyint(3) unsigned NOT NULL,
  `CourseID` smallint(5) unsigned DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `coc`
--

LOCK TABLES `coc` WRITE;
/*!40000 ALTER TABLE `coc` DISABLE KEYS */;
INSERT INTO `coc` VALUES (1,1,2),(2,1,5),(3,2,2),(4,2,6),(5,3,1),(6,3,7),(7,4,5),(8,4,2),(9,5,1),(10,5,9),(11,6,3),(12,6,4),(13,7,4),(14,7,3);
/*!40000 ALTER TABLE `coc` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `courses`
--

DROP TABLE IF EXISTS `courses`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `courses` (
  `CourseID` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `Course` varchar(100) NOT NULL,
  PRIMARY KEY (`CourseID`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `courses`
--

LOCK TABLES `courses` WRITE;
/*!40000 ALTER TABLE `courses` DISABLE KEYS */;
INSERT INTO `courses` VALUES (1,'Hamo Gong'),(2,'Kuihua Baodian'),(3,'Jinshe Jianfa'),(4,'Taiji Quan'),(5,'Daiyu Zanghua'),(6,'Weituo Zhang'),(7,'Dagou Bangfa');
/*!40000 ALTER TABLE `courses` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `scores`
--

DROP TABLE IF EXISTS `scores`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `scores` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `StuID` int(10) unsigned NOT NULL,
  `CourseID` smallint(5) unsigned NOT NULL,
  `Score` tinyint(3) unsigned DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `scores`
--

LOCK TABLES `scores` WRITE;
/*!40000 ALTER TABLE `scores` DISABLE KEYS */;
INSERT INTO `scores` VALUES (1,1,2,77),(2,1,6,93),(3,2,2,47),(4,2,5,97),(5,3,2,88),(6,3,6,75),(7,4,5,71),(8,4,2,89),(9,5,1,39),(10,5,7,63),(11,6,1,96),(12,7,1,86),(13,7,7,83),(14,8,4,57),(15,8,3,93);
/*!40000 ALTER TABLE `scores` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `students`
--

DROP TABLE IF EXISTS `students`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `students` (
  `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) NOT NULL,
  `Age` tinyint(3) unsigned NOT NULL,
  `Gender` enum('F','M') NOT NULL,
  `ClassID` tinyint(3) unsigned DEFAULT NULL,
  `TeacherID` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`StuID`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `students`
--

LOCK TABLES `students` WRITE;
/*!40000 ALTER TABLE `students` DISABLE KEYS */;
INSERT INTO `students` VALUES (1,'Shi Zhongyu',22,'M',2,3),(2,'Shi Potian',22,'M',1,7),(3,'Xie Yanke',53,'M',2,16),(4,'Ding Dian',32,'M',4,4),(5,'Yu Yutong',26,'M',3,1),(6,'Shi Qing',46,'M',5,NULL),(7,'Xi Ren',19,'F',3,NULL),(8,'Lin Daiyu',17,'F',7,NULL),(9,'Ren Yingying',20,'F',6,NULL),(10,'Yue Lingshan',19,'F',3,NULL),(11,'Yuan Chengzhi',23,'M',6,NULL),(12,'Wen Qingqing',19,'F',1,NULL),(13,'Tian Boguang',33,'M',2,NULL),(14,'Lu Wushuang',17,'F',3,NULL),(15,'Duan Yu',19,'M',4,NULL),(16,'Xu Zhu',21,'M',1,NULL),(17,'Lin Chong',25,'M',4,NULL),(18,'Hua Rong',23,'M',7,NULL),(19,'Xue Baochai',18,'F',6,NULL),(20,'Diao Chan',19,'F',7,NULL),(21,'Huang Yueying',22,'F',6,NULL),(22,'Xiao Qiao',20,'F',1,NULL),(23,'Ma Chao',23,'M',4,NULL),(24,'Xu Xian',27,'M',NULL,NULL),(25,'Sun Dasheng',100,'M',NULL,NULL);
/*!40000 ALTER TABLE `students` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `teachers`
--

DROP TABLE IF EXISTS `teachers`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `teachers` (
  `TID` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(100) NOT NULL,
  `Age` tinyint(3) unsigned NOT NULL,
  `Gender` enum('F','M') DEFAULT NULL,
  PRIMARY KEY (`TID`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `teachers`
--

LOCK TABLES `teachers` WRITE;
/*!40000 ALTER TABLE `teachers` DISABLE KEYS */;
INSERT INTO `teachers` VALUES (1,'Song Jiang',45,'M'),(2,'Zhang Sanfeng',94,'M'),(3,'Miejue Shitai',77,'F'),(4,'Lin Chaoying',93,'F');
/*!40000 ALTER TABLE `teachers` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `toc`
--

DROP TABLE IF EXISTS `toc`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `toc` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `CourseID` smallint(5) unsigned DEFAULT NULL,
  `TID` smallint(5) unsigned DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `toc`
--

LOCK TABLES `toc` WRITE;
/*!40000 ALTER TABLE `toc` DISABLE KEYS */;
/*!40000 ALTER TABLE `toc` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2013-09-03  2:51:27

#導入hellodb.sql生成數據庫
[root@centos8 ~]# mysql < hellodb_innodb.sql 
[root@centos8 ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.21 Source distribution

Copyright (c) 2000, 2020, 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.

mysql> use hellodb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| teachers          |
| toc               |
+-------------------+
7 rows in set (0.00 sec)

mysql> select * from students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
25 rows in set (0.00 sec)

mysql> select * from courses;
+----------+----------------+
| CourseID | Course         |
+----------+----------------+
|        1 | Hamo Gong      |
|        2 | Kuihua Baodian |
|        3 | Jinshe Jianfa  |
|        4 | Taiji Quan     |
|        5 | Daiyu Zanghua  |
|        6 | Weituo Zhang   |
|        7 | Dagou Bangfa   |
+----------+----------------+
7 rows in set (0.00 sec)

mysql> select * from scores;
+----+-------+----------+-------+
| ID | StuID | CourseID | Score |
+----+-------+----------+-------+
|  1 |     1 |        2 |    77 |
|  2 |     1 |        6 |    93 |
|  3 |     2 |        2 |    47 |
|  4 |     2 |        5 |    97 |
|  5 |     3 |        2 |    88 |
|  6 |     3 |        6 |    75 |
|  7 |     4 |        5 |    71 |
|  8 |     4 |        2 |    89 |
|  9 |     5 |        1 |    39 |
| 10 |     5 |        7 |    63 |
| 11 |     6 |        1 |    96 |
| 12 |     7 |        1 |    86 |
| 13 |     7 |        7 |    83 |
| 14 |     8 |        4 |    57 |
| 15 |     8 |        3 |    93 |
+----+-------+----------+-------+
15 rows in set (0.00 sec)

3.1在students表中,查詢年齡大於25歲,且為男性的同學的名字和年齡

mysql> select name,age from students where age >25 and gender = 'M';
+--------------+-----+
| name         | age |
+--------------+-----+
| Xie Yanke    |  53 |
| Ding Dian    |  32 |
| Yu Yutong    |  26 |
| Shi Qing     |  46 |
| Tian Boguang |  33 |
| Xu Xian      |  27 |
| Sun Dasheng  | 100 |
+--------------+-----+
7 rows in set (0.00 sec)

3.2以ClassID為分組依據,顯示每組的平均年齡

mysql> select classid,avg(age) 平均年齡 from students group by classid;
+---------+--------------+
| classid | 平均年齡     |
+---------+--------------+
|       2 |      36.0000 |
|       1 |      20.5000 |
|       4 |      24.7500 |
|       3 |      20.2500 |
|       5 |      46.0000 |
|       7 |      19.6667 |
|       6 |      20.7500 |
|    NULL |      63.5000 |
+---------+--------------+
8 rows in set (0.00 sec)

3.3顯示第2題中平均年齡大於30的分組及平均年齡

mysql> select classid,avg(age) 平均年齡 from students group by classid having 平均年齡 > 30;
+---------+--------------+
| classid | 平均年齡     |
+---------+--------------+
|       2 |      36.0000 |
|       5 |      46.0000 |
|    NULL |      63.5000 |
+---------+--------------+
3 rows in set (0.00 sec)

3.4顯示以L開頭的名字的同學的信息

mysql> select * from students where name like 'L%';
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name        | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
|     8 | Lin Daiyu   |  17 | F      |       7 |      NULL |
|    14 | Lu Wushuang |  17 | F      |       3 |      NULL |
|    17 | Lin Chong   |  25 | M      |       4 |      NULL |
+-------+-------------+-----+--------+---------+-----------+
3 rows in set (0.01 sec)

3.5顯示TeacherID非空的同學的相關信息

mysql> select * from students where teacherid is not null;
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name        | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu |  22 | M      |       2 |         3 |
|     2 | Shi Potian  |  22 | M      |       1 |         7 |
|     3 | Xie Yanke   |  53 | M      |       2 |        16 |
|     4 | Ding Dian   |  32 | M      |       4 |         4 |
|     5 | Yu Yutong   |  26 | M      |       3 |         1 |
+-------+-------------+-----+--------+---------+-----------+
5 rows in set (0.01 sec)

mysql> select * from students where teacherid > 0;
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name        | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu |  22 | M      |       2 |         3 |
|     2 | Shi Potian  |  22 | M      |       1 |         7 |
|     3 | Xie Yanke   |  53 | M      |       2 |        16 |
|     4 | Ding Dian   |  32 | M      |       4 |         4 |
|     5 | Yu Yutong   |  26 | M      |       3 |         1 |
+-------+-------------+-----+--------+---------+-----------+
5 rows in set (0.00 sec)

3.6以年齡排序后,顯示年齡最大的前10位同學的信息

mysql> select * from students order by age desc limit 10;
+-------+--------------+-----+--------+---------+-----------+
| StuID | Name         | Age | Gender | ClassID | TeacherID |
+-------+--------------+-----+--------+---------+-----------+
|    25 | Sun Dasheng  | 100 | M      |    NULL |      NULL |
|     3 | Xie Yanke    |  53 | M      |       2 |        16 |
|     6 | Shi Qing     |  46 | M      |       5 |      NULL |
|    13 | Tian Boguang |  33 | M      |       2 |      NULL |
|     4 | Ding Dian    |  32 | M      |       4 |         4 |
|    24 | Xu Xian      |  27 | M      |    NULL |      NULL |
|     5 | Yu Yutong    |  26 | M      |       3 |         1 |
|    17 | Lin Chong    |  25 | M      |       4 |      NULL |
|    18 | Hua Rong     |  23 | M      |       7 |      NULL |
|    23 | Ma Chao      |  23 | M      |       4 |      NULL |
+-------+--------------+-----+--------+---------+-----------+
10 rows in set (0.00 sec)

3.7查詢年齡大於等於20歲,小於等於25歲的同學的信息

mysql> select * from students where age >= 20 and age <= 25;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
+-------+---------------+-----+--------+---------+-----------+
10 rows in set (0.00 sec)

mysql> select * from students where age between 20 and 25;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
+-------+---------------+-----+--------+---------+-----------+
10 rows in set (0.00 sec)

3.8以ClassID分組,顯示每班的同學的人數

mysql> select classid,count(*) 數量 from students group by classid;
+---------+--------+
| classid | 數量   |
+---------+--------+
|       2 |      3 |
|       1 |      4 |
|       4 |      4 |
|       3 |      4 |
|       5 |      1 |
|       7 |      3 |
|       6 |      4 |
|    NULL |      2 |
+---------+--------+
8 rows in set (0.00 sec)

mysql> select classid,count(stuid) 數量 from students group by classid;
+---------+--------+
| classid | 數量   |
+---------+--------+
|       2 |      3 |
|       1 |      4 |
|       4 |      4 |
|       3 |      4 |
|       5 |      1 |
|       7 |      3 |
|       6 |      4 |
|    NULL |      2 |
+---------+--------+
8 rows in set (0.01 sec)

3.9以Gender分組,顯示其年齡之和

mysql> select gender,sum(age) from students group by gender;
+--------+----------+
| gender | sum(age) |
+--------+----------+
| M      |      495 |
| F      |      190 |
+--------+----------+
2 rows in set (0.00 sec)

3.10以ClassID分組,顯示其平均年齡大於25的班級

mysql> select classid,avg(age) 平均年齡 from students group by classid having 平均年齡 > 25;
+---------+--------------+
| classid | 平均年齡     |
+---------+--------------+
|       2 |      36.0000 |
|       5 |      46.0000 |
|    NULL |      63.5000 |
+---------+--------------+
3 rows in set (0.00 sec)

3.11以Gender分組,顯示各組中年齡大於25的學員的年齡之和

mysql> select gender,sum(age) from students where age > 25 group by gender;
+--------+----------+
| gender | sum(age) |
+--------+----------+
| M      |      317 |
+--------+----------+
1 row in set (0.00 sec)

3.12顯示前5位同學的姓名、課程及成績

mysql> select * from students st inner join scores sc on st.stuid=sc.stuid;
+-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+
| StuID | Name        | Age | Gender | ClassID | TeacherID | ID | StuID | CourseID | Score |
+-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+
|     1 | Shi Zhongyu |  22 | M      |       2 |         3 |  1 |     1 |        2 |    77 |
|     1 | Shi Zhongyu |  22 | M      |       2 |         3 |  2 |     1 |        6 |    93 |
|     2 | Shi Potian  |  22 | M      |       1 |         7 |  3 |     2 |        2 |    47 |
|     2 | Shi Potian  |  22 | M      |       1 |         7 |  4 |     2 |        5 |    97 |
|     3 | Xie Yanke   |  53 | M      |       2 |        16 |  5 |     3 |        2 |    88 |
|     3 | Xie Yanke   |  53 | M      |       2 |        16 |  6 |     3 |        6 |    75 |
|     4 | Ding Dian   |  32 | M      |       4 |         4 |  7 |     4 |        5 |    71 |
|     4 | Ding Dian   |  32 | M      |       4 |         4 |  8 |     4 |        2 |    89 |
|     5 | Yu Yutong   |  26 | M      |       3 |         1 |  9 |     5 |        1 |    39 |
|     5 | Yu Yutong   |  26 | M      |       3 |         1 | 10 |     5 |        7 |    63 |
|     6 | Shi Qing    |  46 | M      |       5 |      NULL | 11 |     6 |        1 |    96 |
|     7 | Xi Ren      |  19 | F      |       3 |      NULL | 12 |     7 |        1 |    86 |
|     7 | Xi Ren      |  19 | F      |       3 |      NULL | 13 |     7 |        7 |    83 |
|     8 | Lin Daiyu   |  17 | F      |       7 |      NULL | 14 |     8 |        4 |    57 |
|     8 | Lin Daiyu   |  17 | F      |       7 |      NULL | 15 |     8 |        3 |    93 |
+-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+
15 rows in set (0.00 sec)

mysql> select * from students st inner join scores sc on st.stuid=sc.stuid inner join courses co on sc.courseid=co.courseid ;
+-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+----------+----------------+
| StuID | Name        | Age | Gender | ClassID | TeacherID | ID | StuID | CourseID | Score | CourseID | Course         |
+-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+----------+----------------+
|     1 | Shi Zhongyu |  22 | M      |       2 |         3 |  1 |     1 |        2 |    77 |        2 | Kuihua Baodian |
|     1 | Shi Zhongyu |  22 | M      |       2 |         3 |  2 |     1 |        6 |    93 |        6 | Weituo Zhang   |
|     2 | Shi Potian  |  22 | M      |       1 |         7 |  3 |     2 |        2 |    47 |        2 | Kuihua Baodian |
|     2 | Shi Potian  |  22 | M      |       1 |         7 |  4 |     2 |        5 |    97 |        5 | Daiyu Zanghua  |
|     3 | Xie Yanke   |  53 | M      |       2 |        16 |  5 |     3 |        2 |    88 |        2 | Kuihua Baodian |
|     3 | Xie Yanke   |  53 | M      |       2 |        16 |  6 |     3 |        6 |    75 |        6 | Weituo Zhang   |
|     4 | Ding Dian   |  32 | M      |       4 |         4 |  7 |     4 |        5 |    71 |        5 | Daiyu Zanghua  |
|     4 | Ding Dian   |  32 | M      |       4 |         4 |  8 |     4 |        2 |    89 |        2 | Kuihua Baodian |
|     5 | Yu Yutong   |  26 | M      |       3 |         1 |  9 |     5 |        1 |    39 |        1 | Hamo Gong      |
|     5 | Yu Yutong   |  26 | M      |       3 |         1 | 10 |     5 |        7 |    63 |        7 | Dagou Bangfa   |
|     6 | Shi Qing    |  46 | M      |       5 |      NULL | 11 |     6 |        1 |    96 |        1 | Hamo Gong      |
|     7 | Xi Ren      |  19 | F      |       3 |      NULL | 12 |     7 |        1 |    86 |        1 | Hamo Gong      |
|     7 | Xi Ren      |  19 | F      |       3 |      NULL | 13 |     7 |        7 |    83 |        7 | Dagou Bangfa   |
|     8 | Lin Daiyu   |  17 | F      |       7 |      NULL | 14 |     8 |        4 |    57 |        4 | Taiji Quan     |
|     8 | Lin Daiyu   |  17 | F      |       7 |      NULL | 15 |     8 |        3 |    93 |        3 | Jinshe Jianfa  |
+-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+----------+----------------+
15 rows in set (0.00 sec)

#以stuid前5排序
mysql> select name,course,score from students st inner join scores sc on st.stuid=sc.stuid inner join courses co on sc.courseid=co.courseid where st.stuid between 1 and 5;
+-------------+----------------+-------+
| name        | course         | score |
+-------------+----------------+-------+
| Shi Zhongyu | Kuihua Baodian |    77 |
| Shi Zhongyu | Weituo Zhang   |    93 |
| Shi Potian  | Kuihua Baodian |    47 |
| Shi Potian  | Daiyu Zanghua  |    97 |
| Xie Yanke   | Kuihua Baodian |    88 |
| Xie Yanke   | Weituo Zhang   |    75 |
| Ding Dian   | Daiyu Zanghua  |    71 |
| Ding Dian   | Kuihua Baodian |    89 |
| Yu Yutong   | Hamo Gong      |    39 |
| Yu Yutong   | Dagou Bangfa   |    63 |
+-------------+----------------+-------+
10 rows in set (0.01 sec)


mysql>  select name,course,score from students st inner join scores sc inner join courses co on st.stuid=sc.stuid and sc.courseid=co.courseid where st.stuid between 1 and 5;
+-------------+----------------+-------+
| name        | course         | score |
+-------------+----------------+-------+
| Shi Zhongyu | Kuihua Baodian |    77 |
| Shi Zhongyu | Weituo Zhang   |    93 |
| Shi Potian  | Kuihua Baodian |    47 |
| Shi Potian  | Daiyu Zanghua  |    97 |
| Xie Yanke   | Kuihua Baodian |    88 |
| Xie Yanke   | Weituo Zhang   |    75 |
| Ding Dian   | Daiyu Zanghua  |    71 |
| Ding Dian   | Kuihua Baodian |    89 |
| Yu Yutong   | Hamo Gong      |    39 |
| Yu Yutong   | Dagou Bangfa   |    63 |
+-------------+----------------+-------+
10 rows in set (0.00 sec)


#以score前五排序
mysql> select name,course,score from students st inner join scores sc on st.stuid=sc.stuid inner join courses co on sc.courseid=co.courseid order by score desc limit 5;
+-------------+----------------+-------+
| name        | course         | score |
+-------------+----------------+-------+
| Shi Potian  | Daiyu Zanghua  |    97 |
| Shi Qing    | Hamo Gong      |    96 |
| Shi Zhongyu | Weituo Zhang   |    93 |
| Lin Daiyu   | Jinshe Jianfa  |    93 |
| Ding Dian   | Kuihua Baodian |    89 |
+-------------+----------------+-------+
5 rows in set (0.01 sec)


mysql> select name,course,score from students st inner join scores sc inner join courses co on st.stuid=sc.stuid and sc.courseid=co.courseid order by score desc limit 5;
+-------------+----------------+-------+
| name        | course         | score |
+-------------+----------------+-------+
| Shi Potian  | Daiyu Zanghua  |    97 |
| Shi Qing    | Hamo Gong      |    96 |
| Shi Zhongyu | Weituo Zhang   |    93 |
| Lin Daiyu   | Jinshe Jianfa  |    93 |
| Ding Dian   | Kuihua Baodian |    89 |
+-------------+----------------+-------+
5 rows in set (0.00 sec)

3.13顯示其成績高於80的同學的名稱及課程

mysql> select name,course from students st inner join scores sc on st.stuid=sc.stuid inner join courses co on sc.courseid=co.courseid where score > 80;
+-------------+----------------+
| name        | course         |
+-------------+----------------+
| Shi Zhongyu | Weituo Zhang   |
| Shi Potian  | Daiyu Zanghua  |
| Xie Yanke   | Kuihua Baodian |
| Ding Dian   | Kuihua Baodian |
| Shi Qing    | Hamo Gong      |
| Xi Ren      | Hamo Gong      |
| Xi Ren      | Dagou Bangfa   |
| Lin Daiyu   | Jinshe Jianfa  |
+-------------+----------------+
8 rows in set (0.00 sec)


mysql> select name,course,score from students inner join scores inner join courses on students.stuid=scores.stuid and scores.courseid=courses.courseid where score>80;
+-------------+----------------+-------+
| name        | course         | score |
+-------------+----------------+-------+
| Shi Zhongyu | Weituo Zhang   |    93 |
| Shi Potian  | Daiyu Zanghua  |    97 |
| Xie Yanke   | Kuihua Baodian |    88 |
| Ding Dian   | Kuihua Baodian |    89 |
| Shi Qing    | Hamo Gong      |    96 |
| Xi Ren      | Hamo Gong      |    86 |
| Xi Ren      | Dagou Bangfa   |    83 |
| Lin Daiyu   | Jinshe Jianfa  |    93 |
+-------------+----------------+-------+
8 rows in set (0.00 sec)


select name,course,score 
from students,scores,courses 
where students.stuid=scores.stuid and scores.courseid=courses.courseid and score>80;
+-------------+----------------+-------+
| name        | course         | score |
+-------------+----------------+-------+
| Shi Zhongyu | Weituo Zhang   |    93 |
| Shi Potian  | Daiyu Zanghua  |    97 |
| Xie Yanke   | Kuihua Baodian |    88 |
| Ding Dian   | Kuihua Baodian |    89 |
| Shi Qing    | Hamo Gong      |    96 |
| Xi Ren      | Hamo Gong      |    86 |
| Xi Ren      | Dagou Bangfa   |    83 |
| Lin Daiyu   | Jinshe Jianfa  |    93 |
+-------------+----------------+-------+
8 rows in set (0.00 sec)

3.14取每位同學各門課的平均成績,顯示成績前三名的同學的姓名和平均成績

mysql> select name,avg(score) 平均成績 from students st inner join scores sc on st.stuid=sc.stuid inner join courses co on sc.courseid=co.courseid group by name order  by 平均成績 desc limit 3;
+-------------+--------------+
| name        | 平均成績     |
+-------------+--------------+
| Shi Qing    |      96.0000 |
| Shi Zhongyu |      85.0000 |
| Xi Ren      |      84.5000 |
+-------------+--------------+
3 rows in set (0.00 sec)

3.15顯示每門課程課程名稱及學習了這門課的同學的個數

mysql> select course,count(*) from students st inner join scores sc on st.stuid=sc.stuid inner join courses co on sc.courseid=co.courseid group by course;
+----------------+----------+
| course         | count(*) |
+----------------+----------+
| Kuihua Baodian |        4 |
| Weituo Zhang   |        2 |
| Daiyu Zanghua  |        2 |
| Hamo Gong      |        3 |
| Dagou Bangfa   |        2 |
| Taiji Quan     |        1 |
| Jinshe Jianfa  |        1 |
+----------------+----------+
7 rows in set (0.00 sec)

3.16顯示其年齡大於平均年齡的同學的名字

mysql> select avg(age) 平均年齡 from students st inner join scores sc on st.stuid=sc.stuid inner join courses co on sc.courseid=co.courseid ;
+--------------+
| 平均年齡     |
+--------------+
|      28.5333 |
+--------------+
1 row in set (0.00 sec)

mysql> select distinct name from  students st inner join scores sc on st.stuid=sc.stuid inner join courses co on sc.courseid=co.couurseid where age > (select avg(age) 平均年齡 from students st inner join scores sc on st.stuid=sc.stuid inner join courses co on scc.courseid=co.courseid );
+-----------+
| name      |
+-----------+
| Xie Yanke |
| Ding Dian |
| Shi Qing  |
+-----------+
3 rows in set (0.01 sec)



mysql> select avg(age)  平均年齡 from students;
+--------------+
| 平均年齡     |
+--------------+
|      27.4000 |
+--------------+
1 row in set (0.00 sec)

mysql> select name,age from students where age > (select avg(age)  平均年齡 from students);
+--------------+-----+
| name         | age |
+--------------+-----+
| Xie Yanke    |  53 |
| Ding Dian    |  32 |
| Shi Qing     |  46 |
| Tian Boguang |  33 |
| Sun Dasheng  | 100 |
+--------------+-----+
5 rows in set (0.00 sec)

3.17顯示其學習的課程為第1、2,4或第7門課的同學的名字

#students表和scores 關聯
mysql> select * from students st inner join scores sc on st.stuid=sc.stuid where sc.courseid in (1,2,4) or sc.courseid = 7;
+-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+
| StuID | Name        | Age | Gender | ClassID | TeacherID | ID | StuID | CourseID | Score |
+-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+
|     1 | Shi Zhongyu |  22 | M      |       2 |         3 |  1 |     1 |        2 |    77 |
|     2 | Shi Potian  |  22 | M      |       1 |         7 |  3 |     2 |        2 |    47 |
|     3 | Xie Yanke   |  53 | M      |       2 |        16 |  5 |     3 |        2 |    88 |
|     4 | Ding Dian   |  32 | M      |       4 |         4 |  8 |     4 |        2 |    89 |
|     5 | Yu Yutong   |  26 | M      |       3 |         1 |  9 |     5 |        1 |    39 |
|     5 | Yu Yutong   |  26 | M      |       3 |         1 | 10 |     5 |        7 |    63 |
|     6 | Shi Qing    |  46 | M      |       5 |      NULL | 11 |     6 |        1 |    96 |
|     7 | Xi Ren      |  19 | F      |       3 |      NULL | 12 |     7 |        1 |    86 |
|     7 | Xi Ren      |  19 | F      |       3 |      NULL | 13 |     7 |        7 |    83 |
|     8 | Lin Daiyu   |  17 | F      |       7 |      NULL | 14 |     8 |        4 |    57 |
+-------+-------------+-----+--------+---------+-----------+----+-------+----------+-------+
10 rows in set (0.00 sec)

mysql> select distinct st.name from students st inner join scores sc on st.stuid=sc.stuid where sc.courseid in (1,2,4) or sc.courseid = 7;
+-------------+
| name        |
+-------------+
| Shi Zhongyu |
| Shi Potian  |
| Xie Yanke   |
| Ding Dian   |
| Yu Yutong   |
| Shi Qing    |
| Xi Ren      |
| Lin Daiyu   |
+-------------+
8 rows in set (0.000 sec)


mysql> select distinct st.name from students st inner join scores sc on st.stuid=sc.stuid where sc.courseid in (1,2,4,7);
+-------------+
| name        |
+-------------+
| Shi Zhongyu |
| Shi Potian  |
| Xie Yanke   |
| Ding Dian   |
| Yu Yutong   |
| Shi Qing    |
| Xi Ren      |
| Lin Daiyu   |
+-------------+
8 rows in set (0.000 sec)

#students表和coc 關聯
MariaDB [hellodb]> select * from students st inner join coc co on st.classid=co.classid where co.courseid in (1,2,4) or co.courseid = 7;
+-------+---------------+-----+--------+---------+-----------+----+---------+----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID | ID | ClassID | CourseID |
+-------+---------------+-----+--------+---------+-----------+----+---------+----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |  3 |       2 |        2 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |  1 |       1 |        2 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |  3 |       2 |        2 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |  8 |       4 |        2 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |  5 |       3 |        1 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |  6 |       3 |        7 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |  9 |       5 |        1 |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |  5 |       3 |        1 |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |  6 |       3 |        7 |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL | 13 |       7 |        4 |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL | 12 |       6 |        4 |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |  5 |       3 |        1 |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |  6 |       3 |        7 |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL | 12 |       6 |        4 |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |  1 |       1 |        2 |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |  3 |       2 |        2 |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |  5 |       3 |        1 |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |  6 |       3 |        7 |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |  8 |       4 |        2 |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |  1 |       1 |        2 |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |  8 |       4 |        2 |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL | 13 |       7 |        4 |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL | 12 |       6 |        4 |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL | 13 |       7 |        4 |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL | 12 |       6 |        4 |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |  1 |       1 |        2 |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |  8 |       4 |        2 |
+-------+---------------+-----+--------+---------+-----------+----+---------+----------+
27 rows in set (0.001 sec)

MariaDB [hellodb]> select distinct name from students st inner join coc co on st.classid=co.classid where co.courseid in (1,2,4) or co.courseid = 7;
+---------------+
| name          |
+---------------+
| Shi Zhongyu   |
| Shi Potian    |
| Xie Yanke     |
| Ding Dian     |
| Yu Yutong     |
| Shi Qing      |
| Xi Ren        |
| Lin Daiyu     |
| Ren Yingying  |
| Yue Lingshan  |
| Yuan Chengzhi |
| Wen Qingqing  |
| Tian Boguang  |
| Lu Wushuang   |
| Duan Yu       |
| Xu Zhu        |
| Lin Chong     |
| Hua Rong      |
| Xue Baochai   |
| Diao Chan     |
| Huang Yueying |
| Xiao Qiao     |
| Ma Chao       |
+---------------+
23 rows in set (0.001 sec)

MariaDB [hellodb]> select distinct name from students st inner join coc co on st.classid=co.classid where co.courseid in (1,2,4,7);
+---------------+
| name          |
+---------------+
| Shi Zhongyu   |
| Shi Potian    |
| Xie Yanke     |
| Ding Dian     |
| Yu Yutong     |
| Shi Qing      |
| Xi Ren        |
| Lin Daiyu     |
| Ren Yingying  |
| Yue Lingshan  |
| Yuan Chengzhi |
| Wen Qingqing  |
| Tian Boguang  |
| Lu Wushuang   |
| Duan Yu       |
| Xu Zhu        |
| Lin Chong     |
| Hua Rong      |
| Xue Baochai   |
| Diao Chan     |
| Huang Yueying |
| Xiao Qiao     |
| Ma Chao       |
+---------------+
23 rows in set (0.001 sec)

3.18顯示其成員數最少為3個的班級的同學中年齡大於同班同學平均年齡的同學

#方法1
mysql> select classid,count(stuid),avg(age) 平均年齡 from students group by classid having count(stuid)>=3;
+---------+--------------+--------------+
| classid | count(stuid) | 平均年齡     |
+---------+--------------+--------------+
|       2 |            3 |      36.0000 |
|       1 |            4 |      20.5000 |
|       4 |            4 |      24.7500 |
|       3 |            4 |      20.2500 |
|       7 |            3 |      19.6667 |
|       6 |            4 |      20.7500 |
+---------+--------------+--------------+
6 rows in set (0.00 sec)

mysql> select * from students a inner join (select classid,count(stuid),avg(age) 平均年齡 from students group by classid having couunt(stuid)>=3) b on a.classid=b.classid where a.age > b.平均年齡;
+-------+---------------+-----+--------+---------+-----------+---------+--------------+--------------+
| StuID | Name          | Age | Gender | ClassID | TeacherID | classid | count(stuid) | 平均年齡     |
+-------+---------------+-----+--------+---------+-----------+---------+--------------+--------------+
|     2 | Shi Potian    |  22 | M      |       1 |         7 |       1 |            4 |      20.5000 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |       2 |            3 |      36.0000 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |       4 |            4 |      24.7500 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |       3 |            4 |      20.2500 |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |       6 |            4 |      20.7500 |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |       1 |            4 |      20.5000 |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |       4 |            4 |      24.7500 |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |       7 |            3 |      19.6667 |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |       6 |            4 |      20.7500 |
+-------+---------------+-----+--------+---------+-----------+---------+--------------+--------------+
9 rows in set (0.00 sec)

mysql> select name from students a inner join (select classid,count(stuid),avg(age) 平均年齡 from students group by classid having count(stuid)>=3) b on a.classid=b.classid where a.age > b.平均年齡;
+---------------+
| name          |
+---------------+
| Shi Potian    |
| Xie Yanke     |
| Ding Dian     |
| Yu Yutong     |
| Yuan Chengzhi |
| Xu Zhu        |
| Lin Chong     |
| Hua Rong      |
| Huang Yueying |
+---------------+
9 rows in set (0.00 sec)

#方法2
mysql> select classid,count(*) 人數,avg(age) 平均年齡 from students group by classid having count(stuid)>=3;
+---------+--------+--------------+
| classid | 人數   | 平均年齡     |
+---------+--------+--------------+
|       2 |      3 |      36.0000 |
|       1 |      4 |      20.5000 |
|       4 |      4 |      24.7500 |
|       3 |      4 |      20.2500 |
|       7 |      3 |      19.6667 |
|       6 |      4 |      20.7500 |
+---------+--------+--------------+
6 rows in set (0.00 sec)


mysql> select * from students a inner join (select classid,count(*) 人數,avg(age) 平均年齡 from students group by classid having count(stuid)>=3) b on a.classid=b.classid where a.age > b.平均年齡;
+-------+---------------+-----+--------+---------+-----------+---------+--------+--------------+
| StuID | Name          | Age | Gender | ClassID | TeacherID | classid | 人數   | 平均年齡     |
+-------+---------------+-----+--------+---------+-----------+---------+--------+--------------+
|     2 | Shi Potian    |  22 | M      |       1 |         7 |       1 |      4 |      20.5000 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |       2 |      3 |      36.0000 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |       4 |      4 |      24.7500 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |       3 |      4 |      20.2500 |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |       6 |      4 |      20.7500 |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |       1 |      4 |      20.5000 |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |       4 |      4 |      24.7500 |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |       7 |      3 |      19.6667 |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |       6 |      4 |      20.7500 |
+-------+---------------+-----+--------+---------+-----------+---------+--------+--------------+
9 rows in set (0.00 sec)

mysql> select name from students a inner join (select classid,count(*) 人數,avg(age) 平均年齡 from students group by classid havingg count(stuid)>=3) b on a.classid=b.classid where a.age > b.平均年齡;
+---------------+
| name          |
+---------------+
| Shi Potian    |
| Xie Yanke     |
| Ding Dian     |
| Yu Yutong     |
| Yuan Chengzhi |
| Xu Zhu        |
| Lin Chong     |
| Hua Rong      |
| Huang Yueying |
+---------------+
9 rows in set (0.00 sec)

3.19統計各班級中年齡大於全校同學平均年齡的同學

mysql> select avg(age) from students;
+----------+
| avg(age) |
+----------+
|  27.4000 |
+----------+
1 row in set (0.00 sec)

mysql> select * from students where age > (select avg(age) from students);
+-------+--------------+-----+--------+---------+-----------+
| StuID | Name         | Age | Gender | ClassID | TeacherID |
+-------+--------------+-----+--------+---------+-----------+
|     3 | Xie Yanke    |  53 | M      |       2 |        16 |
|     4 | Ding Dian    |  32 | M      |       4 |         4 |
|     6 | Shi Qing     |  46 | M      |       5 |      NULL |
|    13 | Tian Boguang |  33 | M      |       2 |      NULL |
|    25 | Sun Dasheng  | 100 | M      |    NULL |      NULL |
+-------+--------------+-----+--------+---------+-----------+
5 rows in set (0.00 sec)

mysql> select name from students where age > (select avg(age) from students);
+--------------+
| name         |
+--------------+
| Xie Yanke    |
| Ding Dian    |
| Shi Qing     |
| Tian Boguang |
| Sun Dasheng  |
+--------------+
5 rows in set (0.00 sec)

四.MyISAM存儲引擎和InnoDB存儲引擎的區別

MyISAM存儲引擎
不支持聚集索引  Clustered indexes
不支持數據緩存  Data caches
不支持外鍵   Foreign key support
支持鎖定粒度:table (加表級鎖)  Locking granularity
不支持MVCC (多版本並發控制機制)
不支持事務  Transactions

InnoDB存儲引擎
支持聚集索引  Clustered indexes
支持數據緩存  Data caches
支持外鍵   Foreign key support
支持鎖定粒度:Row (加行級鎖)   Locking granularity
支持MVCC (多版本並發控制機制)
支持事務  Transactions

五.InnoDB中一顆的B+樹可以存放多少行數據?

假設定義一顆B+樹高度為2,即一個根節點和若干葉子節點。那么這棵B+樹的存放總行記錄數=根節點指針數*單個葉子記錄的行數。這里先計算葉子節點,B+樹中的單個葉子節點的大小為16K,假設每一條目為1K,那么記錄數即為16(16k/1K=16),然后計算非葉子節點能夠存放多少個指針,假設主鍵ID為bigint類型,那么長度為8字節,而指針大小在InnoDB中是設置為6個字節,這樣加起來一共是14個字節。那么通過頁大小/(主鍵ID大小+指針大小),即16384/14=1170個指針,所以一顆高度為2的B+樹能存放16*1170=18720條這樣的記錄。根據這個原理就可以算出一顆高度為3的B+樹可以存放16*1170*1170=21902400條記錄。所以在InnoDB中B+樹高度一般為2-3層,它就能滿足千萬級的數據存儲

六.事務特性

ACID特性:
A:atomicity原子性;整個事務中的所有操作要么全部成功執行,要么全部失敗后回滾
C:consistency一致性;數據庫總是從一個一致性狀態轉換為另一個一致性狀態
I:Isolation隔離性;一個事務所做出的操作在提交之前,是不能為其它事務所見;隔離有多種隔
離級別,實現並發
D:durability持久性;一旦事務提交,其所做的修改會永久保存於數據庫中

七.事務隔離級別

READ UNCOMMITTED
可讀取到未提交數據,產生臟讀
READ COMMITTED
可讀取到提交數據,但未提交數據不可讀,產生不可重復讀,即可讀取到多個提交數據,導致每次
讀取數據不一致
REPEATABLE READ
可重復讀,多次讀取數據都一致,產生幻讀,即讀取過程中,即使有其它提交的事務修改數據,仍
只能讀取到未修改前的舊數據。此為MySQL默認設置
SERIALIZABLE
可串行化,未提交的讀事務阻塞修改事務(加讀鎖,但不阻塞讀事務),或者未提交的修改事務阻
塞讀事務(加寫鎖,其它事務的讀,寫都不可以執行)。會導致並發性能差

八.慢查詢日志設置多少秒

mysql> select @@slow_query_log;
+------------------+
| @@slow_query_log |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)

mysql> set global slow_query_log=1;	#開啟慢查詢日志
Query OK, 0 rows affected (0.00 sec)

mysql> select @@slow_query_log;
+------------------+
| @@slow_query_log |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)


mysql> select @@long_query_time;
+-------------------+
| @@long_query_time |
+-------------------+
|         10.000000 |
+-------------------+
1 row in set (0.00 sec)

#默認設置10秒

mysql> select @@slow_query_log_file;
+---------------------------------+
| @@slow_query_log_file           |
+---------------------------------+
| /var/lib/mysql/centos8-slow.log |
+---------------------------------+
1 row in set (0.00 sec)
#慢查詢日志存放路徑

[root@centos8 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
slow_query_log		#開啟慢查詢日志 
long_query_time=3	#設置慢查詢日志時間為3秒
:wq

[root@centos8 ~]# systemctl restart mysqld

mysql> select sleep(1) from teachers;
+----------+
| sleep(1) |
+----------+
|        0 |
|        0 |
|        0 |
|        0 |
+----------+
4 rows in set (4.03 sec)

[root@centos8 ~]# tail -f /var/lib/mysql/centos8-slow.log
SET timestamp=1612688316;
select sleep(1) from teachers;
#超過3秒的慢查詢日志,都會記錄

九.mysql 主從復制原理

1.主節點數據更新 
2.生成Bin Log(二進制日志) 
3.在主節點開啟dump Thread線程,負責把二進制日志從主節點發送給從節點
4.從節點開啟I/O Thread線程,負責接收網絡發過來的二進制日志  
5.把接收到的二進制日志放到中繼日志中
6.開啟SQL Thread線程,把中繼日志中的內容,讀取到內存中執行
7.進行執行就更改了數據庫,數據庫中的內容保持和主節點的內容保持一致,從而最終就實現了主從復制

十.MySQL主從數據不一致

1.造成主從不一致的原因

  • 主庫binlog格式為Statement(語句型),同步到從庫執行后可能造成主從不一致。(把binlog 改成行型)
  • 主庫執行更改前有執行set sql_log_bin=0,會使主庫不記錄binlog,從庫也無法變更這部分數據。
  • 從節點未設置只讀,誤操作寫入數據
  • 主庫或從庫意外宕機,宕機可能會造成binlog或者relaylog文件出現損壞,導致主從不一致主從實例版本不一致,特別是高版本是主,低版本為從的情況下,主數據庫上面支持的功能,從數據庫上面可能不支持該功能
  • MySQL自身bug導致

2.主從不一致修復方法

  • 將從庫重新實現
    雖然這也是一種解決方法,但是這個方案恢復時間比較慢,而且有時候從庫也是承擔一部分的查詢操作的,不能貿然重建。
  • 使用percona-toolkit工具輔助
    PT工具包中包含pt-table-checksum和pt-table-sync兩個工具,主要用於檢測主從是否一致以及修復數據不一致情況。這種方案優點是修復速度快,不需要停止主從輔助,缺點是需要知識積累,需要時間去學習,去測試,特別是在生產環境,還是要小心使用
    關於使用方法,可以參考下面鏈接:https://www.cnblogs.com/feiren/p/7777218.html
  • 手動重建不一致的表
    在從庫發現某幾張表與主庫數據不一致,而這幾張表數據量也比較大,手工比對數據不現實,並且重做整個庫也比較慢,這個時候可以只重做這幾張表來修復主從不一致這種方案缺點是在執行導入期間需要暫時停止從庫復制,不過也是可以接受的

3.如何避免主從不一致

  • 主庫binlog采用ROW格式
  • 主從實例數據庫版本保持一致
  • 主庫做好賬號權限把控,不可以執行set sql_log_bin=0
  • 從庫開啟只讀,不允許人為寫入
  • 定期進行主從一致性檢驗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM