mysql的基本操做

1、庫操做

  1. 建立庫:create database 數據庫的名字;
  2. 刪除庫:drop database 數據庫的名字;
  3. 查看當前有多少個數據庫:show databases;
  4. 查看當前使用的數據庫:select database();
  5. 切換到這個數據庫(文件夾)下:use 數據庫的名字;

2、表操做

2.1 增刪改查

    • 建立表:create table 表名(字段名 數據類型(長度));
      • create table day (id int,name char(4)); mysql5.6版本默認是engine=innodb
      • create table day (id int,name char(4)) engine=myisam;
      • create table day (id int,name char(4)) engine=memory;
    • 刪除表:drop table 表名;
      • drop table student;
    • 添加字段:alter table 表名 add 字段名 數據類型(寬度) 約束;
    • 刪除字段:alter table 表名 drop 字段名;
    • 修改字段:
      • 修改已經存在的字段的類型、寬度、約束:使用modify
        • alter table 表名 modify name varchar(12) not null;
      • 修改已經存在的字段的類型、寬度、約束和字段名字:使用change
        • alter table 表名 change name new_name varchar(12) not null;
      • 特殊:有三個字段依次是:id name age
        • 交換name和age的位置:alter table 表名 modify age int not null after id;
        • 將age放在第一位:alter table 表名 modify age int not null first;
  1. 查:
    • 查看當前文件夾中有多少張表:show tables;
    • 查看錶的結構
      • 可以看到和這張表相關的全部信息:show create table 表名;
      • 只能查看錶的字段的基礎信息:desc 表名; / describe 表名;

2.2 表與表之間的關係

  1. 兩張表中的數據之間的關係
    • 多對一 :foreign key ,永遠是在多的那張表中設置外鍵
      • 多個學生都是同一個班級的,學生是多,班級是一
      • 兩張表:學生表和班級表,學生表關聯班級表
    • 一對一 :foreign key +unique,後出現的後一張表中的數據做爲外鍵,而且要約束這個外鍵是惟一的
      • 一個學生是一個客戶,兩張表:學生表和客戶表
      • 客戶表做爲外表,在學生表中設置外鍵
    • 多對多 :產生第三張表,把兩個關聯關係的字段做爲第三張表的外鍵
      • 一本書有多個做者,一個做者有多本書,兩張表:書名錶和做者表

3、 數據操做

3.1 增刪改查

  1. 增:insert
    • insert into 表名 values (值....);
      • 全部的在這個表中的字段都須要按照順序被填寫在這裏
    • insert into 表名(字段名,字段名。。。) values (值....);
      • 全部在字段位置填寫了名字的字段和後面的值必須是一一對應
    • insert into 表名(字段名,字段名。。。) values (值....),(值....),(值....);
      • 全部在字段位置填寫了名字的字段和後面的值必須是一一對應
    • value單數:一次性寫入一行數據,values複數:一次性寫入多行數據
    • 寫入角度:
      • 第一個角度:寫入一行內容仍是寫入多行
        • insert into 表名 values (值....);
        • insert into 表名 values (值....),(值....),(值....);
      • 第二個角度:
        • 是把這一行全部的內容都寫入:insert into 表名 values (值....);
        • 仍是按指定字段寫入:insert into 表名(字段1,字段2) values (值1,值2);
  2. 刪:delete
    • delete from 表名 where 條件;
      • 刪除id=1那行的數據:delete from student where id=1;
    • delete from 表名;
      • 刪除全部的數據:delete from student;
  3. 改:update
    • update 表名 set 字段名=新值;
      • 修改全部的數據:update student set name = 'yuan';
    • update 表名 set 字段名=新值 where 條件;
      • 修改id=2那行的數據:update student set name = 'wusir' where id=2;
  4. 查:
    • 單表查詢
    • 多表查詢

3.2 單表查詢

  1. select 語句
    • select * from 表名;
    • select 字段,字段.. from 表名:
    • distinct去重:select distinct 字段,字段.. from 表名;
    • 對int類型四則運算:select 字段*5 from 表名;
    • 重命名:
      • select 字段 as 新名字,字段 as 新名字 from 表名;
      • select 字段 新名字 from 表名;
    • 字符串拼接:使用concat()函數
      • select concat('姓名:',name,'年薪:',salary*12) as 表名;
  2. where 語句
    • 比較運算:
      • 大於:>,小於: <,等於: =,大於等於:>=,小於等於:<=,不等於:!= 或 <>
    • 邏輯運算:條件的拼接
      • 與:and,或:or,非:not
    • 身份運算:關於null
      • is null:查看爲NULL的信息
      • is not null:查看不爲NULL的信息
        • select * from employee where salary not in (20000,30000,3000,19000,18000,17000)
    • 範圍篩選
      • 多選一:字段名 in (值1,值2,值3)
        • select * from employee where salary in (20000,30000,3000,19000,18000,17000)
      • 在一個模糊的範圍裏
        • 在一個數值區間:between + and
          • select emp_name from employee where salary between 10000 and 20000;
        • 字符串的模糊查詢:like + 通配符
          • 通配符 %:匹配任意長度的任意內容
          • 通配符 _ :匹配一個字符長度的任意內容
        • 正則匹配:regexp,更加細粒度的匹配的時候
          • select * from 表 where 字段 regexp 正則表達式
            • select * from employee where emp_name regexp '^j[a-z]{5}';
        • 查看崗位是teacher且名字是jin開頭的員工姓名、薪資
          • select emp_name,salary from employee where post='teacher' and emp_name like 'jin%';
          • select emp_name,salary from employee where post='teacher' and emp_name regexp '^jin.*';
  3. group by 分組
    • 分組:會把在group by後面的這個字段中的每個不一樣的項都保留下來,而且把值是這一項的的全部行歸爲一組
      • select * from employee group by post;
      • 能夠完成去重:select 字段名 from 表名 group by 字段名;
        • 至關於:select distinct 字段名 from 表名;
    • 聚合:把不少行的同一個字段進行一些統計,最終的到一個結果
      • count(字段):統計這個字段有多少項
        • 統計表有多少項:select count(*) from 表名;
      • sum(字段):統計這個字段對應的數值的和
      • avg(字段):統計這個字段對應的數值的平均值
      • min(字段):統計這個字段對應的數值的最小值
      • max(字段):統計這個字段對應的數值的最大值
    • 分組聚合:老是根據會重複的項來進行分組,分組老是和聚合函數一塊兒用
      • 求部門的最高薪資或者求公司的最高薪資均可以經過聚合函數取到
        • 可是要獲得對應的人,就必須經過多表查詢
      • 求最晚入職的員工,其實是最大的入職日期,即便用max(),反之亦然
      • 示例:
        • 求各個部門的人數
          • select count(*) from employee group by post
        • 求公司裏 男生 和女生的人數
          • select count(id) from employee group by sex
        • 求各部門年齡最小的
          • select post,min(age) from employee group by post
  4. having 語句:過濾組
    • 執行順序:
      • 老是先執行where,再執行group by分組
      • 因此相關先分組,以後再根據分組作某些條件篩選的時候,where都用不上
      • 只能用having來完成
    • 建議:普通的條件判斷用where,不要用having
    • 示例:部門人數大於3的部門
      • select post from employee group by post having count(*) > 3;
  5. order by 排序
    • 默認是升序asc 從小到大:order by 某一個字段 asc;
    • 指定降序排列desc 從大到小:order by 某一個字段 desc;
    • 指定先根據第一個字段升序排列,在第一個字段相同的狀況下,再根據第二個字段排列 :
      • order by 第一個字段 asc,第二個字段 desc;
  6. limit 限制查詢數量
    • 取前n個:imit n == limit 0,n
      • 考試成績的前三名
      • 入職時間最晚的前三個
    • 分頁:limit m,n,從m+1開始取n個
      • 員工展現的網頁
    • limit n offset m == limit m,n 從m+1開始取n個
  7. 單表查詢順序
    • from 表
    • where 條件
    • group by 分組
    • having 過濾組
    • select 須要顯示的列
    • order by 排序
    • limit 前n條

3.3 多表查詢

  1. 兩張表連在一塊兒:select * from emp,department;
  2. 連表查詢:把兩張表連在一塊兒查
    • 內鏈接:inner join
      • 兩張表條件不匹配的項不會出現再結果中
      • select * from emp inner join department on emp.dep_id = department.id;
    • 外鏈接:
      • 左外鏈接:left join
        • 永遠顯示全量的左表中的數據
        • select * from emp left join department on emp.dep_id = department.id;
      • 右外鏈接:right join
        • 永遠顯示全量的右表中的數據
        • select * from emp right join department on emp.dep_id = department.id;
      • 全外鏈接:mysql中沒有全外鏈接
        • 要實現全外鏈接,就使用左外鏈接union右外鏈接
        • select * from emp left join department on emp.dep_id = department.id union select * from department right join emp on emp.dep_id = department.id;
    • 鏈接的語法:
      • select 字段 from 表1 xxx join 表2 on 表1.字段 = 表2.字段;
      • 經常使用:內連接和左外連接
    • 示例:查詢大於部門內平均年齡的員工名、年齡
      • select * from emp inner join (select dep_id,avg(age) avg_age from emp group by dep_id) as d on emp.dep_id = d.dep_id where emp.age > d.avg_age;
  3. 子查詢:經常使用邏輯查詢拼接
    • 示例一:找技術部門的全部人的姓名
      • 先找到部門表技術部門的部門id
        • select id from department where name = '技術';
      • 再找emp表中部門id = 200
        • select name from emp where dep_id = 查詢結果;
      • 子查詢:select name from emp where dep_id = (select id from department where name = '技術');
    • 示例二:查看不足1人的部門名(子查詢獲得的是有人的部門id
      • 查emp表中有哪些部門id
        • select dep_id from emp group by dep_id;
      • 再看department表中
        • select * from department where id not in (查詢結果)
      • 子查詢:select * from department where id not in (select dep_id from emp group by dep_id);

4、索引

4.1 索引的基本知識

  1. 索引的定義:就是創建起的一個在存儲表階段就有的一個存儲結構,能在查詢的時候加速
  2. 索引的重要性:
    • 讀寫比例 :10:1
    • 讀(查詢)的速度就相當重要了
  3. 索引的原理:block 磁盤預讀原理
    • 讀硬盤的io操做的時間很是的長,比CPU執行指令的時間長不少
    • 儘可能的減小IO次數纔是讀寫數據的主要要解決的問題
  4. 數據庫的存儲方式
    • 新的數據結構 —— 樹
    • 平衡樹 balance tree - b樹
    • 在b樹的基礎上進行了改良 - b+樹
      • 分支節點和根節點都再也不存儲實際的數據了,讓分支和根節點能存儲更多的索引的信息,就下降了樹的高度,全部的實際數據都存儲在葉子節點中
      • 在葉子節點之間加入了雙向的鏈式結構,方便在查詢中的範圍條件
    • mysql當中全部的b+樹索引的高度都基本控制在3層
      • io操做的次數很是穩定
      • 有利於經過範圍查詢
    • 什麼會影響索引的效率 —— 樹的高度
      • 對哪一列建立索引,選擇儘可能短的列作索引
      • 對區分度高的列建索引,重複率超過了10%那麼不適合建立索引
  5. 彙集索引和輔助索引
    • 在innodb中,彙集索引和輔助索引並存的,在myisam中,只有輔助索引,沒有彙集索引
    • 彙集索引 - 主鍵
      • 查詢速度更快
      • 數據直接存儲在樹結構的葉子節點
    • 輔助索引 - 除了主鍵以外全部的索引都是輔助索引
      • 查詢速度稍慢
      • 數據不直接存儲在樹中
  6. 索引的種類
    • primary key 主鍵:彙集索引,約束的做用:非空 + 惟一,聯合主鍵
    • unique 自帶索引:輔助索引,約束的做用:惟一,聯合惟一
    • index:輔助索引,沒有約束做用,聯合索引
  7. 建立索引:create index 索引名字 on 表(字段)
  8. 刪除索引:drop index 索引名 on 表名字;
  9. 索引是如何發揮做用的?
    • select * from 表 where id = xxxxx
      • 在id字段沒有索引的時候,效率低
      • 在id字段有索引的以後,效率高
      • 查詢的字段不是索引字段,效率也低
  10. 聯合索引
    • 建立聯合索引:create index ind_mix on s1(id,name,email);
    • 在聯合索引中若是使用了or條件索引就不能生效
    • 最左前綴原則 :在聯合索引中,條件必須含有在建立索引的時候的第一個索引列
      • select * from s1 where id =1000000; 能命中索引
      • select * from s1 where email = 'eva1000000@oldboy'; 不能命中索引
    • 在整個條件中,從開始出現模糊匹配的那一刻,索引就失效了
      • select * from s1 where id >1000000 and email = 'eva1000001@oldboy'; 能命中索引
      • select * from s1 where id =1000000 and email like 'eva%'; 不能命中索引
    • 何時用聯合索引?
      • 只對a或與a有關的,如abc等條件進行索引,而不會對b或c進行單列的索引時,使用聯合索引
  11. 單列索引
    • 選擇一個區分度高的列創建索引,條件中的列不要參與計算,條件的範圍儘可能小,使用and做爲條件的鏈接符
    • 使用or來鏈接多個條件時,在知足上述條件的基礎上,對or相關的全部列分別建立索引
  12. 覆蓋索引:若是咱們使用索引做爲條件查詢,查詢完畢以後,不須要回表查,這就是覆蓋索引
  13. 合併索引:對兩個字段分別建立索引,因爲sql的條件讓兩個索引同時生效了,那麼這兩個索引就成爲了合併索引
  14. 執行計劃 : 若是你想在執行sql以前就知道sql語句的執行狀況,那麼可使用執行計劃
    • 狀況1:假設30000000條數據,sql:20s
      • 使用explain + sql語句 --> 並不會真正的執行sql,而是會給你列出一個執行計劃
    • 狀況2:數據不足時,使用explain + sql語句 --> 並不會真正的執行sql,而是會給你列出一個執行計劃
  15. 建表、使用sql語句的時候注意:
    • char代替varchar
    • 連表代替子查詢
    • 建立表的時候,固定長度的字段放在前面

4.2 索引不生效的緣由

  1. 要查詢的數據的範圍大,索引不生效
    • 比較運算符:> < >= <= !=
    • between and
      • select * from 表 limit 1000000,5
      • select * from 表 where id between 1000000 and 1000005;
    • like,結果的範圍大,索引不生效
      • 若是 abc% 索引生效,%abc索引就不生效
  2. 若是索引列內容的區分度不高,索引不生效
  3. 索引列在條件中參與計算,索引不生效
    • select * from s1 where id*10 = 1000000;
  4. 對兩列內容進行條件查詢
    • and
      • and條件兩端的內容,優先選擇一個有索引的,而且樹形結構更好的,來進行查詢
      • 兩個條件都成立才能完成where條件,先完成範圍小的縮小後面條件的壓力
      • select * from s1 where id =1000000 and email = 'eva1000000@oldboy';
    • or
      • or條件的,不會進行優化,只是根據條件從左到右依次篩選
      • 條件中帶有or的要想命中索引,這些條件中全部的列都是索引列
      • select * from s1 where id =1000000 or email = 'eva1000000@oldboy';
  5. 不知足聯合索引的最左前綴原則,索引不生效
    • 最左前綴原則 :在聯合索引中,條件必須含有在建立索引的時候的第一個索引列

5、數據備份和恢復

  • 數據備份:使用的再也不是mysql.exe,而是mysqldump.exepython

    #語法:
    mysqldump -h 服務器 -u用戶名 -p密碼 數據庫名 > 備份文件.sql
    
    #示例:
    #單庫備份
    mysqldump -uroot -p123 db1 > db1.sql
    mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql
    
    #多庫備份
    mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql
    
    #備份全部庫
    mysqldump -uroot -p123 --all-databases > all.sql
  • 數據恢復:mysql

    #方法一:
    [root@egon backup]# mysql -uroot -p123 < /backup/all.sql
    
    #方法二:
    mysql> use db1;
    mysql> SET SQL_LOG_BIN=0;   #關閉二進制日誌,只對當前session生效
    mysql> source /root/db1.sql    #主要使用這種方式

6、事務和鎖

  • 關鍵字:begin,for update,commit正則表達式

    begin;     # 開啓事務
    select * from emp where id = 1 for update;  # 查詢id值,for update添加行鎖;
    update emp set salary=10000 where id = 1;   # 完成更新
    commit;    # 提交事務,此時鎖才結束
相關文章
相關標籤/搜索