前言:Mysql資料庫,知識非常的多,要想學精學通這塊知識,估計也要花費和學linux一樣的精力和時間。小編也是只會些毛皮,給大家分享一下~ 一、MySQL安裝 (1)安裝方式: 1 、程式包yum安裝,下實驗一 優點:安裝快,簡單 缺點:定死了各個文件的地方,太死板 2 、二進位格式的程式包:展開 ...
前言:Mysql資料庫,知識非常的多,要想學精學通這塊知識,估計也要花費和學linux一樣的精力和時間。小編也是只會些毛皮,給大家分享一下~
一、MySQL安裝
(1)安裝方式:
優點:安裝快,簡單
缺點:定死了各個文件的地方,太死板
2 、二進位格式的程式包:展開至特定路徑,並經過簡單配置後即可使用(推薦),下實驗二
(2)mysql 的程式組成:
ip socket: 監聽在tcp 的3306 埠,支持遠程通信
unix sock: 監聽在sock 文件上(/tmp/mysql.sock,/var/lib/mysql/mysql.sock) ,僅支持本機通信
實驗一:yum源安裝MySQL和開啟設置服務
1、打開官方網站,上邊有各種版本的yum源,找到自己想要的版本設置yum源
https://downloads.mariadb.org/mariadb/repositories/
若上不了網,也可以使用自己光碟里的老版本
2、若不用自己的光碟老版本,要配置yum源,這裡我選了10.2的版本
vim /etc/yum.repos.d/along.repo
[mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.2/centos7-amd64 gpgcheck=0
若有其他yum源,加一個enabled=0 先臨時關閉,yum clean all 清除緩存,註意:官方給的yum源安裝的Maria沒有安裝相依賴的包,還需自己安裝相依賴的包
查詢埠對應的進程信息 lsof -i :3306 或 netstat -tnlp | grep 3306
註意:開啟服務後,會多一個mysql的用戶,它的家目錄:存放資料庫,相當於資料庫中的每個表
mysql用戶是安裝包時,執行了個腳本,創建了mysql用戶,提示我們要是二進位安裝需創建用戶
rpm -q --scripts mariadb-server 可以查看這個腳本
/usr/bin/mysql_secure_installation
實驗二:二進位安裝mariadb和開啟設置服務
註意:安裝之前要確保自己系統上沒有mariadb服務,有老版本可以先卸掉,刪除mysql用戶
1、去官網下載自己想要的版本 http://mariadb.org
rz,tar xvf mariadb-10.2.8-linux-x86_64.tar.gz -C /usr/local/
(不像編譯安裝一樣,解包可以放在任何目錄,這個二進位安裝必須指定在這個目錄)
2、cd /usr/local/ 發現mariadb的目錄名字不符合要求
ln -s mariadb-10.2.8-linux-x86_64/ mysql 創建軟連接也可以改名
useradd -d /app/mysqldb -r -m -s /sbin/nologin mysql
ls support-files/ 包里自帶的有配置文件,但地方不對,要放在/etc/mysql/my.cnf
cp support-files/my-huge.cnf /etc/mysql/my.cnf 我們演示一個大的
[mysqld] datadir = /app/mysqldb //指定總目錄,必須的 innodb_file_per_table = on //讓每一個表資料庫都是一個文件,方便管理 skip_name_resolve = on //忽略名字的反向解析,加快速度
cd /usr/local/mysql 一定要在這個目錄下執行腳本,因為腳本寫死了
./scripts/mysql_install_db --user=mysql --datadir=/app/mysqldb 執行腳本
完成後就會在/app/mysqldb/ 生成mysql系統資料庫
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld 設置服務在哪個運行級別,在哪個運行級別開啟服務
service mysqld start 失敗,看失敗原因:缺少日誌文件,日誌文件須有讀寫許可權
touch /var/log/mariadb/mariadb.log
chown mysql /var/log/mariadb/mariadb.log
PATH=/usr/local/mysql/bin:$PATH
二、mysql基礎入門操作
-pPASSWORD :用戶的密碼; 建議使用-p, 預設為空密碼
2、mysql中一些的名詞
3、SQL 語句:(4大類)
DDL: Data Defination Language 數據定義語言,修改表結構
CREATE(創建), DROP(刪除), ALTER(修改表結構)
DML: Data Manipulation Language 數據操作語言,修改表裡的數據
INSERT, DELETE, UPDATE(更新數據)
DQL :Data Query Language 數據的查詢語言
SELECT 用法多,非常靈活
DCL :Data Control Language 數據控制語言,授許可權
GRANT, REVOKE(取消授權)
三、對資料庫的操作
查看某個資料庫中的表:show tables [from database_name] 如果已經在這個庫下,不用加from
資料庫有information_schema 庫,這個庫是只讀庫,只有root特殊許可權的用戶登錄才能看到,不能drop刪除
資料庫有#mysql50#.mozilla 類似的庫的處理方法,因為mysql家目錄下有個隱藏文件導致,不能刪除
CREATE DATABASE(資料庫) [IF NOT EXISTS](如果不存在,創建)'DB_NAME'; 創建成功一個,會生成一個表資料庫文件
CHARACTER SET 'character set name' 設置字元集,不推薦設置,不建議調
COLLATE 'collate name' 設置排序規則,不推薦設置
DROP DATABASE [IF EXISTS] 'DB_NAME'; 刪除成功,會刪除對應的表資料庫文件
查看支持所有字元集:SHOW CHARACTER SET; 不需要改
查看支持所有排序規則:SHOW COLLATION; 不需要改
4、獲取命令使用幫助:mysql>help create database;
例:create database testdb; 創建testdb資料庫
drop database testdb; 刪除testdb資料庫
四、創建刪除表
1、查看資料庫中所有的表:show tables from base_name;
① CREATE TABLE [IF NOT EXISTS] 'tbl_name' (col1 type1 修飾符, col2 type2 修飾符, ...)
• PRIMARY KEY(col1,...) ()複合主鍵
• ENGINE [=] engine_name (引擎設置,預設就好)
SHOW ENGINES; 查看支持的engine 引擎類型
• ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT |COMPACT} 行的格式,預設就好
② create table students3 select * [id,name] from students; 也可以創建一個表,完全複製另一個表的結構[或自己選擇的結構];複製的表沒有約束,如主鍵
insert into students3 select * from students; 有students3這個表,完全複製另一個表的內容
獲取創建表的幫助:mysql> HELP CREATE TABLE;
3、刪除表: DROP TABLE [IF EXISTS] 'tbl_name';
例1:CREATE TABLE testdb.students (id int UNSIGNED NOT NULL PRIMARY KEY,name VARCHAR (20) NOT NULL,age tinyint UNSIGNED);
解釋:創建testdb庫中名為students表;表有3列:id、name、age;id:數據類型int為正、不為空、設為主鍵;name:數據類型VARCHAR (20)、不為空;age:數據類型tinyint UNSIGNED)
例2:create table teachers (id int unsigned not null,name varchar(20) not null,age tinyint unsigned,primary key(id,name));
解釋:創建testdb庫中名為teachers表;表的複合主鍵為id和name列;其他和例1一樣
例3:create table students3 select * from students; 創建students3複製students的內容
五、DDL語句:修改表結構,儘量不要改表結構,很少用
1、查看表結構:DESC [db_name.]tb_name;
欄位:
添加欄位:add
ADD col1 data_type [FIRST加到第一段的後邊|AFTER col_name某一段的後邊]
刪除欄位:drop
修改欄位:change (欄位名), modify (欄位屬性)
索引:
添加索引:add
刪除索引: drop
表選項:
修改:change
ALTER TABLE students3 RENAME s3; 改表名
ALTER TABLE s3 ADD phone varchar(11) AFTER name; 在s3表的name欄位後加一個phone
ALTER TABLE s1 MODIFY phone int; 把phone的數據類型改為int
ALTER TABLE s1 CHANGE COLUMN phone mobile char(11); 把欄位phone改名為欄位mobile,數據類型為char(11)
ALTER TABLE s1 DROP COLUMN mobile; 刪除欄位mobile
ALTER TABLE students ADD gender ENUM('m','f') 增加gender欄位,為枚舉類型,只能是m或f
ALETR TABLE students CHANGE id sid int UNSIGNED NOT NULL PRIMARY KEY; 把修改id欄位為sid,數據類型為正int、非空、主鍵
ALTER TABLE students ADD UNIQUE KEY(name); 在name欄位加唯一鍵
ALTER TABLE students ADD INDEX(age); 在age欄位加索引
SHOW INDEXES FROM students; 查看索引信息
ALTER TABLE students DROP age;
六、DML語句,修改表內容
select * from tab_name [WHERE clause [LIMIT [m,]n];] 查看表中的所有內容,Limit m,n 跳過m行,要n行
select id,name,... from tab_name; 查出指定的表中內容
select count(*) from tab_name; 查看表中的記錄數量,count()是自帶的函數
INSERT [INTO] tbl_name[(col_name,...)] VALUES(val1,...),(...),... 下例2,3
分析:① tbl_name後不加(),預設按表結構的列;若加(),前後()內容要對應,順序可以不按表結構,也可以設null值,但最好不要,
② 選項不是數字,都要加'',例:name='along'
insert into tab_name1 select * from tab_name2; 批量導數據,下例4
UPDATE tbl_name SET col1=val1, col2=val2, ... [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n]; 下例5
分析:若不加where,直接把所有列都修改了,Limit m,n 跳過m行,要n行
DELETE FROM tbl_name [WHERE clause] [ORDERBY 'col_name' [DESC]];可先排序再指定刪除的行數,下例6
分析:若不加where,直接把所有列都刪除了
• TRUNCATE TABLE tbl_name; 清空表,快速清空,刪除的時候,不計日誌,謹慎使用
① select * from students limit 3,2;
② insert into students(id,name,age) values(1,'along',18); 添加1行信息
③ insert into students values(2,'xiaoming',19),(3,'xiaohong',20); 添加2,3行信息
④ insert s2 select * from students; 複製students表的信息到s2表中
⑤ update s2 set name='xiaohei',age=30 where id=2; 修改id=2行的內容
⑥ delete from s2 where id=3; 刪除s2表的id=3的行
七、DQL 語句,select
SELECT col1,col2,... FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n]; 查詢表內容信息,上例1
*: 所有欄位
as :欄位別名,若事先做好了表,想要把列的英語改成中文,不用修改,可以直接用別名,下例1
解釋:by後指定列,desc反向排序,反向也可以-col_name
註意:若其中有空值,正向排序空值在第一行,反向排序空值在最後一行,可以order by -col_name desc 即正向排序,有把空值放在最後一行,下例2
IS NULL ,IS NOT NULL 尋找空值,不能用=,只能用is,所以最好不要有null,不好管理
① select id as 學生編號,name 姓名,age 年齡 from students; 設置別名
② select * from students order by -age desc; 按年齡的列正向排序,null在最後
③ select * from students where age>=20; 顯示age>=20的
select * from students where age between 18 and 20; 顯示18-20的
select * from students where name like 'xiao%'; 顯示name是xiao開頭的
select * from students where name rlike 'ng$'; 顯示name是ng結尾的
select * from s2 where age is null; 顯示null值的行
select * from students where age in (18,20,30); 顯示age=18,20,30的行
八、DCL 數據控制語言,授許可權
CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];
例:create user 'along'@'192.168.30.%' identified by 'centos'; 添加along賬號在192.168.30這個網段,可以輸centos密碼連接
SELECT User,Host,Password FROM mysql.user;
5、刪除用戶:DROP USER 'username'@'host';
示例:drop user'along'@'192.168.30.107';
① SET PASSWORD FOR 'user'@'host' = PASSWORD('password');
例:set password for 'along'@'192.168.30.%'=password('along');
② UPDATE user SET password=PASSWORD('magedu') WHERE User='root';
註意:相當於改了user的表,不推薦用,修改表的命令不會馬上生效,需執行FLUSH PRIVILEGES 刷新一下生效
③ /usr/local/mysql/bin/mysqladmin -u root –poldpassword password 'newpassword'
註意:僅創建的用戶,其所擁有的許可權很小,所以我們要進行授權
1、授權
GRANT priv_type,... ON [object_type] db_name.tb_name TO 'user'@'host' [IDENTIFIED BY 'password'] [WITHGRANT OPTION]; 授權並創建賬號
① priv_type: ALL [PRIVILEGES] 授權類型:
insert增,delete刪 , update改,select查,all所有許可權
② db_name.tb_name: 對哪個資料庫的哪個表授權:
db_name.routine_name :指定庫的存儲過程和函數
例:grant all on test.* to 'along2'@'%' identified by 'centos'; 創建along2用戶,允許其在所有主機通過centos密碼登錄,對test庫的所有表有所有許可權
REVOKE priv_type, ... ON db_name.tb_name FROM 'user'@'host
例:revoke delete on test.* from 'along2'@'%'; 回收along2@'%'用戶對test庫的所有表的刪除許可權
① MariaDB 服務進程啟動時會讀取mysql 庫中所有授權表至記憶體
② GRANT 或REVOKE 等執行許可權操作會保存於系統表中,MariaDB 的服務進程通常會自動重讀授權表,使之生效
③ 對於不能夠或不能及時重讀授權表的命令,可手動讓MariaDB 的服務進程重讀授權表: