1. 程式人生 > 其它 >mysql複習整理

mysql複習整理

mysql

1. 對資料庫操作

create

create database NAME
character set UTF8
collate XXX;

alter

alter database NAME
character set UTF8
collate XXX;

drop

drop database NAME;

show

show databases;

2. 對錶操作

create

create table TABLENAME(
VARNAME_1 datatype not null ,
name varchar(10) not null,
gender tinyint(1) not null default 1,
primary key(varname_1)
)engine=innodb default charset=gbk;

複製表:

create table employee_1 like employee;//複製結構沒有資料
create table employee_1 as (select* from employee);//複製結構和資料

alter

alter table TABLENAME
[選項];
alter table dbem add userid int(10)null;
alter table 用於更改表的結構而不是資料

  • add(新增列)

  • 直接 set charset =

  • change(列名重定義)

    alter table department change departname nameafter tinyint(2);

  • modify(修改資料型別)

    alter table department modify COLNAME char(2);

  • drop(刪除列)

    alter table department
    drop COL_1,
    drop COL_2;

  • rename(重命名錶)

    alter table department rename to NAME_2;
    也可以直接修改表名:
    rename table department to NAME_2;

  • order by(排序)

drop

drop table department;

3. 對資料操作

insert

insert into TABELNAME values(10002,"張三",1);(插入新記錄)
insert into TABLENAME select*from TABLE2 where id=1001;(從已有的表選擇資料插入)

update

update TABLENAME 
set id=1001
where name="張三";(基礎用法)

update TABLENAME  set dpartid=case empid
when 1001 then 5
when 1002 then 4
end
where empid in(1001,1002,1003);

delete

delete from TABELNAME
where id=1001;

4. 關係運算(select)

基本:select ...from...where...

select name,gender
from employee
where salary>10000;

消除重複行:distinct

select distinct depart,gender
from employee;

修改顯示名:as

select address as 地址
from employee;

聚和函式

COUNT求組中項數,返回 int 型別整數
MAX求最大值
MIN求最小值
SUM返回表示式中所有值的和
AVG求組中值的平均值
STD或STDDEV返回給定表示式中所有值的標準差
VARIANCE返回給定表示式中所有值的方差
GROUP_CONCAT返回由屬於一組的列值連線組合而成的結果BIT_AND邏輯或
BIT_OR邏輯與
BIT_XOR邏輯異或

  • count

    select gender ,count(gender) as num
    from employee
    group by gender;
    
  • max

    select max(income-outcome),min(income-outcome)
    from salary
    where employeeid in (
    select employeeid from employee where departmentid=1);
    
  • min

  • sum

  • avg

查詢方式

  • 子查詢:select巢狀

    select *from employee
    where departmentid in(
    select departmentid 
    from department 
    where departname="財務部");
    
  • 連線查詢:join on

    select* from employee join salary on employee.employeeid=salary.employeeid
    where id =1001;
    
    • 內連線

      關鍵字:innerjoinon
      語句:select * from a_table a inner join b_table b on a.a_id = b.b_id;
      說明:組合兩個表中的記錄,返回關聯欄位相符的記錄,也就是返回兩個表的交集(陰影)部分。

    • 外連線

      • 左外連線

        關鍵字:left join on / left outer join on

        語句:SELECT* FROM a left join b ON a.a_id = b.b_id;

        說明: left join 是left outer join的簡寫,它的全稱是左外連線,是外連線中的一種。 左(外)連線,左表(a_table)的記錄將會全部表示出來,而右表(b_table)只會顯示符合搜尋條件的記錄。右表記錄不足的地方均為NULL。

      • 右外連線

        關鍵字:right join on / right outer join on

        語句:SELECT* FROM a right outer join b on a.a_id = b.b_id;

        說明:right join是right outer join的簡寫,它的全稱是右外連線,是外連線中的一種。與左(外)連線相反,右(外)連線,左表(a_table)只會顯示符合搜尋條件的記錄,而右表(b_table)的記錄將會全部表示出來。左表記錄不足的地方均為NULL。

    • 全連線

      關鍵字:union /union all

      語句:(select colum1,colum2...columN from tableA ) union (select colum1,colum2...columN from tableB )

      或 (select colum1,colum2...columN from tableA ) union all (select colum1,colum2...columN from tableB );

      union語句注意事項:

      1.通過union連線的SQL它們分別單獨取出的列數必須相同;

      2.不要求合併的表列名稱相同時,以第一個sql 表列名為準;

      3.使用union 時,完全相等的行,將會被合併,由於合併比較耗時,一般不直接使用 union 進行合併,而是通常採用union all 進行合併;

      4.被union 連線的sql 子句,單個子句中不用寫order by ,因為不會有排序的效果。但可以對最終的結果集進行排序;

      (select id,name from A order by id) union all (select id,name from B order by id); //沒有排序效果

      (select id,name from A ) union all (select id,name from B ) order by id; //有排序效果

      	union 會刪除重複列,union all 會顯示所有列,包括重複的
      

分組:group by

排序:order by

having

select departname,count (employee.departmentid) as num
where employee join department on employee.departmentid=department.departmentid
group by employee.departmentid
having num>2;

其它

limite

5. 檢視view

  1. (使用者使用簡單)為使用者集中資料,簡化使用者的資料查詢和處理。有時使用者所需要的資料分散在多個表中,定義檢視可將它們集中在一起,從而方便使用者的資料查詢和處理
  2. (資料庫使用簡單)遮蔽資料庫的複雜性。使用者不必瞭解複雜的資料庫中的表結構,並且資料庫表的更改也不影響使用者對資料庫的使用
  3. (安全)簡化使用者許可權的管理。只需授予使用者使用檢視的許可權,而不必指定使用者只能使用表的特定列,也增加了安全性
  4. 便於資料共享。各使用者不必都定義和儲存自己所需的資料,可共享資料庫的資料,這樣同樣的資料只需儲存一次
  5. 可以重新組織資料以便輸出到其他應用程式中

不可更新檢視

如果檢視包含下述結構中的一種,則檢視不可更新(就是不能通過更改檢視修改原表,可更新檢視可以通過insert,update,delete等命令改動原表的資料)
(1)聚合函式;
(2)(2)DISTINCT關鍵字;
(3)(3)GROUP BY子句;
(4)ORDER BY子句;
(5)HAVING子句;
(6)UNION運算子;
(7)位於選擇列表中的子查詢;
(8)FROM子句中包含多個表;
(9)SELECT語句中引用了不可更新檢視;
(10)WHERE子句中的子查詢,引用FROM子句中的表;

使用create view v as select* from table建立檢視其實是create view v as select id as id,name as name;所以檢視修改表結構是看不到修改的,但後臺確實改了。

create

create view v_dp as
select name,gender from department;

drop

6. 索引index

InnoDB 是系統的預設引擎,支援可靠的事務處理。
使用下面的語句可以修改資料庫臨時的預設儲存引擎

  • InnoDB 支援事務,支援行級別鎖定,支援 B-tree、Full-text 等索引,不支援 Hash 索引;
  • MyISAM 不支援事務,支援表級別鎖定,支援 B-tree、Full-text 等索引,不支援 Hash 索引;
  • Memory 不支援事務,支援表級別鎖定,支援 B-tree、Hash 等索引,不支援 Full-text 索引;
  • NDB 支援事務,支援行級別鎖定,支援 Hash 索引,不支援 B-tree、Full-text 等索引;
  • Archive 不支援事務,支援表級別鎖定,不支援 B-tree、Hash、Full-text 等索引;

普通索引

作用:加速查詢

create index name on s1(name); #新增普通索引

唯一索引

  • 主鍵索引:primary key :加速查詢+約束(不為空且唯一)

  • 唯一索引:unique :加速查詢+約束(唯一)

    alter table s1 add primary key(id); #新增住建索引,也就是給id欄位增加一個主鍵約束
    create unique age on s1(age);新增唯一索引
    

聯合索引

  • primary key(id,name):聯合主鍵索引
  • unique (id,name):聯合唯一索引
  • index(id,name):聯合普通索引
  • create index name on s1(id,name); #新增普通聯合索引

全文索引fulltext

用於搜尋一篇很長的文章的時候效果最好

create,drop

7.參照完整性

MySQL參照完整性一般是通過MySQL外來鍵(foreign key)實現的。
外來鍵(僅innoDB支援)所引用表的列必須是主鍵。
外來鍵宣告包括三個部分:
A、哪個列或列組合是外來鍵
B、指定外來鍵參照的表和列
C、參照動作[cascade(級聯操作),restrict(拒絕操作),set null(設為空),no action,set default]。
如果外來鍵約束指定了參照動作,主表記錄做修改,刪除,從表引用的列會做相應修改,或不修改,拒絕修改或設定為預設值。
引用表的列名必須是主鍵,且在刪除主表時必須刪除引用關係或者刪除當前表。
-- 多對多關係

-- 建立teacher表格

CREATE TABLE teacher (
id INT,
NAME VARCHAR (20) NOT NULL,
gender CHAR (2) NOT NULL,
PRIMARY KEY (id)
);

