centos 7 yum 源 [mariadb] name = MariaDB baseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.3.14/yum/centos7-amd64/ gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck= 0 安裝 yum -y install mariadb-server ./scripts/mysql_install_db --datadir=path --defaults-file=name --user=user_name 在其上層目錄執行初始化數據庫 cp ./suport-files/mysql.server /etc/rc.d/init.d/mysqld mysql_secure_installation 刪除匿名用戶 啓動 yum安裝 使用 systemctl mariadb centos 6 yum源 https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.3.14/yum/centos6-amd64/ CentOS 6 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo或者 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo CentOS 7 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo或者 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum安裝後改變數據目錄 cp /usr/share/mysql/my-huge.cnf /etc/my.cnf vim /etc/my.cnf 修改數據目錄及sockt ,必須項 chown -R mysql.mysql /data/mysql mysql_install_db --datadir=/data/mysql --user=mysql 配置文件須要的配置項 server-id = 1 skip-networking=1 #禁止網絡鏈接的 character-set-server=utf8mb4 # 設置字符集 innodb_file_per_table=ON #數據庫分開存放 log_queries_not_using_indexes=on # 查詢未使用索引記錄 skip_name_resolve=on #禁止主機名解析 #二進制日誌啓用 log_bin=/path/mysqlbin/master #默認sql_log_bin 開啓 若是log_bin未開啓,沒有日誌產生 innodb_log_group_home_dir= #事務日誌目錄到其餘目錄 innodb_log_file_size= #日誌大小 log_bin_basename=/var/lib/mysql/mysql-bin #日誌的基本文件名及目錄 log_bin_index=/var/lib/mysql/mysql-bin.index #管理全部binlog文件的目錄 log_error=/var/log/mariadb/mariadb.error sql_safe_updates 置爲1時,update:要有where,並查詢條件必須使用爲索引字段,或者使用limit,或者兩個條件同時存在,才能正常執行。delete:where條件中帶有索引字段可刪除,where中查詢條件不是索引,得必須有limit。主要是防止update和deLete沒有使用索引致使變動及刪除大量數據。參數默認值爲0 set global sql_safe_updates = 1 ############################################ 推薦的配置選項: 硬件:內存32G innodb_file_per_table = 1 #獨立表空間 max_connections = 8000 #MySQL 服務所容許的同時會話數的上限,常常出現Too Many Connections的錯誤提示,則須要增大此值 back_log = 300 #back_log 是操做系統在監聽隊列中所能保持的鏈接數 max_connect_errors = 1000 #每一個客戶端鏈接最大的錯誤容許數量,當超過該次數,MYSQL服務器將禁止此主機的鏈接請求,直到MYSQL服務器重啓或經過flush hosts命令清空此主機的相關信息 open_files_limit = 10240 #全部線程所打開表的數量 max_allowed_packet = 32M #每一個鏈接傳輸數據大小.最大1G,須是1024的倍數,通常設爲最大的BLOB的值 wait_timeout = 10 #指定一個請求的最大鏈接時間 sort_buffer_size = 16M # 排序緩衝被用來處理相似ORDER BY以及GROUP BY隊列所引發的排序 join_buffer_size = 16M #不帶索引的全表掃描.使用的buffer的最小值 query_cache_size = 128M #查詢緩衝大小 query_cache_limit = 4M #指定單個查詢可以使用的緩衝區大小,缺省爲1M transaction_isolation = REPEATABLE-READ # 設定默認的事務隔離級別 thread_stack = 512K # 線程使用的堆大小. 此值限制內存中能處理的存儲過程的遞歸深度和SQL語句複雜性,此容量的內存在每次鏈接時被預留. log-bin # 二進制日誌功能 binlog_format=row #二進制日誌格式 innodb_buffer_pool_size = 24G #InnoDB使用一個緩衝池來保存索引和原始數據, 可設置這個變量到物理內存大小的80% innodb_file_io_threads = 4 #用來同步IO操做的IO線程的數量 innodb_thread_concurrency = 16 #在InnoDb核心內的容許線程數量,建議的設置是CPU數量加上磁盤數量的兩倍 innodb_log_buffer_size = 16M # 用來緩衝日誌數據的緩衝區的大小 innodb_log_file_size = 512M #在日誌組中每一個日誌文件的大小 innodb_log_files_in_group = 3 # 在日誌組中的文件總數 innodb_lock_wait_timeout = 120 # SQL語句在被回滾前,InnoDB事務等待InnoDB行鎖的時間 long_query_time = 2 #慢查詢時長 log-queries-not-using-indexes #將沒有使用索引的查詢也記錄下來
數據庫查詢原理:mysql
客戶端同數據庫服務層創建TCP鏈接,鏈接管理模塊會創建鏈接,並請求一個鏈接線程。若是鏈接池中有空閒的鏈接線程,則分配給這個鏈接,若是沒有,在沒有超過最大鏈接數的狀況下,建立新的鏈接線程負責這個客戶端。 在真正的操做以前,還須要調用用戶模塊進行受權檢查,來驗證用戶是否有權限。經過後,方纔提供服務,鏈接線程開始接收並處理來自客戶端的SQL語句。 鏈接線程接收到SQL語句以後,將語句交給SQL語句解析模塊進行語法分析和語義分析。 若是是一個查詢語句,則能夠先看查詢緩存中是否有結果,若是有結果能夠直接返回給客戶端。
交互式客戶端須要 ;
非交互 不用帶 ;
二進制程序的解壓縮的固定解壓目錄 /usr/local
客戶端命令
服務器端命令
鏈接數據庫
/usr/bin/mysqld_safe & 非rpm 安裝服務啓動
鏈接數據庫
mysql -uroot -p xxx
mysql -uroot -D test -p xx -D 指定數據庫名稱
mysql -u root -p -S /var/lib/mysql/mysql.sock
mysql -u -p -h ip -P 端口
數據庫經常使用選項面試
若是查詢緩存中沒有結果,就須要真的查詢數據庫引擎層了,因而發給SQL優化器,進行查詢的優化。若是是表變動,則分別交給insert、update、delete、create、alter處理模塊進行處理。 接下來就是請求數據庫引擎層,打開表,若是須要的話獲取相應的鎖。 接下來的處理過程就到了數據庫引擎層,例如InnoDB。 在數據庫引擎層,要先查詢緩存頁中有沒有相應的數據,若是有則能夠直接返回,若是沒有就要從磁盤上去讀取。 當在磁盤中找到相應的數據以後,則會加載到緩存中來,從而使得後面的查詢更加高效,因爲內存有限,多采用變通的LRU表來管理緩存頁,保證緩存的都是常常訪問的數據。 獲取數據後返回給客戶端,關閉鏈接,釋放鏈接線程,過程結束
變量:
系統 : mysql 運行過程的環境屬性
全局:global variables 做用域爲整個服務器
會話級別: session 做用域爲當前會話
狀態變量: 運行過程狀態信息sql
show global variables \G ;
--- like "%version%" 版本相關
---- where varliable_name like "character%"
like "%log%" and value = "of"
show session valiables \G;
select @@[global.|session.]system_var_name
select @@global.pid_file
select @@session.warning_count;
數據庫
用戶管理
user@host
host ip 或主機名
_ 任意單個字符
%任意長度任意字符
use mysql
create 「user」@‘host’
insert into mysql.user(user,host,password) values('xxxx','192.168.%.%',password('11111'));
受權數據庫時,對應用戶不存在,以下語句MySQl自動建立用戶
grant all on database.* to xxx@127.0.0.1 identified by 'dddddd';
刪除用戶
delete from mysql.user where user="tee" and host="localhost"
若是某些權限已經授予該用戶,刪除用戶其權限依舊保留,當子啊次建立用戶時,會報錯
解決:刪除殘留權限,使用flush privileges ,或使用drop user 同時刪除用戶及權限vim
重命名
rename user oldname to newname
重命名後密碼及權限不會發生改變centos
修改密碼
mysqladmin -uroot -p123 password 33333
set password for "user"@'ip host' =passwpord('password')
update mysql.user set password=password(""), where lclause ;
update mysql.user set password =password(' sss') where user='' and host="";緩存
drop user 'xx'@'loaclhost '
密碼忘記
mysql_safe --skip-grant-tables &
更改密碼後flush privileges ;
重啓安全
受權服務器
GRANT ALL [PRIVILEGES] ON db.tbl TO 'username'@'host' IDENTIFIED BY 'password';
grant all on zsythink. to zsy@127.0.0.1 identified by 'zsythink'; 省略 privileges
grant all privileges on zsythink. to zsy@'192.168.%.%' identified by 'zsythink'; 縮小權限
flush privileges ;網絡
字段受權
grant select (name,age) on xxx.students to cccc@localhost;
grant execute on function zsythink.test to zsy@'192.168.%.%';執行函數權限受權
procedure 過程
用戶可否將已有權限受權給其餘人取決於用戶是否有grant 權限
grant select on zsythink.* to zsy@'192.168.%.%' with grant option;
查看受權
show grants for user;
show grants for zzz@'iphost';
select * from mysql.db where Db="你要查看的數據庫"\G;
移除權限
revoke "要移除的權限" on 數據庫.表 from 用戶@host;
if not exists :不存在時才建立
show caharacter set ;
show collation ;
create database if not exists testdb default character set utf16;
show create databses testdb ;
修改
刪除
drop [database | schema] [if exists ] db_name
表管理
show table satus \G;
like ' ttttt'
表結構
desc table_name
show create table table_name
rm -rf .[^.]* 刪除隱藏文件,由於建立家目錄時複製了/etc/skel模板 隱藏文件,不要使用userad -m
啓動, 二進制安裝 ,包帶有架構名稱x86_64(源碼不帶) ,使用service
設置安全腳本 mysql_secure_installation
mysqladmin password centos
mysqladmin -u root -p psw passwdord centos
mysqladmin -u root -pcentos ping 檢測數據庫是否存活
mysqladmin -u root -p pswor shutdown
源碼編譯
裝必須包
建立用戶,useradd –r –s /sbin/nologin –d /data/mysql/ mysq
使用-m 會在家目錄複製模板文件到-d 指定的目錄
數據目錄,
目錄更改屬組主,解壓cmke
1,修改PATH變量
生成數據庫 /scripts /mysql_install_db 在上一層目錄執行
複製my.cnf
添加 datadir=
源碼編譯
maraidb 源碼編譯 報錯openssl yum -u install openssl-devel 編譯選項 cmake . -DCMAKE_INSTALL_PREFIX=/app/mysql -DMYSQL_DATADIR=/data/mysql/ -DSYSCONFDIR=/etc/mysql -DMYSQL_USER=mysql -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITHOUT_MROONGA_STORAGE_ENGINE=1 -DWITH_DEBUG=0 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DENABLED_LOCAL_INFILE=1 -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci make make install 308 cd /app/mysql/ 309 ll 310 scripts/mysql_install_db --datadir=/data/mysql --user=mysql 311 PATH=/app/mysql/bin:$PATH 312 cp support-files/mysql.server /etc/init.d/mysqld 313 ls -al /etc/init.d/mysqld 314 rm /etc/init.d/mysqld 315 cp support-files/mysql.server /etc/init.d/mysqld 316 ls /etc/init.d/mysqld 317 ls -al /etc/init.d/mysqld 318 cp support-files/my-huge.cnf /etc/my.cnf 319 vim /etc/my.cnf 添加數據目錄datadir=/data/mysql 320 echo $PATH 321 ll 322 chkconfig --add mysqld 323 service mysqld start 324 mysql 325 history
cp /app/mysql/support-files/my-huge.cnf /etc/mysql/my.cnf ppt 錯誤
多實例數據庫;一個物理機上裝一個軟件多個實例或多版本並存(測試環境使用)
yum安裝下多實例
多實例多端口)
此架構可多版本多實例
rm -rf /var/lib/mysql/* (yum安裝默認用戶數據庫,清除口令文件目錄)
mkdir /mysql/{3306,3307,3308}/{data,etc,socket,bin,log,pid} -pv 生成獨立目錄
chown -R mysql.mysql /mysql
生成數據庫
mysql_install_db --user=mysql --datadir=/mysql/3306/data
複製配置文件 my.cnf 修改
datadir=
socket=。。。。 /socket/mysql.socksq
port=
日誌文件
啓動服務腳本(本身編寫的)放入bin下加執行權限
鏈接使用端口號
mysql -uroot -p -P 3306 -S /mysql/3306/socket/mysql.sock
建立數據庫後查看
system ls /mysql/3306/data
! ls -l /mysql/3307/data
關閉服務 腳本 stop 腳本使用mysqladmin 要求密碼關閉
當以 localhost 鏈接時(不指定-h時默認爲localhost),MySQL 是經過 Unix Socket(而不是 TCP) 鏈接。此時指定的端口被忽略
修改配置文件
vim /etc/my.cnf
[client]
protocol = TCP
或指定sock 鏈接
mysqladmin -S /mysql/3306/socket/mysql.sock -uroot password centos (啓動服務下修改)
啓動腳本/mysql/bin/mysqld 修改口令,關閉服務/啓動不須要密碼
mysqd_multi 多實例(同一版本下
二進制安裝多實例
刪除匿名用戶 mysql_secure_install
搜索 表名區分爲大小寫,字段不區分
修改字符集 排序規則 set charavter utf8mb4
建表 字符差異大 使用vchar
數據老版本默認存放 idbdata
高版本 表名.ibd 數據
表名.frm 表結構 ?????
刪除表 drop table
show table status like "table" \G ; 表結構豎着顯示
show table status from databasename \G ;
複合主鍵 prinmary key (id , name )
參考現有表結構建立表
克隆表結構 create table lll like base.table
show warning ;
show create table table;看字符集
alter table tab character set (表改了可是字符段字符集未改變)
建立數據庫時指定字符集
在實例級別指定字符集
/etc/3308/etc/mysql.cnf
character-set-server=utf8mb4
客戶端
mysql -uroot -p -S --defaule-character-set =utg8mb4 -U
加 U 安全更改模式,更新時沒有where不成功
修改/etc/mysql.d/mysql.clinet.cnf 加入 --safe-updates
導入
insert db1,tab select * from db2.table
truncate table 清除表內容,表結構還在 同時刪除了日誌
查詢不用正則
count 查詢非空的,使用 *
select 後接 分組 或聚合函數
先分組再過濾
select gender 性別 ,count(*) 數量 from students group by gender having gender = "M" ;
where 後在group
左右鏈接
視圖隱藏信息
會話變量 當前有效
函數體局部變量 declare
遠程客戶端登錄慢是由於對ip作名稱解析,應關閉
配置文件添加
skip_name_reslove=1
show variables like "skip_name_resolve" \G;
併發鏈接數
show variables like "max_con%" \G;
ariable_name: max_connections
Value: 151
set globel max_connections =1111;
show status like "com_sele%" \G;
*************************** 1. row ***************************
Variable_name: Com_select
Value: 3
口令
set password for ''@'' =password('');
update user set password=passowrd('') where user= "";
改表用戶口令不能當即生效, flush privileges;
忘記密碼
my.conf
[mysqld]
skip-grant-tables
skip-networking
重啓登錄(此時其餘用戶無限制可登錄)
設置權限後退出從新登錄
存儲引擎區別面試
myisam centos6 默認
修改默認值 配置文件
show variables like "%engin%" \G;
Variable_name: default_storage_engine
Value: InnoDB
innodb, 5.6 5.7 版本默認引擎
建立表時指定存儲引擎
show table status from mysql \G;
mvcc :多個用戶併發訪問同時不干擾
以事件id爲基礎
備份mysql數據庫
mysqld -- 選項
變量使用show variables
變量修改永久保存
提高查詢效率 緩存起來
select 執行命令hash運算儲存起來,佔內存
多個空格緩存失效,
驗證工做:
索引 查看索引是否生效,查詢時間
btree
dml可撤銷
ddl直接提交,沒法撤銷
修改非自動提交
set autocommit=off
事務隔離級別
選項與變量
可重複讀,緩存(實驗下)
幻讀
show processlist; (某人啓用寫鎖,致使其餘人沒法查看)
kill 3 (用戶id)
日誌存放在其餘位置(io較好)
調整日誌大小
配置文件中變量和選項 區別
慢查詢 !開啓
閾值
不利用索引就記錄log_queries_not_using_indexes=ON
bin -log 記錄格式 基於 語句/行
建議行 至少mixed
二進制不會被自動刪除,只記錄提交的事務。
分庫 innodb_file_per_table 10版本以上默認開啓
sql_log_bin=ON 會話級別 服務器不停服啓用,須要中止二進制日誌記錄時能夠關閉該變量
log_bin=/path/to/logbin 服務器選項在配置文件內修改 ,
max_binlog_size=250M
sync_binlog=0 =1
#控制數據庫的binlog刷到磁盤上去,
#默認,sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系統本身控制它的緩存的刷新。這時候的性能是最好的,可是風險也是最大的。由於一旦系統Crash,在binlog_cache中的全部binlog信息都會被丟失。
若是sync_binlog>0,表示每sync_binlog次事務提交,MySQL調用文件系統的刷新操做將緩存刷下去。最安全的就是sync_binlog=1了,表示每次事務提交,MySQL都會把binlog刷下去,是最安全可是性能損耗最大的設置。這樣的話,在數據庫所在的主機操做系統損壞或者忽然掉電的狀況下,系統纔有可能丟失1個事務的數據。可是binlog雖然是順序IO,可是設置sync_binlog=1,多個事務同時提交,一樣很大的影響MySQL和IO性能。雖然能夠經過group commit的補丁緩解,可是刷新的頻率太高對IO的影響也很是大。對於高併發事務的系統來講,「sync_binlog」設置爲0和設置爲1的系統寫入性能差距可能高達5倍甚至更多。
因此不少MySQL DBA設置的sync_binlog並非最安全的1,而是100或者是0。這樣犧牲必定的一致性,能夠得到更高的併發和性能
expire_logs_days=N 自動刪除日誌的天數
備份以後先測試還原:還原備份步驟及策略:
測試:打包壓縮時是否能夠操作
備份單庫的表,而後導入測試
mysqldump -B 備份數據庫結構(數據庫結構及表結構)
還原日誌
清除日誌 reset master
set sql_log_bin=off
--master-data[=#] 區別實驗:沒有主從複製設置爲2,有設置爲
分別備份每一個庫到每一個文件
不要加flush tables with read lock ,從庫無發覆制
主從結構,start slave 後,從機關閉後,再開啓時子線程自動開啓(io線程及sql線程)
reset slave 許要先中止線程,stop slave
從庫啓動異常,reset slave all 從新開始復:查看主庫二進制目前位置,從新配置鏈接信息
因爲主鍵衝突致使報錯,能夠跳過錯誤 (數據可繼續複製,主鍵不一樣)
set global sql_slave_skip_counter=
提高從服務器爲主節點
肯定從服務器更新的最新:
Master_Log_File: master-bin.000007
Read_Master_Log_Pos: 764
Exec_Master_Log_Pos: 764
操作(選擇的從服務器):
開啓二進制日誌 (基於行):log_bin =
節點建立用戶,
另外一從節點:新主節點建立徹底備份,從節點清除數據,從新恢復數據,配置鏈接信息
級聯複製(中間服務器)
log_bin =
log_slave_updates (將寫入中繼日誌的語句同時寫入到bin日誌中
主主複製
半同步複製:
超時時長:同步未成功
DDL: Data Defination Language 數據定義語言CREATE,DROP,ALTER
DML: Data Manipulation Language 數據操縱語言INSERT,DELETE,UPDATE
DCL:Data Control Language 數據控制語言GRANT,REVOKE,COMMIT,ROLLBACK
DQL:Data Query Language 數據查詢語言SELECT
建立數據庫:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';
CHARACTER SET 'character set name’ COLLATE 'collate name'
show create database test ;查看字符集
ALTER DATABASE DB_NAME character set utf8;
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';
show character set ;
show collation ; 排序規則
CREATE DATABASE zabbix CHARACTER SET utf8;
show create database test ;
建立表:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name[(create_definition,...)] [table_options][partition_options] select_statement
查詢現存表建立;新表插入查詢數據,可是目錄結構有關選項不會繼承。
create table t12 select * from toc ;
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }
複製現有表的表結構:
create table t13 like coc ;
查看建立的表的數據引擎及字符集
show create table t13;
CREATE TABLE [IF NOT EXISTS] ‘tbl_name’
(col1 type1 修飾符, col2type2 修飾符, ...)
show create table coc ;
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
字段信息:
• col type1
• PRIMARY KEY(col1,...)
• INDEX(col1, ...)
• UNIQUE KEY(col1, ...)
列名 數據類型 修飾符
修飾符 全部類型適用:
• NULL 數據列可包含NULL值
• NOT NULL 數據列不容許包含NULL值
• DEFAULT 默認值
• PRIMARY KEY 主鍵
• UNIQUE KEY 惟一鍵
• CHARACTER SET name 指定一個字符集
適用於數值型
• AUTO_INCREMENT 自動遞增,適用於整數類型
• UNSIGNED 無符號
示例:
CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY
KEY,name VARCHAR(20)NOT NULL,age tinyint UNSIGNED);
CREATE TABLE students2 (id int UNSIGNED NOT NULL ,name
VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));
表操做:
SHOW ENGINES
SHOW TABLES [FROM db_name]
DESC [db_name.]tb_name
SHOW COLUMNS FROM [db_name.]tb_name
DROP TABLE [IF EXISTS] tb_name
show table status like 'coc' \G; (表狀態查詢)
SHOW TABLE STATUS FROM db_name (數據庫中全部表的狀態)
修改表:
ALTER TABLE 'tbl_name'
字段:
添加字段:add
ADD col1 data_type [FIRST|AFTER col_name]
刪除字段:drop
修改字段:
alter(默認值), change(字段名), modify(字段屬性)
索引:
添加索引:add index
刪除索引:drop index
查看錶上索引: SHOW INDEXES FROM 666[db_name.]tbl_name;
示例: ALTER TABLE students RENAME s1; ALTER TABLE s1 ADD phone varchar(11) AFTER name; ALTER TABLE s1 MODIFY phone int; ALTER TABLE s1 CHANGE COLUMN phone mobile char(11); ALTER TABLE s1 DROP COLUMN mobile; ALTER TABLE s1 character set utf8; ALTER TABLE s1 change name name varchar(20) character set utf8; ALTER TABLE students ADD gender ENUM('m','f') ALETR TABLE students CHANGE id sid int UNSIGNED NOT NULL PRIMARY KEY; ALTER TABLE students drop primary key ; ALTER TABLE students ADD UNIQUE KEY(name); ALTER TABLE students ADD INDEX(age); ALTER TABLE students drop primary key ; DESC students; SHOW INDEXES FROM students; ALTER TABLE students DROP age;
DML: insert delete update
insert
INSERT tbl_name [(col1,...)] VALUES (val1,...), (val21,...)
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
update : 要添加限制條件
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
delete: 限制條件,否則刪除全部 :limit where DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
DQL
select 語句
Select 以後是逗號分隔列或星號(*)的列表,表示要返回全部列。
From 指定要查詢數據的表或視圖。
Join 根據某些鏈接條件從其餘表中獲取數據。
Where 篩選條件,過濾結果集中的行。
Group By 將一組行組合成小分組,並對每一個小分組應用聚合函數。
Having 過濾器基於Group By子句定義的小分組。
Order By 指定用於排序的列的列表。
Limit 限制返回行的數量。
字段使用別名 cols AS alias col2 as alias
where 過濾選項與條件
過濾條件:布爾型表達式
算術操做符:+, -, *, /, %
比較操做符:=,<=>(相等或都爲空), <>, !=(非標準SQL), >, >=, <, <=
BETWEEN min_num AND max_num
IN (element1, element2, ...)
IS NULL
IS NOT NULL
like
% 任意長度任意字符
_ 任意單個字符
邏輯操做符
NOT
AND
OR
XOR
GROUP:根據指定的條件把查詢結果進行「分組」以用於作「聚合」運算 avg(), max(), min(), count(), sum() HAVING: 對分組聚合運算後的結果指定過濾條件 ORDER BY: 根據指定的字段對查詢結果進行排序升序:ASC降序:DESC LIMIT [[offset,]row_count]:對查詢的結果進行輸出行數數量限制 對查詢結果中的數據請求施加「鎖」 FOR UPDATE: 寫鎖,獨佔或排它鎖,只有一個讀和寫 LOCK IN SHARE MODE: 讀鎖,共享鎖,同時多個讀
多表查詢; union 子查詢
例子:
select * from classes join students using (classid) ;
select * from classes join students using (classid) where teacherid is not null ;
select * from employees where birth_date > '1957-05-23' order by birth_date limit 30 ;
select * from employees where month(birth_date)=7 limit 30 ;( 函數to_days )
select * from employees order by rand() limit 30 ; 隨機取記錄
select distinct title from titles limit 10 ; 清除重複記錄
count () :
count(*)計算全部,NULL也要
count(數據列名稱),NULL值不計算在內
視圖: 虛表 ,保存現有實表的查詢
CREATE VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
SHOW CREATE VIEW view_name
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
視圖中的數據事實上存儲於「基表」中,所以,其修改操做也會針對基表實現;
其修改操做受基表限制
自定義函數:
存儲過程:
觸發器:
用戶權限管理: 元數據表 MySQL
建立用戶,默認有usage 權限
CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];
RENAME USER old_user_name TO new_user_name;
DROP USER 'USERNAME'@'HOST‘
DROP USER ''@'localhost'; 刪除空帳號
修改密碼的方法:
mysql>SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
mysql>UPDATE mysql.user SET password=PASSWORD('password')
WHERE clause; 需flush privileges 生效
忘記管理員密碼:
啓動mysqld 時
配置文件裏添加以下,重啓服務
skip-grant-tables
skip-networking
管理類權限:
CREATE TEMPORARY TABLES
CREATE USER
FILE
SUPER
SHOW DATABASES
RELOAD
SHUTDOWN
REPLICATION SLAVE
REPLICATION CLIENT
LOCK TABLES
PROCESS
程序類權限: FUNCTION、PROCEDURE、TRIGGER
CREATE
ALTER
DROP
EXCUTE
庫和表級別:DATABASE、TABLE
ALTER
CREATE
CREATE VIEW
DROP
INDEX
SHOW VIEW
GRANT OPTION:能將本身得到的權限轉贈給其餘用戶
數據操作
SELECT
INSERT
DELETE
UPDATE
字段級別
SELECT(col1,col2,...)
UPDATE(col1,col2,...)
INSERT(col1,col2,...)
全部權限
ALL PRIVILEGES 或 ALL
受權:
GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host'
[IDENTIFIED BY 'password'] [WITH GRANT OPTION];
with_option: GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
回收: REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ... flush privileges 刷新權限