Mysql筆記整理
阿新 • • 發佈:2020-11-11
MySQL資料庫(增-刪-改-查)
Mysql中的預設資料庫介紹
information_schema:主要儲存了系統中的一些資料庫物件資訊。比如使用者表資訊、列資訊、許可權資訊、字符集資訊、分割槽資訊等。
cluster:儲存了系統的叢集資訊。
mysql:儲存了系統的使用者許可權資訊。
test:系統自動建立的測試資料庫,任何使用者都可以使用。
DDL
對於庫的操作: create database dbname; 建立一個叫dbname的資料庫 show databases; 檢視所有資料庫 use dbname; 進入dbname資料庫 show tables; 檢視當前所在資料庫中的表 drop database dbname; 刪除一個叫dbname的資料庫 對於表的操作: create tabale tablename (欄位1 資料型別(長度),欄位2 資料型別(長度)...); 舉例: create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2)); 建立一個叫emp的表 desc tablename; 檢視tablename表的結構 show create table tablename \G; 檢視tablename表的結構,同時可以看到儲存的引擎和字元編碼 drop table tablename; 刪除tablename這個表 修改表結構的操作: 1.改欄位型別 alter table tablename modify 欄位 欄位型別 [first | alter 欄位名] 舉例 alter table tablename modify ename varchar (20); 修改tablename表中ename欄位的定義 2.增加表字段的操作: alter table tablename add 欄位 欄位定義 [first | after 欄位名] first 新增欄位為第一個欄位 after 新增欄位到指定欄位後 預設追加 舉例: alter table emp add age int(2) after sal; 新增age欄位到sal後 3.刪除表字段: alter table tablename drop 欄位; 舉例: alter table emp drop age 在表emp中刪除age欄位 4.修改欄位名: alter table tablename change 舊欄位 新欄位 欄位型別 [first | after 欄位名] 舉例: alter table emp change age age_new int(2) first; 將emp中的age欄位改為age_new欄位,同時修改了欄位型別 5.修改表名: alter table tablename rename 新表名; alter table emp rename emp1; 將表名emp改為emp1
DML
對資料進行操作
增 insert(插入資料)
刪 delete(刪除資料)
改 update(更新資料)
DQL
查 select(查詢資料)
1.插入資料 insert
insert into 表名(欄位1,欄位2,...) values('值1','值2',...) 舉例: insert into emp (ename,hiredate,sal,deptno) values('zhangshan','2020-02-07','3000','1'); 向emp表中插入一行資料 insert into emp values('lisi','2020-02-07','10000','2'); 向emp表中插入一行資料 insert into emp (ename,sal) values('wangwu','100'); 向emp表中插入一行資料 顯示結果如下: MariaDB [dbname]> select * from emp; +-----------+------------+----------+--------+ | ename | hiredate | sal | deptno | +-----------+------------+----------+--------+ | zhangshan | 2020-02-07 | 3000.00 | 1 | | lisi | 2020-02-07 | 10000.00 | 2 | | wangwu | NULL | 100.00 | NULL | +-----------+------------+----------+--------+ 3 rows in set (0.00 sec) 舉例(一次錄入多個數據): insert into dept values(1,'zhangsan'),(2,'lisi'),(3,'wangwu'); 顯示結果如下: MariaDB [dbname]> select * from dept; +--------+----------+ | deptno | deptname | +--------+----------+ | 1 | zhangsan | | 2 | lisi | | 3 | wangwu | +--------+----------+ 3 rows in set (0.00 sec)
2.修改資料 update
update 表名 set 欄位=值1,欄位2=值2,...[where 欄位=值] 舉例: 之前資料如下: MariaDB [dbname]> select * from emp; +-----------+------------+----------+--------+ | ename | hiredate | sal | deptno | +-----------+------------+----------+--------+ | zhangshan | 2020-02-07 | 3000.00 | 1 | | lisi | 2020-02-07 | 10000.00 | 2 | | wangwu | NULL | 100.00 | NULL | +-----------+------------+----------+--------+ 3 rows in set (0.00 sec) 用update修改資料後如下: update emp set sal='1000' where ename='wangwu'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 MariaDB [dbname]> select * from emp; +-----------+------------+----------+--------+ | ename | hiredate | sal | deptno | +-----------+------------+----------+--------+ | zhangshan | 2020-02-07 | 3000.00 | 1 | | lisi | 2020-02-07 | 10000.00 | 2 | | wangwu | NULL | 1000.00 | NULL | +-----------+------------+----------+--------+ 3 rows in set (0.00 sec) 為wangwu更改入職日期和編號 MariaDB [dbname]> update emp set hiredate='2020-02-07',deptno='3' where ename='wangwu'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 MariaDB [dbname]> select * from emp; +-----------+------------+----------+--------+ | ename | hiredate | sal | deptno | +-----------+------------+----------+--------+ | zhangshan | 2020-02-07 | 3000.00 | 1 | | lisi | 2020-02-07 | 10000.00 | 2 | | wangwu | 2020-02-07 | 1000.00 | 3 | +-----------+------------+----------+--------+ 3 rows in set (0.00 sec) 兩個表聯合修改資料: update emp a,dept b set a.sal=a.sal*b.deptno,a.ename =b.deptname where a.deptno=b.deptno; delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=2;
3.刪除資料 delete
delete from 表名 [where 欄位=值];
delete from dept where depton=3;
4.查詢資料 select
select * from 表名 [where 欄位=值];
select 欄位1,欄位2,... from 表名 [where 欄位=值];
(1)查詢不重複的資料
select distinct 欄位 from emp; 列印時去掉重複的欄位
(2)多條件查詢
可以使用邏輯關係符 and or not ;= > < >= >= !=
select * from emp where hiredate='2019-02-07' and sal<='3000';
(3)排序 order by
select * from 表名 [where 欄位=值] [order by 欄位 [desc (降序)/asc(升序)]]
select * from emp order by sal desc;
select * from emp order by sal,deptno desc;
(4)分頁 limit
select * from 表名 [where 欄位=值] [order by 欄位 [desc (降序)/asc(升序)]]
[limit [起始位置],行數];
select * from emp order by sal desc limit 1;
(5)聚合
sum()求和 count(*)資料條數 max最大值 min 最小值
select [欄位1,欄位2,...] [聚合函式] from 表名 [where 欄位=值] [group by 欄位1,欄位2,] [with rollup] having條件;
聚合函式:表示要做聚合操作
group by:分組,表示要進行分組聚合的欄位
with rollup:選用表示對聚合分類後的資料在彙總
having:表示對分類後的結果再次進行過濾
where和having區別,where用於聚合前,having用於聚合後
select sal,count(1) from emp group by sal having count(1)>1;
按名字分組然後最小分數大於80的列出來
select name from report group by name having min(score)>80;
select name from report group by name having min(score)>80 and count(subject)=3;
select distinct name from report where name not in (select name from report where score<=80);
子查詢
查詢時,需要的條件是另一個select語句的結果。
子查詢用到的關鍵字主要包括in, not in ,=,!=等
多表聯合查詢:
多表連線查詢就是指資料同時從多張表中獲取,查詢語句涉及到多張表。
內連線:inner join
外連線:
左外連線:left outer join
右外連線:right outer join
全連線:union
交叉連線:cross join
內連線查詢:選用兩張表中互相匹配的記錄(兩張表同時符合某一個指定條件的資料記錄組合)
select ename,deptname,sal from emp,dept where emp.deptno=dept.deptno;
DCL
DBA 對使用者的許可權管理使用
grant all privilege on discuz.* to 'rundiscuz'@'%' identified by '123123';
all privilege 所有許可權
select
insert
updeat
delete
主機地址:
% 所有的主機
192.168.1._ 代表網段
192.168.1.10
域名或主機名
flush privileges; #重新整理資料庫許可權/授權重新整理
show grants for admin@localhost; #查詢指定使用者的所有許可權
grant select on dbname.* to 'admin'@'localhost' identified by '123123'; #只給admin使用者select查詢dbname.*的許可權
grant all privileges on dbname.* to admin@localhost identified by '123123'; #給admin使用者dbname.*資料庫下的所有許可權
revoke all on dbname.* from 'admin'@'localhost'; #撤銷指定使用者所有許可權
revoke select on dbname.* from 'admin'@'localhost'; #撤銷admin使用者對dbname的select查詢dbname.*的許可權
MySQL資料庫的三種安裝方式:
- yum (rpm)
- 原始碼包安裝
- 二進位制包安裝
介紹二進位制安裝方式
解包:tar xf mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.30-linux-glibc2.5-x86_64 /usr/local/mysql
useradd -M -s /sbin/nologin mysql
yum -y install autoconf
cd /usrl/local/myslq/scripts/
初始化資料庫:
./mysql_install_db --user=mysql --datadir=/usr/local/mysql/data/ --basedir=/usr/local/mysql/
準備mysql配置檔案
cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
準備啟動指令碼
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
echo 'export PATH="$PATH:/usr/local/mysql/bin"' >> /etc/profile
source /etc/profile
mysql資料庫忘記root密碼怎麼解決?
1.關閉資料庫(或kill)
/etc/init.d/mysqld stop
2.將資料庫跳過授權表以安全模式在後臺執行
mysqld_safe --skip-grant-table &
3.無密碼登入資料庫後,使用update語句修改密碼;
update mysql.user set password=Password('123456') where user='root';
4.關閉安全模式的資料庫,重啟資料庫
kill 對應的pid (或者關閉資料庫)
啟動資料庫後,使用新密碼登入
mysql 命令(mysql的客戶端)
-u 指定使用者
-p 指定密碼
-P 指定埠,預設3306
-h 指定遠端主機地址
-e 執行SQL
mysql支援中文字符集;
中文字符集 GBK GB2312 utf-8
create database dbname character set utf8; 建立資料庫時指定字符集;
create table dbname.test (name varchar(20),...) character set utf8;
在建立表時指定字符集
alter database dbname character set utf8;修改資料庫字符集
alter table dbname.test character set utf8;修改表的字符集(重啟資料庫生效)
show character set; mysql中可以使用的字符集
show collation like 'utf%'; 支援的校驗字元規則
show variables like 'character_set_database'; 預設使用的字符集
show variables like 'collation_data'; 預設使用的字元校驗規則
永久修改字元編碼;
在mysql配置檔案中/etc/my.cnf新增:
[mysqld]
character-set-server=utf8
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
show variables like 'char%';
show create table dbname.test; 可以查看錶使用的字符集
索引與事務
資料庫索引:是對錶中的一列或多列資料的值進行排序的一種資料結構,它是一列或多列的值得集合;
mysql
舉例:目前10w條資料
沒有索引:select * from tablename where a=1;全表掃描
如果有索引:比如b列建立索引,只掃描b這列;
索引的作用
- 設定合適的索引,資料庫能夠加快查詢速度;
- 可以降低資料庫的IO成本,並且索引還可以降低排序的成本;
- 通過唯一性索引保證表資料的唯一性,可以加快表與表直接的連線查詢;
- 在使用分組和排序時,可以減少分組和排序的時間;
索引也是表的一部分,如果索引建立的過多,會佔用更多的空間,也會影響update或者是insert語句的執行;
索引的分類
- 普通索引(index):最基本的索引,沒有什麼限制;
- 唯一性索引(unique):索引列的所有值只能出現一次,也就是說必須為唯一,可以為空;
- 主鍵(primary key):特殊的唯一性索引,不能為空;
- 全文索引(fulltext):用於查詢關鍵字,通常欄位型別為text;
- 多列索引(組合索引,復和索引)
普通索引
建立普通索引:
建立表時:creat table 表名 (欄位1 欄位型別,欄位2 欄位型別[NOT NULL]...,index 索引名(欄位1(length)));
建立表後:
create index 索引名 on 表名 (欄位[(length)]);
alter table 表名 add index 索引名 (欄位[(length)]);
create index idx_sal on sal(薪資);
檢視索引
show index/keys from tablename \G;
刪除索引:
drop index 索引名稱 on 表名;
alter table 表名 drop index 索引名稱;
唯一性索引
建立表時:creat table 表名 (欄位1 欄位型別,欄位2 欄位型別[NOT NULL]...,unique index 索引名(欄位1(length)));
建立表後:
create unique index 索引名 on 表名 (欄位[(length)]);
alter table 表名 add unique index 索引名 (欄位[(length)]);
檢視索引
show index/keys from tablename \G;
刪除索引:
drop index 索引名稱 on 表名;
alter table 表名 drop index 索引名稱;
主鍵 (建立主鍵的值不能有空值,每個表中只有一個主鍵)
建立表時:creat table 表名 (欄位1 欄位型別,欄位2 欄位型別[NOT NULL]...,primary key 索引名(欄位1(length)));
建立表後:
alter table 表名 add primary key 索引名 (欄位[(length)]);
檢視索引
show index/keys from tablename \G;
刪除主鍵:
alter table 表名 drop primary key;
補充說明:
length的作用:
有時需要對文字或者長字串的欄位建立索引,如果直接對該欄位建立索引,會增加索引的儲存空間,並且降低索引的利用率。
length的作用是指定該欄位對應值的前幾個字元的建立索引;使用了length的索引稱為字首索引
組合索引:
假設a,b兩個欄位都有索引,查詢條件是a=1,b=2,查詢時先找出a=1的結果,在該結果中再找b=1,mysql執行的時候,只會用到一個索引來查詢,此時可以對a,b做組合索引。
索引失效:
1.條件中有or a=1 or b=2
2.在like中查詢關鍵字前有% (%a%)
3.索引列是表示式或函式的一部分 where a>10
4.目測全表掃描比索引快
5.欄位的資料型別是字串,條件中的資料一定要加'',不加不使用索引;
建立索引的原則:
1.超過300的行應該有索引;
2.經常出現在where語句中的欄位,應該建立索引;
3.索引儘量建立在小欄位上或者使用字首索引;
4.經常多表連線查詢的表,應該在連線欄位上建立索引;
5.唯一性太差的欄位不適合建立索引;
6.表更新速度過快,不適合建立索引;
事務(transation)
事務是一種機制,一個操作序列,包含了一組資料的操作語句,並且把所有語句作為整體進行操作;
主要用於處理操作量比較大,複雜度高的資料;
- mysql中使用Innodb儲存引擎的表或庫才可以支援事務;
- 事務處理可以用來維護資料庫的完整性
- 事務用來管理 insert update delete
事務的ACID特性:
-
原子性(atomicity):事務是一個完整的整體操作,事務中的各個操作是不可分的,所以事務是以一個整體提交或回滾;
-
一致性(consistency):當事務完成以後,資料必須處於一致的狀態;
開始之前:資料一致
開始之後:資料有可能不一致
完成之後:資料一致 -
隔離性(lsolation):資料對所有併發事務是彼此隔離的,以防多個事務併發執行時,由於交叉執行而導致資料不一致;
-
永續性(durability):不管系統發生了什麼樣的故障,事務的處理結果都是永久的;
事務的操作
在mysql中預設開啟自動提交, 當執行SQL語句時事務便自動提交;
show variables like 'autocommit'; 檢視當前是否是自動提交事務
自動提交 set autocommit=1;
手動提交 set autocommit=0;
永久修改事務提交:在mysql配置檔案中的[musqld]下新增autocommit=1或0
1.事務處理命令控制事務
begin 開始事務 undo log insert into -->delete update -->update
commit 提交事務
rollback 回滾事務(撤銷)