-- 建立學生表格

CREATE TABLE student (
id INT,
NAME VARCHAR (20) NOT NULL,
age INT NOT NULL
);
ALTER TABLE student ADD PRIMARY KEY (id);

-- 第三張關係表

CREATE TABLE tch_std (
teacher_id INT,
student_id INT,
CONSTRAINT fk_teacher FOREIGN KEY (teacher_id) REFERENCES teacher (id),
CONSTRAINT fk_student FOREIGN KEY (student_id) REFERENCES teacher (id)
);

8. 儲存過程procedure

delimiter $$
create procedure emnum
begin
declare num int;
select count(*) into num from employee;
select num;
end $$
delimiter :

create

delimiter $$
create procedure comp(in id1 int, in id2 int)
begin
declare num1 double;
declare num2 double;
declare comp int;
select income-outcome into num1 from salary where employeeid=id1;
select income-outcome into num2 from salary where employeeid=id2;
if(num1>num2)
then set comp=0;
else set comp=0;
select comp;
end if;
end $$
delimiter ;

call

call comp(1001,1002);

drop

drop procedure comp;

9. 觸發器trigger

在MySQL觸發器中的SQL語句可以關聯表中的任意列。但不能直接使用列的名稱去標誌,那會使系統混淆,因為啟用觸發器的語句可能已經修改、刪除或添加了新的列名,而列的舊名同時存在。因此必須用這樣的語法來標誌:“NEW.column_name”或者“OLD.column_name”。NEW.column_name用來引用新行的一列,OLD.column_name用來引用更新或刪除它之前的已有行的一列。

對於INSERT語句,只有NEW是合法的;對於DELETE語句,只有OLD才合法;而UPDATE語句可以與NEW或OLD同時使用。

create

delimiter $$
create trigger emdelete after delete on employee for each row
begin
delete from salary where employeeid =old.employeeid;
end $$
delimiter ;

drop

drop trigger emdelete;

10. 匯入和備份

匯入load

LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
  -> FIELDS TERMINATED BY ':'
  -> LINES TERMINATED BY '\r\n';
使用load
$ mysqlimport -u root -p --local mytbl dump.txt
password *****

使用mysqlimport

備份select into

SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;

11. 許可權管理

建立使用者

create user 'username'@'localhost' identified by '123456';

修改使用者

use mysql;
select user from mysql.user;
update user set user='user_3' where user='user_2';
alter user 'user_3'@'localhost' identified by'111111';

許可權賦予

grant select,insert,update, delete on employee to user_3@localhost;
flush privileges;
show grants for user_3@localhost;
grant grant option on tablename to user_3@localhost;

收回許可權

revoke select on employee from user_1@localhost;

12. 併發控制

併發控制問題

  • 丟失修改:兩個事務選擇同一行,然後基於最初選定的值更新該行時, 由於每個事務都不知道其他事務的存在,因此最後的更新將重寫由其 他事務所做的更新,導致資料丟失
  • 髒讀:一個事務正在訪問資料,而其他事務正在更新該資料,但尚未 提交,此時會發生髒讀問題,即第一個事務所讀取的資料是“髒”的
  • 不可重複讀:在一個事務內多次讀同一資料,在該事務還沒有結束時, 另外的事務也訪問該資料並對其做修改,從而導致第一個事務兩次讀 取的資料不一樣
  • 幻讀:當一個事務對某行執行了插入或刪除操作時,由於該行在另外 的事務讀取的範圍內,從而導致兩次讀取多出了一行或者消失了一行

隔離

四級隔離級別:定義使用者之間隔離和互動的程度

  • 讀未提交(read uncommitted):可以讀到其他事務還沒有提交的資料, 僅避免丟失修改,會導致大量資料變化,一級封鎖協議
  • 讀已提交(read committed):可以看到其他事務新增的新紀錄,而且 其他事務對現存記錄做出的修改一旦被提交,也可以看到,避免丟失 修改和髒讀,二級封鎖協議
  • 可重複讀(repeatable read):當前在執行的事務的變化無法被看到, 同一事務中執行select數次結果都相同,避免丟失修改、髒讀和不可 重複讀,增強的二級封鎖協議
  • 可序列化(serializable):使用者之間一個接一個執行事務,避免所有並 發控制問題,最大限度的隔離,三級封鎖協議

事務

正確提交
begin;
insert into tablename...;
insert into tablename...;
commit;
回滾
begin;
insert ...
insert...
rollback;
  • 原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
  • 一致性:在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。
  • 隔離性:資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(Serializable)。
  • 永續性:事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。