第一天
mysql 5.7.28二進(jìn)制
centos 7.6
hostname:db-01
rpm -qa |grep mariadb
yum remove mariadb-libs -y
useradd mysql -s /sbin/nologin
id mysql
mkdir -p /app/database
mkdir -p /data
mkdir -p /binlog/3306
chown -R mysql.mysql /app /data /binlog
cd /app/database
tar xf mysql-5.7.28.*.tar.gz
ln -s mysql-5.7.8.* mysql
vim /etc/profile
? export PATH=/app/database/mysql/bin:$PATH
source /etc/profile
mysql -V
==mysqld --initialize-insecure --user=mysql --basedir=/app/database/mysql --datadir=/data/3306==
dba可以忽略warning
5.6不是這個(gè)命令是:==/app/database/mysql/scripts/mysql_install_db==
? yum install -y libaio-devel
vim /etc/my.cnf
[mysqld]
user=mysql
basedir=/app/databae/mysql
datadir=/data/3306
server_id=6
port=3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
cat > /etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/app/databae/mysql
datadir=/data/3306
server_id=6
port=3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
EOF
cd /app/database/mysql/support-files
cp mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
systemctl start mysqld
==mysql -S /tmp/mysql.sock==
只能在本地使用坟漱,不依賴ip和port
mysql -uroot -pmima -h ip -P3306
==實(shí)例:mysqld+工作線程+預(yù)分配的內(nèi)存結(jié)構(gòu)==
? 功能:管理數(shù)據(jù)
mysqld的程序結(jié)構(gòu)(兩層)
server層
-
連接層
- 提供連接協(xié)議(socket玛瘸、tcp/ip)
- 驗(yàn)證
- 提供專用鏈接線程
-
SQL層
語(yǔ)法檢查
語(yǔ)義(DDL,DCL,DML,DTL...)
權(quán)限
解析器:解析預(yù)處理处铛,得到多種執(zhí)行計(jì)劃
優(yōu)化器:基于代價(jià)cost映穗,幫我們選擇最優(yōu)的方案(執(zhí)行計(jì)劃)
-
執(zhí)行器:按照優(yōu)化器的選擇俊抵,執(zhí)行sql語(yǔ)句帚屉,得出執(zhí)行結(jié)果(你需要的數(shù)據(jù)在磁盤的什么位置)
你需要的數(shù)據(jù)在xxx段号枕,xxx區(qū)锌订,xxx頁(yè)
查詢緩存(query cache默認(rèn)不開啟,8.0版本取消了)急膀,可以redis(阿里的Tair)替代
日志記錄(binlog二進(jìn)制日志沮协,glog---通用日志,需要人為開啟)
存儲(chǔ)引擎層:相當(dāng)于linux文件系統(tǒng)卓嫂,和磁盤交互的模塊
磁盤:xxx.ibd
#連接層
show processlist;
select user,host from mysql.user;
mysql的邏輯結(jié)構(gòu)(==對(duì)象==)
- 庫(kù)
- 庫(kù)名
- 庫(kù)屬性
- 表
- 表名
- 表屬性
- 表內(nèi)容/數(shù)據(jù)行
- 列
show databases;
use mysql;
show tables;
desc user;
mysql的物理存儲(chǔ)結(jié)構(gòu)(==存儲(chǔ)引擎層==)
- 段
- 一個(gè)表就是一個(gè)段(分區(qū)表除外)
- 段可以由1個(gè)或多個(gè)區(qū)構(gòu)成慷暂,但是多個(gè)區(qū)不一定是連續(xù)的
- 區(qū)/簇
- 一個(gè)區(qū)胸私,默認(rèn)1M,連續(xù)的64個(gè)pages
- extent:連續(xù)64pages=1MB
- 頁(yè)
- 一個(gè)頁(yè)毫目,默認(rèn)16KB侥衬,連續(xù)的4個(gè)os block,最小的IO單元
- page:16KB=4個(gè)連續(xù)block
第二天
用戶管理
- mysql用戶:用戶名@'白名單'
- ==select user,host,authentication_string from mysql.user;==
create user xinzhan@'localhost';
select user,host from mysql.user;
create user xinzhan@'192.168.1.%' identified by '123456';
select user,host,authentication_string from mysql.user;
alter user xinzhan@'localhost' identified by '123456';
drop user xinzhan@'localhost';
drop user xinzhan@'192.168.1.%';
8.0版本之前血久,可以通過grant命令突照,建立用戶+授權(quán)
權(quán)限管理
- 權(quán)限的表現(xiàn)方式
- ==show privileges;==
- 授權(quán)、回收權(quán)限操作
- 語(yǔ)法8.0以前:grant 權(quán)限 on 對(duì)象 to 用戶 identified by '密碼';
-
語(yǔ)法8.0+:
- create user 用戶 identified by '密碼';
- grant 權(quán)限 on 對(duì)象 to 用戶;
- 權(quán)限
- ALL:管理員
- 權(quán)限1,權(quán)限2,權(quán)限3,......: 普通用戶(業(yè)務(wù)用戶氧吐,開發(fā)用戶)
- Grant option:給別的用戶授權(quán)
- grant 權(quán)限1,權(quán)限2,權(quán)限3,...... on 對(duì)象 to 用戶 identified by '密碼' ==with grant option==;
- 對(duì)象:庫(kù)讹蘑,表
- *.*
- 庫(kù)名.*
- 庫(kù)名.表名
- mysql授權(quán)表(擴(kuò)展)
- user---*.*
- db---庫(kù)名.*
- tables_priv
- columns_priv
- 回收權(quán)限
- 不能通過重復(fù)授權(quán),修改權(quán)限筑舅,只能通過回收權(quán)限方式進(jìn)行修改座慰,但可以疊加權(quán)限
- revoke create on app. from app@'192.168.1.%';*
grant all on *.* to xinzhan@'192.168.1.%' identified by '123456' with grant option;
select user,host from mysql.user;
#查詢用戶權(quán)限
show grants for xinzhan@'192.168.1.%';
#也可以通過下面語(yǔ)句查看權(quán)限(這個(gè)不一定好用)
select * from mysql.user\G;
grant create,update,select,insert,delete on app.* to app@'192.168.1.%' identified by '123'
revoke create on app.* from app@'192.168.1.%';
超級(jí)管理員忘記密碼怎么辦
/etc/init.d/mysqld stop
service mysqld start --skip-grant-tables (這個(gè)比較靈異)
以前版本的做法:
/etc/init.d/mysqld stop
mysqld_safe --skip-grant-tables &
- 關(guān)閉數(shù)據(jù)庫(kù)(下面兩種都可以)
- systemctl stop mysqld
- service mysqld stop
- 使用安全模式啟動(dòng)(下面兩種都可以)
- ==mysqld_safe --skip-grant-tables --skip-networking &==
- service mysqld start --skip-grant-tables --skip-networking
- 登錄
- mysql
- ==flush privileges;==
- 手工加載授權(quán)表
- alter user root@'localhost' identified by '123456';
- 重啟數(shù)據(jù)庫(kù)到正常模式
- service mysqld restart
連接管理
-
windows
- sqlyog
- workbench
- navicat
-
linux(mysql自帶客戶端)
-
mysql
參數(shù)列表:
-u 用戶名
-p 密碼
-S 本地socket文件位置
-h 數(shù)據(jù)庫(kù)ip地址
-P 數(shù)據(jù)庫(kù)端口號(hào)
-e 免交互執(zhí)行數(shù)據(jù)庫(kù)命令
< 導(dǎo)入sql腳本
mysqldump
mysqladmin
-
api driver
==show processlist==
初始化配置管理
- 源碼安裝,編譯過程中設(shè)置初始化參數(shù)
- 配置文件:數(shù)據(jù)庫(kù)啟動(dòng)之前翠拣,設(shè)定配置文件參數(shù)(/etc/my.cnf)
- 啟動(dòng)腳本命令行
配置文件的應(yīng)用
- 配置文件讀取順序
- mysqld --help --verbose |grep my.cnf
-
手動(dòng)定制配置文件位置
- ==mysqld --defaults-file=/opt/my.cnf &==
- mysqld_safe --defaults-file=/opt/my.cnf &
- ==mysqld --defaults-file=/opt/my.cnf &==
啟動(dòng)和關(guān)閉
調(diào)用關(guān)系(流程)
service mysqld start/stop/restart
systemctl start/stop/restart mysqld
? support-file/mysql.server
? mysqld_safe:?jiǎn)?dòng)時(shí)可以臨時(shí)設(shè)定參數(shù)
? mysqld:?jiǎn)?dòng)時(shí)可以臨時(shí)設(shè)定參數(shù)
臨時(shí)設(shè)定參數(shù)
- --skip-grant-tables
- --skip-networking
- --defaults-file=/xxx/my.cnf
--port=xxx
啟動(dòng)
? systemctl start mysqld---> mysql.server--->mysql_safe--->mysqld
關(guān)閉
- systemctl stop mysqld
- service mysqld stop
- mysqladmin -uroot -pxxx shutdown
- mysql -uroot -p xxx -e "shutdown"
mysql的多實(shí)例
同版本的多實(shí)例
- 規(guī)劃
- 軟件一份版仔,
- 配置文件3份,/data/330{7..9}/my.cnf
- 數(shù)據(jù)目錄3份心剥,/data/330{7..9}
- 初始化數(shù)據(jù)3次邦尊,
- 日志目錄3份,/binlog/330{7..9}
- socket文件3份优烧,/tmp/mysql330{7..9}.sock
- 端口3個(gè)蝉揍,port=3307,3308,3309
- server_id3個(gè),service_id=7,8,9
- 配制過程
- 創(chuàng)建需要的目錄
- 創(chuàng)建配置文件
- 初始化數(shù)據(jù)
- 準(zhǔn)備啟動(dòng)腳本
- 啟動(dòng)多實(shí)例
mkdir -p /data/330{7..9}/data
mkdir -p /binlog/330{7..9}
cat > /data/3307/my.cnf <<EOF
[mysqld]
basedir=/app/database/mysql
datadir=/data/3307/data
socket=/tmp/mysql3307.sock
log_error=/data/3307/mysql.log
port=3307
server_id=7
log_bin=/binlog/3307/mysql-bin
EOF
cat > /data/3308/my.cnf <<EOF
[mysqld]
basedir=/app/database/mysql
datadir=/data/3308/data
socket=/tmp/mysql3308.sock
log_error=/data/3308/mysql.log
port=3308
server_id=8
log_bin=/binlog/3308/mysql-bin
EOF
cat > /data/3309/my.cnf <<EOF
[mysqld]
basedir=/app/database/mysql
datadir=/data/3309/data
socket=/tmp/mysql3309.sock
log_error=/data/3309/mysql.log
port=3307
server_id=7
log_bin=/binlog/3309/mysql-bin
EOF
chown -R mysql.mysql /data /binlog
mv /etc/my.cnf /etc/my.cnf.bak
mysqld --initialize-insecure --user=mysql --basedir=/app/database/mysql --datadir=/data/3307/data
mysqld --initialize-insecure --user=mysql --basedir=/app/database/mysql --datadir=/data/3308/data
mysqld --initialize-insecure --user=mysql --basedir=/app/database/mysql --datadir=/data/3309/data
cat > /etc/systemd/system/mysqld3307.service << EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/app/database/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF
cat > /etc/systemd/system/mysqld3308.service << EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/app/database/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE = 5000
EOF
cat > /etc/systemd/system/mysqld3309.service << EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/app/database/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000
EOF
systemctl start mysqld3307
systemctl start mysqld3308
systemctl start mysqld3309
netstat -tulpn |grep 330
不同版本的多實(shí)例
- 軟連接不同版本軟件,修改環(huán)境變量
- 準(zhǔn)備不同目錄
- 準(zhǔn)備配置文件
- 初始化數(shù)據(jù)
- 準(zhǔn)備啟動(dòng)腳本
cd /app/database
ln -s mysql-5.6.46-.* mysql56
ln -s mysql-8.0.18-.* mysql80
mv /etc/my.cnf /etc/my.cnf.bak
vim /etc/profile
#注釋以下信息
#export PATH=/app/database/mysql/bin:$PATH
#export PATH=/app/database/mysql/bin:$PATH
#export PATH=/app/database/mysql56/bin:$PATH
#export PATH=/app/database/mysql80/bin:$PATH
###三選其一
mkdir -p /data/331{7..8}/data
mkdir -p /binlog/331{7..8}
chown -R mysql.mysql /data/* /binlog/*
cat > /data/3317/my.cnf <<EOF
[mysqld]
basedir=/app/database/mysql56
datadir=/data/3317/data
socket=/tmp/mysql3317.sock
log_error=/data/3317/mysql.log
port=3317
server_id=17
log_bin=/binlog/3317/mysql-bin
EOF
cat > /data/3318/my.cnf <<EOF
[mysqld]
basedir=/app/database/mysql80
datadir=/data/3318/data
socket=/tmp/mysql3318.sock
log_error=/data/3318/mysql.log
port=3318
server_id=18
log_bin=/binlog/3318/mysql-bin
EOF
#5.6
/app/database/mysql56/scripts/mysql_install_db --user=mysql --basedir=/app/database/mysql56 --datadir=/data/3317/data
#8.0
/app/database/mysql80/bin/mysqld --initialize-insecure --user=mysql --basedir=/app/database/mysql80 --datadir=/data/3318/data
cat > /etc/systemd/system/mysqld3317.service << EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/app/database/mysql56/bin/mysqld --defaults-file=/data/3317/my.cnf
LimitNOFILE = 5000
EOF
cat > /etc/systemd/system/mysqld3318.service << EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/app/database/mysql80/bin/mysqld --defaults-file=/data/3318/my.cnf
LimitNOFILE = 5000
EOF
systemctl start mysqld3317
systemctl start mysqld3318
netstat -tulpn |grep 331
vim /etc/profile
export PATH=/app/database/mysql/bin:$PATH
source /etc/profile
mysql -S /tmp/mysql3317.sock
#mysql5.7本地客戶端可以兼容不同版本的mysqld(5.6畦娄,8.0)
mysql -S /tmp/mysql3318.sock
第三天
sql基礎(chǔ)
- sql常用類型
- mysql客戶端自帶的
- help---不屬于sql語(yǔ)句
- server端分類命令
- ==help contents==
-
help Data Definition
- help DROP DATABASE
-
help Data Definition
- 分類(記前三)
- DDL:數(shù)據(jù)定義語(yǔ)言---Data Definition
- DCL:數(shù)據(jù)控制語(yǔ)言
- DML:數(shù)據(jù)操作語(yǔ)言
DQL:數(shù)據(jù)查詢語(yǔ)言
- ==help contents==
- mysql客戶端自帶的
- sql的各種名詞
- sql_mode---sql模式
- 規(guī)范sql語(yǔ)句書寫方式
- ==select @@sql_mode;==
- 版本5.6和5.7差別很大又沾,5.7以后差不過一樣
- 字符集(charset)及校對(duì)規(guī)則(collation)
- 字符集:==show charset==
- utf8:最大存儲(chǔ)長(zhǎng)度,單個(gè)字符最多3個(gè)字節(jié)
- utf8mb4:5.6版本才出現(xiàn)熙卡,現(xiàn)在建議都要用這個(gè)編碼杖刷;最大存儲(chǔ)長(zhǎng)度,單個(gè)字符最多4個(gè)字節(jié)
- create database zabbix ==charset utf8mb4==;
- ==show create database zabbix;==
- 校對(duì)規(guī)則
- 每種字符集驳癌,有多種校對(duì)規(guī)則(排序規(guī)則)
- ==show collation;==
- select ASCII('A');
- 字符集:==show charset==
- sql_mode---sql模式
數(shù)據(jù)類型
-
數(shù)字
- 整數(shù)
- tinyint:存儲(chǔ)長(zhǎng)度=1B
- int:4B
- bigint:8B
- 小數(shù)
- 整數(shù)
-
字符串
- char(長(zhǎng)度):定長(zhǎng)字符串類型滑燃,最多255個(gè)字節(jié)
- varchar(長(zhǎng)度):變長(zhǎng)字符串類型,最多65535個(gè)字節(jié)
- 除了存儲(chǔ)字符串之外颓鲜,還會(huì)額外使用1-2字節(jié)存儲(chǔ)字符長(zhǎng)度
- enum('bj',sh):枚舉
- 字符串類型選擇會(huì)影響索引應(yīng)用
- 對(duì)于英文和數(shù)字表窘,每個(gè)字符占一個(gè)字節(jié)長(zhǎng)度
-
對(duì)于中文(utf8,uft8mb4)甜滨,每個(gè)字符占三個(gè)字節(jié)
- uft8mb4字符集中==emoji字符乐严,占4個(gè)字節(jié)長(zhǎng)度==
- ==select length(column_name) from table_name;==
-
時(shí)間
- datetime:范圍為從 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999
- 占8個(gè)字節(jié)
- timestamp:1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。timestamp會(huì)受到時(shí)區(qū)的影響
- 占4個(gè)字節(jié)
- img
- datetime:范圍為從 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999
二進(jìn)制
-
json
- 版本8.0才有的
create database xinzhan charset utf8mb4;
use xinzhan;
create table t1(id int,name varchar(64),age tinyint);
show tables;
desc t1;
約束
-
Primary Key---PK
- 主鍵約束衣摩。作用:唯一+非空
- 每一張表只能有一個(gè)主鍵昂验,最為聚簇索引
- not null
- 非空約束,必須非空
- 建議每個(gè)列都設(shè)置非空
- unique key
- 唯一約束,必須不重復(fù)的值
- unsigned
- 針對(duì)數(shù)字列既琴,非負(fù)數(shù)
其他屬性
- default
- 默認(rèn)值
- comment
- 注釋
- auto_increment
sql應(yīng)用
client
- \c:結(jié)束上條命令運(yùn)行
- ==\G==:格式化輸出
- help
- \q:退出mysql會(huì)話---ctrl+d
- source:導(dǎo)入sql腳本占婉,類似于<
- system:調(diào)用linux命令
==Server==
-
DDL:數(shù)據(jù)定義語(yǔ)言
-
庫(kù)定義:庫(kù)名 庫(kù)屬性
- 創(chuàng)建庫(kù):==create database xxx charset utf8mb4;==
- 查庫(kù)
- ==show database;==
- ==show create databae xxx;==
- 修改庫(kù):==alter database xxx charset utf8mb4;==
- 庫(kù)名是不能修改的
- 刪除庫(kù):==drop database xxx;==
-
表定義
-
創(chuàng)建表
CREATE TABLE stu( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '學(xué)號(hào)', sname VARCHAR(255) NOT NULL COMMENT '姓名', sage TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年齡', sgender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性別' , sfz CHAR(18) NOT NULL UNIQUE COMMENT '身份證', intime TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入學(xué)時(shí)間' ) ENGINE=INNODB CHARSET=utf8 COMMENT '學(xué)生表'; ###或者如下 CREATE TABLE stu( id INT NOT NULL AUTO_INCREMENT COMMENT '學(xué)號(hào)', sname VARCHAR(255) NOT NULL COMMENT '姓名', sage TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年齡', sgender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性別' , sfz CHAR(18) NOT NULL UNIQUE COMMENT '身份證', intime TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入學(xué)時(shí)間', PRIMARY KEY(id) ) ENGINE=INNODB CHARSET=utf8 COMMENT '學(xué)生表';
-
查詢表
- ==show tables;==
- ==desc table_name;==
- ==show create table table_name;==
-
修改表
- ==alter table table_name add [column] column_name bigint not null unique key comment '注釋';==
- ==alter table table_name modify column_name char(11) not null unique key comment '注釋';==
- ==alter table table_name drop column_name;==
刪除表:==drop table table_name;==
-
-
第四天
DDL
線上ddl(alter)操作對(duì)于生產(chǎn)的影響
sql審核平臺(tái):yearing inception
說明:在mysql中,ddl語(yǔ)句在對(duì)表進(jìn)行操作時(shí)呛梆,是要==鎖元數(shù)據(jù)表==的锐涯。此時(shí)磕诊,所有修改類的命令無(wú)法正常運(yùn)行
==所以==:在對(duì)于大表填物,業(yè)務(wù)繁忙的表,進(jìn)行線上ddl操作時(shí)霎终,要謹(jǐn)慎滞磺。盡量避開業(yè)務(wù)員繁忙期間,進(jìn)行ddl
==``建議使用`:pt-online-schema-change(pt-osc) gh-ost 工具進(jìn)行ddl操作莱褒,減少鎖表的影響==
- pt-osc工具的使用==击困??广凸?==
- 往表中加列
- pt-osc的工作原理
- pt-osc簡(jiǎn)書
DCL(略)
- grant
- revoke
DML
表中數(shù)據(jù)行進(jìn)行操作
- insert
- ==insert into table_name (column_name,xxx,......) values(xxx,xxx,......);==
- 簡(jiǎn)約方法
- 部分錄入數(shù)據(jù)
- 批量錄入方式
- ==insert into table_name (column_name,xxx,......) values(xxx,xxx,......),(xxx,xxx,......),(xxx,xxx,......);==
- update
- 修改指定數(shù)據(jù)行的值阅茶,必須要明確要改哪一行,一般update語(yǔ)句都要有where的條件
- update table_name set column_name=xxx where column_name1=xxx;
- 如果沒有指定某行谅海,那就是全表的數(shù)據(jù)行都修改
- 修改指定數(shù)據(jù)行的值阅茶,必須要明確要改哪一行,一般update語(yǔ)句都要有where的條件
- delete
- 刪除指定數(shù)據(jù)行的值脸哀,必須要明確要?jiǎng)h哪些行,一般delete語(yǔ)句都要有where的條件
- delete from table_name where column_name=xxx;
- 刪除指定數(shù)據(jù)行的值脸哀,必須要明確要?jiǎng)h哪些行,一般delete語(yǔ)句都要有where的條件
==偽刪除==
修改表結(jié)構(gòu)扭吁,添加state狀態(tài)列
==alter table table_name add column state tinyint not null default 1;==
刪除數(shù)據(jù)改為update
==update table_name set state=0 where column_name=xxx;==
查詢語(yǔ)句改為:
==select * from table_name where state=1;==
delete from table_name,drop table table_name,truncate table table_name 區(qū)別撞蜂?
- 以上三條命令都可以刪除全表數(shù)據(jù)
- delete邏輯上是逐行刪除。數(shù)據(jù)行多侥袜,操作很慢蝌诡。并沒有真正從磁盤中刪除,只是在存儲(chǔ)層面打標(biāo)記枫吧,磁盤空間不立即釋放
- HWM高水位線不會(huì)降低
- 全表掃描和數(shù)據(jù)頁(yè)大量碎片會(huì)影響
- drop將表結(jié)構(gòu)(元數(shù)據(jù))和==數(shù)據(jù)行==
物理層次
刪除- truncate清空表==段==中的所有==數(shù)據(jù)頁(yè)==浦旱。
物理層次
刪除==全表==數(shù)據(jù),磁盤空間立即釋放九杂,HWM高水位線會(huì)降低
DQL
-
select
- select配合內(nèi)置函數(shù)使用
- select now();
- select database();
- select concat('xxx');
- select concat(user,'@',host) from mysql.user;
- select version();
- select user();
- 計(jì)算
- select 10*100;
-
查詢數(shù)據(jù)庫(kù)的參數(shù)
- select @@port;
- select @@socket;
- select @@datadir;
- select @@innodb_flush_log_at_trx_commit;
- select配合內(nèi)置函數(shù)使用
-
==select標(biāo)準(zhǔn)用法==(配合其他子句使用)
-
單表
select from 表1,表2,...... where 過濾條件1 過濾條件2 ...... group by 條件列1 條件列2 ...... select_list 列名列表 having 過濾條件1 過濾條件2 ...... order by 條件列1 條件列2 ...... limit 限制 ###where在group by之前颁湖;
having在group by+聚合函數(shù)之后,再做判斷過濾使用
- **select * from world.city where countrycode in ('CHN','USA') and population>5000000;** - ==group by 配合聚合函數(shù)使用== - ```sql select district,sum(population),count(id),group_concat(name) from world.city where countrycode='CHN' group by district; ``` - **having子句---==后過濾==** - ```sql select district,sum(population) from world.city where countrycode='CHN' group by district having sum(population)>5000000; ``` - **order by子句---排序** - ```sql select district,sum(population) from world.city where countrycode='CHN' group by district having sum(population)>5000000 order by sum(population) desc; ``` - limit子句 - 分頁(yè)顯示結(jié)果集 - ```mysql select district,sum(population) from world.city where countrycode='CHN' group by district having sum(population)>5000000 order by sum(population) desc limit 5; ###limit 2,3---前面是跳過前2行尼酿,后面是顯示3行 ###limit 3 offset 2 ```
-
-
==多表鏈接查詢==
use school student :學(xué)生表 sno: 學(xué)號(hào) sname:學(xué)生姓名 sage: 學(xué)生年齡 ssex: 學(xué)生性別 teacher :教師表 tno: 教師編號(hào) tname:教師名字 course :課程表 cno: 課程編號(hào) cname:課程名字 tno: 教師編號(hào) score :成績(jī)表 sno: 學(xué)號(hào) cno: 課程編號(hào) score:成績(jī) ###項(xiàng)目構(gòu)建 drop database school; CREATE DATABASE school CHARSET utf8; USE school CREATE TABLE student( sno INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '學(xué)號(hào)', sname VARCHAR(20) NOT NULL COMMENT '姓名', sage TINYINT UNSIGNED NOT NULL COMMENT '年齡', ssex ENUM('f','m') NOT NULL DEFAULT 'm' COMMENT '性別' )ENGINE=INNODB CHARSET=utf8; CREATE TABLE course( cno INT NOT NULL PRIMARY KEY COMMENT '課程編號(hào)', cname VARCHAR(20) NOT NULL COMMENT '課程名字', tno INT NOT NULL COMMENT '教師編號(hào)' )ENGINE=INNODB CHARSET utf8; CREATE TABLE sc ( sno INT NOT NULL COMMENT '學(xué)號(hào)', cno INT NOT NULL COMMENT '課程編號(hào)', score INT NOT NULL DEFAULT 0 COMMENT '成績(jī)' )ENGINE=INNODB CHARSET=utf8; CREATE TABLE teacher( tno INT NOT NULL PRIMARY KEY COMMENT '教師編號(hào)', tname VARCHAR(20) NOT NULL COMMENT '教師名字' )ENGINE=INNODB CHARSET utf8; INSERT INTO student(sno,sname,sage,ssex) VALUES (1,'zhang3',18,'m'); INSERT INTO student(sno,sname,sage,ssex) VALUES (2,'zhang4',18,'m'), (3,'li4',18,'m'), (4,'wang5',19,'f'); INSERT INTO student VALUES (5,'zh4',18,'m'), (6,'zhao4',18,'m'), (7,'ma6',19,'f'); INSERT INTO student(sname,sage,ssex) VALUES ('oldboy',20,'m'), ('oldgirl',20,'f'), ('oldp',25,'m'); INSERT INTO teacher(tno,tname) VALUES (101,'oldboy'), (102,'hesw'), (103,'oldguo'); DESC course; INSERT INTO course(cno,cname,tno) VALUES (1001,'linux',101), (1002,'python',102), (1003,'mysql',103); DESC sc; INSERT INTO sc(sno,cno,score) VALUES (1,1001,80), (1,1002,59), (2,1002,90), (2,1003,100), (3,1001,99), (3,1003,40), (4,1001,79), (4,1002,61), (4,1003,99), (5,1003,40), (6,1001,89), (6,1003,77), (7,1001,67), (7,1003,82), (8,1001,70), (9,1003,80), (10,1003,96); SELECT * FROM student; SELECT * FROM teacher; SELECT * FROM course; SELECT * FROM sc; ### 統(tǒng)計(jì)zhang3,學(xué)習(xí)了幾門課 SELECT st.sno,st.sname , COUNT(sc.cno) FROM student AS st JOIN sc ON st.sno=sc.sno WHERE st.sname='zhang3' group by st.sno,st.sname; ### 查詢zhang3,學(xué)習(xí)的課程名稱有哪些(這個(gè)是先join再過濾爷狈,但是內(nèi)連接的驅(qū)動(dòng)表由優(yōu)化器決定) SELECT st.sno,st.sname , group_concat(course.cname) FROM student AS st JOIN sc ON st.sno=sc.sno join course on sc.cno=course.cno WHERE st.sname='zhang3' group by st.sno,st.sname; #### 優(yōu)化上一條sql語(yǔ)句(驅(qū)動(dòng)表student,先過濾裳擎,再left join) SELECT st.sno,st.sname , group_concat(course.cname) FROM student AS st left JOIN sc ON st.sno=sc.sno join course on sc.cno=course.cno WHERE st.sname='zhang3' group by st.sno,st.sname; ### http://www.reibang.com/p/08c4b78402ff
-
笛卡爾乘積- select * from teacher ,course;
- select * from teacher join course;
-
==內(nèi)連接==
==select * from teacher join course on teacher.tno=course.tno;==
A join B
? on A.xxx=B.yyy
-
外連接
- left join:左表所有數(shù)據(jù)涎永,右表滿足條件的數(shù)據(jù)
- right join:右表所有數(shù)據(jù),左表滿足條件的數(shù)據(jù)
聚合函數(shù)
max() min() avg() count() sum() group_concat()---列轉(zhuǎn)行
將結(jié)果集小的表(是針對(duì)整個(gè)語(yǔ)句)設(shè)置為驅(qū)動(dòng)表更加合適,可以降低next loop的次數(shù)
對(duì)于內(nèi)連接來講羡微,我們是沒法控制驅(qū)動(dòng)表是誰(shuí)谷饿,完全由優(yōu)化器決定
如果,需要人為干預(yù)妈倔,需要將內(nèi)連接改為外連接
-
select別名---as
-
列別名
- 可以定制顯示的列名
- 可以在having博投,order by子句中調(diào)用
- 表別名
- 全局調(diào)用定義的別名
-
列別名
select的去重---distinct
-
select的union 和union all
聚合兩個(gè)結(jié)果集
union去重聚合的兩個(gè)結(jié)果集
select * from world.city where countrycode='CHN' union all select * from world.city where countrycode='USA'; ###上面的sql語(yǔ)句比下面的語(yǔ)句效率好 select * from world.city where countrycode in ('CHN','USA'); select * from world.city where countrycode='CHN' or countrycode='USA';
-
show---mysql獨(dú)有的
-
==show variables;==
- 顯示mysql中所有的參數(shù)信息
==show variables like '%trx%'==
help show; show databases; show tables; ### show tables from database_name; show processlist; show full processlist; show charset; show collation; show engines; show privileges; show grants for ...... show create database ...... show create table ...... show index from ...... show engine innodb status; show status; show status like '%xxx%'; show variables; show variables '%xxx%'; show binary logs; show binlog events in show master status show slave status; show relaylog events in
-
第五天
==元數(shù)據(jù)==
表(邏輯表)
-
數(shù)據(jù)字典:表中列的定義信息(元數(shù)據(jù))
- myisam:xxx.frm
-
innodb
- 8.0之前:xxx.frm+ibdata1
- 8.0之后:xxx.frm
- 數(shù)據(jù)行記錄(真實(shí)數(shù)據(jù))
- myisam:xxx.myd
- innodb:xxx.ibd
- 索引(真實(shí)數(shù)據(jù))
- myisam:xxx.myi
- innodb:xxx.ibd
- 數(shù)據(jù)庫(kù)狀態(tài)
- mysql庫(kù)
- ==I_S==---information_schema:視圖
- 可以查詢數(shù)據(jù)字典、數(shù)據(jù)庫(kù)狀態(tài)盯蝴、權(quán)限
- 放在內(nèi)存中的(內(nèi)存庫(kù))
- P_S
- SYS庫(kù)
- 權(quán)限(元數(shù)據(jù))
- mysql.user
- mysql.db
- mysql.table
- mysql.column
- ......
- 日志:專門日志文件
I_S--內(nèi)存庫(kù)
每次數(shù)據(jù)庫(kù)啟動(dòng)毅哗,會(huì)自動(dòng)在內(nèi)存中生成I_S,生成查詢mysql部分元數(shù)據(jù)信息==視圖==捧挺。
I_S中的視圖虑绵,保存的是查詢?cè)獢?shù)據(jù)的方法,不保存數(shù)據(jù)本身
create view v_select as
select district,sum(population)
from world.city
where countrycode='CHN'
group by district
having sum(population)>5000000
order by sum(population) desc
limit 5;
select * from v_select;
use information_schema;
show tables;
# tables是個(gè)表(I_S)
desc tables闽烙;
I_S.tables---內(nèi)存表
==保存了所有表的數(shù)據(jù)字典信息==翅睛,是個(gè)視圖(內(nèi)存中的表),有如下字段(僅介紹部分---常用的):
- TABLE_SCHEMA:表所在的庫(kù)
- TABLE_NAME:表名
- ENGINE:表的引擎
- TABLE_ROWS:表的數(shù)據(jù)行(不是實(shí)時(shí)的值)
- AVG_ROW_LENGTH:平均行長(zhǎng)度
- DATA_LENGTH:表使用的存儲(chǔ)空間大泻诰骸(不是實(shí)時(shí)的值)
- INDEX_LENGTH:表中索引占用空間大小
- DATA_FREE:表中是否有碎片
### 數(shù)據(jù)庫(kù)資產(chǎn)統(tǒng)計(jì)
#### 一捕发、統(tǒng)計(jì)每個(gè)庫(kù)下的所有表的個(gè)數(shù),表名列表
select table_schema,count(table_name),group_concat(table_name)
from information_schema.tables
group by table_schema;
#### 二很魂、統(tǒng)計(jì)每個(gè)庫(kù)的占用空間總大小
##### 1.一張表的大小=AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH
##### 2.一張表的大小=DATA_LENGTH
##### 單位是B(字節(jié))
select table_schema,sum(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)
from information_schema.tables
group by table_schema;
#### 三扎酷、查詢業(yè)務(wù)數(shù)據(jù)庫(kù)(系統(tǒng)庫(kù)除外),所有非innodb表
##### 系統(tǒng)庫(kù):information_schema莫换,mysql霞玄,performance_schema,sys
select table_schema,table_name
from information_schema.tables
where engine!='InnoDB'
and table_schema not in ('sys','performance_schema','information_schema','mysql');
#### 四拉岁、查詢業(yè)務(wù)數(shù)據(jù)庫(kù)(系統(tǒng)庫(kù)除外)坷剧,所有非innodb表。將非innodb表改為innodb表
select concat('alter table ',table_schema,'.',table_name,' engine=innodb;')
from information_schema.tables
where engine!='InnoDB'
and table_schema not in ('sys','performance_schema','information_schema','mysql')
into outfile '/tmp/alter.sql';
##### 需要在/etc/my.cnf的[mysqld]中添加secure-file-priv=/tmp喊暖,然后重啟數(shù)據(jù)庫(kù)
cat > /etc/my.cnf <<EOF
[mysqld]
secure-file-priv=/tmp
user=mysql
basedir=/app/databae/mysql
datadir=/data/3306
server_id=6
port=3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
EOF
一些練習(xí)
### 1.查詢oldguo老師教的學(xué)生名.
SELECT concat(te.tname,'_',te.tno) ,GROUP_CONCAT(st.sname)
FROM teacher AS te
JOIN course
ON te.tno=course.tno
JOIN sc
ON course.cno=sc.cno
JOIN student AS st
ON sc.sno=st.sno
WHERE te.tname='oldguo'
group by te.tno,te.tname;
### 2.查詢oldguo所教課程的平均分?jǐn)?shù)
SELECT concat(te.tname,'_',te.tno,'_',course.cname,'_',course,cno) ,avg(sc.score)
FROM teacher AS te
JOIN course
ON te.tno=course.tno
JOIN sc
ON course.cno=sc.cno
WHERE te.tname='oldguo'
group by te.tno,te.tname,course.cno;
### 3.每位老師所教課程的平均分,并按平均分排序
SELECT concat(te.tname,'_',te.tno,'_',course.cname,'_',course,cno) ,avg(sc.score)
FROM teacher AS te
JOIN course
ON te.tno=course.tno
JOIN sc
ON course.cno=sc.cno
group by te.tno,te.tname,course.cno
order by avg(sc.score) desc;
### 4.查詢oldguo所教的不及格的學(xué)生姓名
SELECT concat(te.tname,'_',te.tno),group_concat(concat(st.sname,':',st.score))
FROM teacher AS te
JOIN course
ON te.tno=course.tno
JOIN sc
ON course.cno=sc.cno
JOIN student AS st
ON sc.sno=st.sno
where te.tname='oldguo' and sc.score<60
group by te.tno,te.tname;
### 5.查詢所有老師所教學(xué)生不及格的信息
SELECT concat(te.tname,'_',te.tno),group_concat(concat(st.sname,':',st.score))
FROM teacher AS te
JOIN course
ON te.tno=course.tno
JOIN sc
ON course.cno=sc.cno
JOIN student AS st
ON sc.sno=st.sno
where sc.score<60
group by te.tno,te.tname;
### 6.查詢平均成績(jī)大于60分的同學(xué)的學(xué)號(hào)和平均成績(jī)
select sc.sno,avg(sc.score)
from sc
group by sc.sno
having avg(sc.score)>60;
### 7.查詢所有同學(xué)的學(xué)號(hào)惫企、姓名、選課數(shù)陵叽、總成績(jī)
select st.sno,st.sname,count(sc.cno),sum(sc.score)
from student as st
join sc
on st.sno=sc.sno
group by st.sno,st.sname;
### 8.查詢各科成績(jī)最高和最低的分:以如下形式顯示:課程ID狞尔,最高分,最低分
select sc.cno,max(sc.score),min(sc.score)
from sc
group by sc.cno;
### 9.統(tǒng)計(jì)各位老師,所教課程的及格率
SELECT concat(te.tname,'_',te.tno,'_',course.cname,'_',course,cno) ,concat(count(case when sc.score>60 then 1 end)/count(sc.score)*100,'%') as '及格率'
FROM teacher AS te
JOIN course
ON te.tno=course.tno
JOIN sc
ON course.cno=sc.cno
group by te.tno,te.tname,course.cno;
### 10.查詢每門課程被選修的學(xué)生數(shù)
### 11.查詢出只選修了一門課程的全部學(xué)生的學(xué)號(hào)和姓名
### 12.查詢選修課程門數(shù)超過1門的學(xué)生信息
### 13.統(tǒng)計(jì)每門課程:優(yōu)秀(85分以上),良好(70-85),一般(60-70),不及格(小于60)的學(xué)生列表
select course.cname,
group_concat(case sc.score>85 then st.sname end) as '優(yōu)秀',
group_concat(case sc.score>70 and sc.score<=85 then st.sname end) as '良好',
group_concat(case sc.score>60 and sc.score<=70 then st.sname end) as '一般',
group_concat(case sc.score<60 then st.sname end) as '不及格'
from course
join sc
on course.cno=sc.cno
join student as st
on sc.sno=st.sno
group by course.cname;
### 14.查詢平均成績(jī)大于85的所有學(xué)生的學(xué)號(hào)巩掺、姓名和平均成績(jī)