大綱:
image.png
一. mysql 數據類型
字符:char, varchar, text, set, enum
整數: int, tinyint, smallint, mediumint, bigint
浮點和定點: float double decimal
日期:year, date, time, datetime, timestamp
二進制:沒用過不寫;
注意點:
char和varchar使用
char長度不可變吉挣,varchar長度可變焰雕;
char 長度固定 & 查詢速度要求較高淑玫;set和enum使用
set可多選苟鸯, enum單選浮點使用問題,定點數
double 精度高于 float ;
如果精確到小數點10位以上疲扎,double;
浮點數的精度和操作系統(tǒng)有關昵时;
float(m,n) m整數位,n小數位日期的坑
注意日期范圍椒丧;
http://c.biancheng.net/view/2425.html
二. mysql 引擎
InnoDB壹甥,MyISAM,MEMORY
1. 查詢引擎:
show engines;
show variables like 'have%'; #mysql支持的存儲引擎
show variables like 'storage_engine'; //默認存儲引擎
2. 對比:
InnoDB: 提供索引壶熏,外鍵句柠,事務能力,奔潰修復能力和并發(fā)控制棒假;缺點是讀寫效率差溯职,占用數據空間相對比較大;
MyISAM:占用空間小帽哑,不支持事務谜酒,索引;
三. 增刪改查
表數據:
增: insert into student(name, age) values('韓嚴', 25);
刪:delete from student where name = '韓嚴';
改:update student set age = 26 where name = '韓嚴';
查:select * from student where name = '韓嚴';
表結構:
增:alter table student add sex enum('男','女');
刪:alter table student drop sex;
改:
alter table student modify name varchar(20); //修改類型
alter table student change name sname varchar(20); //修改字段名
四. sql查詢高級
image.png
1. 分組查詢 group by / having
select * from student group by class; // 查詢每組只有一個數據妻枕,配合函數使用僻族;
每個班級里年紀最大的:select max(sbirthday) from student group by class;
having: 篩選
select s_name,sum(s_score) from student group by s_name having sum(s_score)>600; 查詢總成績大于600分的學生
2. 連接 join / on
left join: 以左表為準屡谐,去右表找數據述么,如果沒有匹配的數據,則以null補空位
righr join: 以右表為準愕掏,去左表找數據碉输,如果沒有匹配的數據,則以null補空位
inner join:兩表交集
3. 子查詢
where子查詢:
select * from student where sname in (select sname from score where score > 60); //查詢成績大于60的學生
from子查詢:
select * from class, (select id, name from score where score > 60) as s where class.id = s.id; //查詢成績大于60的學生
五. 索引
創(chuàng)建:
create table index1(
id int,
name varchar(20),
sex boolean,
index(id) //索引
);
查看: show create table index1 \G
測試: explain select * from index1 where id =1 \G
優(yōu)點:提高查詢速度
缺點:占用空間亭珍,創(chuàng)建和維護耗時
image.png
六. 視圖
定義:是從一個或者多個表中導出的表,是一種虛擬表枝哄;
例子:員工和部門數據表肄梨,不同領導可以查看的權限不同,通過視圖領導只能看到本部門員工的指定信息挠锥;
創(chuàng)建:
create view student_view
as select sno, sname, class from student
查看:show create view student_view\G
優(yōu)點:1. 操作簡單化 2. 增加數據安全性 3. 提供表的邏輯獨立性
七. 觸發(fā)器
通過insert,update,delete等事件出發(fā)特定众羡;
創(chuàng)建:
create trigger stu_trig1 before insert on student for each row
insert into trigger_time values(now());
每次向學生表插入數據前,向trigger表插入當前時間蓖租;
查看:show triggers\G
八. 存儲過程和函數
這個我用的不多粱侣,不熟悉羊壹;就是一個函數存儲了查詢等過程,然后調用
https://www.runoob.com/w3cnote/mysql-stored-procedure.html
九. mysqldump 備份 & 權限管理
備份: mysqldump -uroot -p database student > student.sql
導入: source student.sql
還原:mysq -uroot -p < student.sql
表導出:
mysql -uroot -pPassword -e 'select * from student' dbname> student.txt // xml , html格式
SELECT * FROM test_outfile
INTO OUTFILE "student.txt"
FIELDS TERMINATED BY "," ENCLOSED BY '"';
導入:load data local infile "student.txt" into table student lines terminated by ' ';
十. 事務
特點:一致性齐婴,隔離性油猫,原子性,持久性
begin
commit
rollback
https://www.runoob.com/mysql/mysql-transaction.html
十一. 性能優(yōu)化
explain柠偶, analyze table student情妖, check table student
- 優(yōu)化數據庫結構:分表,增中間表诱担,優(yōu)化插入速度(禁用索引毡证,禁用唯一性檢查,一次插入多條數據)
- 機器升級
- 優(yōu)化查詢蔫仙,索引料睛,子查詢(連接查詢不需要建立臨時表)
其他:
distinct() 去重
order by row desc/asc 排序
group by .. having..
join .. on ..
as 別名
分頁limit
sql執(zhí)行順序: https://blog.csdn.net/csndhu/article/details/88176564
1、FROM table1 left join table2 on 將table1和table2中的數據產生笛卡爾積摇邦,生成Temp1
2恤煞、JOIN table2 所以先是確定表,再確定關聯條件
3涎嚼、ON table1.column = table2.columu 確定表的綁定條件 由Temp1產生中間表Temp2
4阱州、WHERE 對中間表Temp2產生的結果進行過濾 產生中間表Temp3
5、GROUP BY 對中間表Temp3進行分組法梯,產生中間表Temp4
6苔货、HAVING 對分組后的記錄進行聚合 產生中間表Temp5
7、SELECT 對中間表Temp5進行列篩選立哑,產生中間表 Temp6
8夜惭、DISTINCT 對中間表 Temp6進行去重,產生中間表 Temp7
9铛绰、ORDER BY 對Temp7中的數據進行排序诈茧,產生中間表Temp8
10、LIMIT 對中間表Temp8進行分頁捂掰,產生中間表Temp9