連接查詢
連接查詢分類如下:
表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 scoresinner join students on scores.stuid=students.idgroup by students.sname;
查詢男生的姓名、總分
select students.sname,avg(scores.score)from scoresinner join students on scores.stuid=students.idwhere students.gender=1group by students.sname;
查詢科目的名稱、平均分
select subjects.stitle,avg(scores.score)from scoresinner join subjects on scores.subid=subjects.idgroup by subjects.stitle;
查詢未刪除科目的名稱、最高分、平均分
select subjects.stitle,avg(scores.score),max(scores.score)from scoresinner join subjects on scores.subid=subjects.idwhere subjects.isdelete=0group by subjects.stitle;
字符串函數
查看字符的ascii碼值ascii(str),str是空串時返回0
select ascii('a');
查看ascii碼值對應的字符char(數字)
select char(97);
拼接字符串concat(str1,str2...)
select concat(12,34,'ab');
包含字符個數length(str)
select length('abc');
截取字符串
left(str,len)返回字符串str的左端len個字符
right(str,len)返回字符串str的右端len個字符
substring(str,pos,len)返回字符串str的位置pos起len個字符
select substring('abc123',2,3);
去除空格
ltrim(str)返回刪除了左空格的字符串str
rtrim(str)返回刪除了右空格的字符串str
trim([方向 remstr from str)返回從某側刪除remstr后的字符串str,方向詞包括both、leading、trailing,表示兩側、左、右
select trim(' bar ');select trim(leading 'x' FROM 'xxxbarxxx');select trim(both 'x' FROM 'xxxbarxxx');select trim(trailing 'x' FROM 'xxxbarxxx');
返回由n個空格字符組成的一個字符串space(n)
select space(10);
替換字符串replace(str,from_str,to_str)
select replace('abc123','123','def');
大小寫轉換,函數如下
lower(str)
upper(str)
select lower('aBcD');
數學函數
求絕對值abs(n)
select abs(-32);
求m除以n的余數mod(m,n),同運算符%
select mod(10,3);select 10%3;
地板floor(n),表示不大于n的最大整數
select floor(2.3);
天花板ceiling(n),表示不小于n的最大整數
select ceiling(2.3);
求四舍五入值round(n,d),n表示原數,d表示小數位置,默認為0
select round(1.6);
求x的y次冪pow(x,y)
select pow(2,3);
獲取圓周率PI()
select PI();
隨機數rand(),值為0-1.0的浮點數
select rand();
還有其它很多三角函數,使用時可以查詢文檔

日期時間函數
獲取子值,語法如下
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)
select year('2016-12-21');
日期計算,使用+-運算符,數字后面的關鍵字為year、month、day、hour、minute、second
select '2016-12-21'+interval 1 day;
日期格式化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');
當前日期current_date()
select current_date();
當前時間current_time()
select current_time();
當前日期時間now()
select now();
視圖
對于復雜的查詢,在多次使用后,維護是一件非常麻煩的事情
解決:定義視圖
視圖本質就是對查詢的一個封裝
定義視圖
create view stuscore asselect students.*,scores.score from scoresinner join students on scores.stuid=students.id;
視圖的用途就是查詢
select * from stuscore;
子查詢
查詢支持嵌套使用
查詢各學生的語文、數學、英語的成績
select sname,(select sco.score from scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle='語文' and stuid=stu.id) as 語文,(select sco.score from scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle='數學' and stuid=stu.id) as 數學,(select sco.score from scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle='英語' and stuid=stu.id) as 英語from students stu;
事務
當一個業務邏輯需要多個sql完成時,如果其中某條sql語句出錯,則希望整個操作都退回
使用事務可以完成退回的功能,保證業務邏輯的正確性
事務四大特性(簡稱ACID)
原子性(Atomicity):事務中的全部操作在數據庫中是不可分割的,要么全部完成,要么均不執行
一致性(Consistency):幾個并行執行的事務,其執行結果必須與按某一順序串行執行的結果相一致
隔離性(Isolation):事務的執行不受其他事務的干擾,事務執行的中間結果對其他事務必須是透明的
持久性(Durability):對于任意已提交事務,系統必須保證該事務對數據庫的改變不被丟失,即使數據庫出現故障
要求:表的類型必須是innodb或bdb類型,才可以對此表使用事務
查看表的創建語句
show create table students;
修改表的類型
alter table '表名' engine=innodb;
事務語句
開啟begin;提交commit;回滾rollback;
示例1
步驟1:打開兩個終端,連接mysql,使用同一個數據庫,操作同一張表
終端1:select * from students;------------------------終端2:begin;insert into students(sname) values('張飛');
步驟2
終端1:select * from students;
步驟3
終端2:commit;------------------------終端1:select * from students;
示例2
步驟1:打開兩個終端,連接mysql,使用同一個數據庫,操作同一張表
終端1:select * from students;------------------------終端2:begin;insert into students(sname) values('張飛');
步驟2
終端1:select * from students;
步驟3
終端2:rollback;------------------------終端1:select * from students;
















