高級

Mysql高級

一.關係

  • 建立成績表scores,結構以下
    • id
    • 學生
    • 科目
    • 成績
  • 思考:學生列應該存什麼信息呢?
  • 答:學生列的數據不是在這裏新建的,而應該從學生表引用過來,關係也是一條數據;根據範式要求應該存儲學生的編號,而不是學生的姓名等其它信息
  • 同理,科目表也是關係列,引用科目表中的數據
  • 因此建立語句爲:
    create table scores(
    id int primary key auto_increment,
    stuid int,
    subid int,
    score decimal(5,2)--最大五位數字,其中兩位小數
    );

 二.外鍵

  • 思考:怎麼保證關係列數據的有效性呢?任何整數均可以嗎?
  • 答:必須是學生表中id列存在的數據,能夠經過外鍵約束進行數據的有效性驗證
  • 爲stuid添加外鍵約束
alter table score add constraint stu_sco foreign key(stuid) references students(id);
  • 此時插入或者修改數據時,若是stuid的值在students表中不存在則會報錯
  • 在建立表時能夠直接建立約束
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id)
);

外鍵的級聯操做sql

  • 在刪除students表的數據時,若是這個id值在scores中已經存在,則會拋異常
  • 推薦使用邏輯刪除,還能夠解決這個問題
  • 能夠建立表時指定級聯操做,也能夠在建立表後再修改外鍵的級聯操做
  • 語法:
alter table scores add constraint stu_sco foreign key(stuid) reference students(id) on delete cascade;

級聯操做的類型包括:數據庫

  • restrict(限制):默認值,拋異常
  • cascade(級聯):若是主表的記錄刪掉,則從表中相關聯的記錄都將被刪除
  • set null:將外鍵設置爲空
  • no action:什麼都不作

三.鏈接查詢

  • 鏈接查詢分類以下:
    • 表A inner join 表B:表A與表B匹配的行會出如今結果中
    • 表A left join 表B:表A與表B匹配的行會出如今結果中,外加表A中獨有的數據,未對應的數據使用null填充
    • 表A right join 表B:表A與表B匹配的行會出如今結果中,外加表B中獨有的數據,未對應的數據使用null填充
  • 在查詢或條件中推薦使用「表名.列名」的語法
  • 若是多個表中列名不重複能夠省略「表名.」部分
  • 若是表的名稱太長,能夠在表名後面使用' as 簡寫名'或' 簡寫名',爲表起個臨時的簡寫名稱

例如:查詢學生姓名平均分:函數

select students.sname,avg(scores.score)
from scores
inner join students on scores.stuid=students.id
group by students.sname

四.內置函數

A.字符串函數

1).查看字符的ascii碼值ascii(str),str是空串時返回0ui

select ascii('a');

2).查看ascii碼值對應的字符char(數字)spa

select char(97);

3).接字符串concat(str1,str2...)rest

select concat(12,34,'ab');

4).包含字符個數length(str)code

select length('abc');

5).截取字符串orm

  • left(str,len)返回字符串str的左端len個字符
  • right(str,len)返回字符串str的右端len個字符
  • substring(str,pos,len)返回字符串str的位置pos起len個字符
select substring(‘abc123’,2,3);

6).去除空格blog

  • ltrim(str)返回刪除了左空格的字符串str
  • rtrim(str)返回刪除了右空格的字符串str
  • trim([方向 remstr from str)返回從某側刪除remstr後的字符串str,方向詞包括both、leading、trailing,表示兩側、左、右
select trim('       deng     ');--刪除兩側空格
select trim(leading 'x' FROM 'xxxdengxxx');--刪除左側的x
select trim(both 'x' FROM 'xxxdengxxx');--刪除兩側的x
select trim(trailing 'x' FROM 'xxxdengxxx');--刪除右側的x

6).返回由n個空格字符組成的一個字符串space(n)事務

select space(10);

7).替換字符串replace(str,from_str,to_str)

select replace('abc123','123','def');

8).大小寫轉換,函數以下

  • lower(str)
  • upper(str)

B.數學函數

1).求絕對值abs(n)

select abs(-23);

2).求m除以n的餘數mod(m,n),同運算符%

select mod(19,3);
select 19%3;

3).地板floor(n),表示不大於n的最大整數

select floor(2.3);

4).天花板ceiling(n),表示不小於n的最小整數

select ceiling(2.3);

5).求四捨五入值round(n,d),n表示原數,d表示小數位置,默認爲0

select round(1.234,2);

6).求x的y次冪pow(x,y)

select pow(2,3);

7).隨機數rand(),值爲0-1.0的浮點數

select rand();

c.日期時間函數

1).獲取子值,語法以下

  • year(date)返回date的年份(範圍在1000到9999)
  • month(date)返回date中的月份數值
  • day(date)返回date中的日期數值
  • hour(time)返回time的小時數(範圍是0到23)
  • minute(time)返回time的分鐘數(範圍是0到59)
  • second(time)返回time的秒數(範圍是0到59)

2).日期計算,使用+-運算符,數字後面的關鍵字爲year、month、day、hour、minute、second

select '2016-12-21' + interval 1 day;

3).日期格式化date_format(date,format),format參數可用的值以下

  • 獲取年%Y,返回4位的整數
  • 獲取年%y,返回2位的整數
  • 獲取月%m,值爲1-12的整數
  • 獲取日%d,返回整數
  • 獲取時%H,值爲0-23的整數
  • 獲取時%h,值爲1-12的整數
  • 獲取分%i,值爲0-59的整數
  • 獲取秒%s,值爲0-59的整數
select date_format('2016-12-21','%Y %m %d');

4).當前日期current_date()

select current_date();

5).當前時間current_time()

select current_time();

6).當前日期時間now()

select now();

五.視圖

對於複雜的查詢,在對次使用後,維護時一件很是麻煩的事情,視圖能夠解決

視圖本質就是對查詢的一個封裝

定義視圖:

create view stuscore as
select students.*,scores.score from scores
inner join students on scores.stuid=students.id;

視圖的用途就是查詢

select * from stuscore;

六.事務

當一個業務邏輯須要多個sql完成時,若是其中某條sql語句出錯,則但願整個操做都退回

而使用事務能夠完成退回的功能,保證業務邏輯的正確性

事務的四大特性(ACID):

  • 原子性(Atomicity):事務中的所有操做在數據庫中是不可分割的,要麼所有完成,要麼均不執行
  • 一致性(Consistency):幾個並行執行的事務,其執行結果必須與按某一順序串行執行的結果相一致
  • 隔離性(Isolation):事務的執行不受其餘事務的干擾,事務執行的中間結果對其餘事務必須是透明的
  • 持久性(Durability):對於任意已提交事務,系統必須保證該事務對數據庫的改變不被丟失,即便數據庫出現故障

表的類型必須是innodb或bdb類型,才能夠對此表使用事務

查看錶的建立語句:

show create table student;

修改表的類型:

alter table '表名' engine=innodb;

事務語句:

begin開啓;
commit提交;
rollback回滾;

示例:

begininsert into students (sname)values ('老細');
commit
相關文章
相關標籤/搜索