1. 程式人生 > >mysql學習第三天筆記

mysql學習第三天筆記

流程 ali align 笛卡爾積 日期時間 返回日期 至少 trac edi

連接
連接是在多個表之間通過一定的連接條件,使表之間發生關聯,進而能從多個表之間獲取數據。
在 WHERE子句中書寫連接條件。 如果在多個表中出現相同的列名,則需要使用表名作為來自該表的列名的前綴。 N個表相連時,至少需要N-1個連接條件。

第七天(2018/8/1)

日期時間函數

  • CURDATE()和CURRENT_DATE() :獲取當前日期函數;
  • NOW():返回服務器的當前日期和時間;
  • CURTIME():返回當前時間,只包含時分秒;
  • UTC_DATE():返回世界標準時間日期函數;
  • UTC_TIME():返回世界標準時間函數;
  • TIMEDIFF(expr1, expr2):返回兩個日期相減相差的時間數;
  • DATEDIFF(expr1, expr2):返回兩個日期相減相差的天數;
  • DATE_ADD(date,INTERVAL expr type):日期加上一個時間間隔值;
  • DATE_SUB(date,INTERVAL expr type):日期減去一個時間間隔值;
  • DATE(date)、TIME(date)、YEAR(date):選取日期時間的各個部分:
  • EXTRACT(unit FROM date):從日期中抽取出某個單獨的部分或組合;
  • DAYOFWEEK(date) 、DAYOFMONTH(date) 、DAYOFYEAR(date):返回日期在一周、一月、一年中是第幾天
  • DAYNAME、MONTHNAME:返回日期的星期和月份名稱;
  • DATE_FORMAT(date,format):格式化日期;
  • TIME_FORMATE(time,formate):格式化時間;

流程控制函數

  • 常見的控制流程函數如下:

– CASE

– IF

– IFNULL

– NULLIF

  • CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
  • CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
  • 在第一個方案的返回結果中, value=compare-value。
  • 而第二個方案的返回結果是第一種情況的真實結果。如果沒有匹配的結果值,則返回結果為ELSE後的結果,如果沒有ELSE 部分,則返回值為 NULL。
  • SELECT CASE 11 WHEN 1 THEN ‘one‘

WHEN 2 THEN ‘two‘ ELSE ‘more‘ END;

  • SELECT CASE WHEN 1>0 THEN ‘true‘ ELSE ‘false‘ END;

  • IF(expr1,expr2,expr3)

– 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),則 IF()的返回值為expr2; 否則返回值則為 expr3。

– IF() 的返回值為數字值或字符串值,具體情況視其所在語境而定。

– SELECT IF(1>2,2,3);

  • SELECT IF(1<2,‘yes ‘,‘no‘);

  • IFNULL(expr1,expr2)|NULLIF(expr1,expr2)

– 假如expr1 不為NULL ,則IFNULL() 的返回值為expr1 ; 否則其返回值為expr2 。

– IFNULL() 的返回值是數字或是字符串,具體情況取決於其所使用的語境

  • Database():返回使用utf8 字符集的默認( 當前) 數據庫名
  • Version():返回指示MySQL 服務器版本的字符串。
  • User():返回當前MySQL 用戶名和機主名
  • Inet_aton():給出一個作為字符串的網絡地址的點地址表示,返回一個代表該地址數值的整數。
  • Inet_ntoa():給定一個數字網絡地址, 返回作為字符串的該地址的點地址表示。
  • Password(str):從原文密碼str 計算並返回密碼字符串,當參數為NULL 時返回NULL。
  • Md5(str):為字符串算出一個MD5 128 比特檢查和。

多表查詢

  • 笛卡爾積是:

– 第一個表中的所有行和第二個表中的所有行都發生連接。

  • 笛卡爾積在下列情況產生:

– 連接條件被省略

– 連接條件是無效的

  • 為了避免笛卡爾積的產生,通常需要在WHERE子句中包含一個有效的連接條件。

等值連接

用等於號的形式進行多表的連接

例:SELECT ENAME,DNAME,LOC

FROM EMP,DEPT

WHERE EMP.DEPTNO = DEPT.DEPTNO

限制歧義列名

  • 在用到多個表時可以使用表名作前綴來限定列;
  • 通過使用表前綴可以提高性能;
  • 通過使用列的別名可以區分來自不同表但是名字相同的列;

非等值連接

用不等號的形式進行多表連接

例:SELECT ENAME,SAL,GRADE

FROM EMP,SALGRADE

WHERE SAL >= LOSAL

AND SAL <= HISAL

自連接

自身連接,也叫自連接,是一個表通過某種條件和本身進行連接的一種方式,就如同多個表連接一樣

SELECT T1.ENAME 員工姓名,T2.ENAME 上級姓名

FROM EMP T1,EMP T2

WHERE T1.MGR = T2.EMPNO

ANSI SQL:1999標準的連接語法

交叉連接

交叉連接會產生連個表的交叉乘積,和兩個表之間的笛卡爾積是一樣的;

使用CROSS JOIN 子句完成

例:

SELECT *

FROM EMP

CROSS JOIN DEPT

自然連接

自然連接是對兩個表之間相同名字和數據類型的列進行的等值連接;

如果兩個表之間相同名稱的列的數據類型不同,則會產生錯誤;

使用NATURAL JOIN子句來完成

例:

SELECT *

FROM EMP

NATURAL JOIN DEPT

USING子句

自然連接是使用所有名稱和數據類型相匹配的列作為連接條件,而USING子句可以指定用某個或某幾個相同名字和數據類型的列作為連接條件。

例:

SELECT ENAME,DNAME,LOC

FROM EMP

JOIN DEPT

USING (DEPTNO)

註:

如果有若幹個列名稱相同但數據類型不同,自然連接子句可以用USING子句來替換,以指定產生等值連接的列。

如果有多於一個列都匹配的情況,使用USING子句只能指定其中的一列。

USING子句中的用到的列不能使用表名和別名作為前綴。

NATURAL JOIN子句和USING子句是相互排斥的,不能同時使用

ON子句

自然連接條件基本上是具有相同列名的表之間的等值連接;

如果要指定任意連接條件,或指定要連接的列,則可以使用ON子句;

用ON將連接條件和其它檢索條件分隔開,其它檢索條件寫在WHERE子句;

ON子句可以提高代碼的可讀性。

例:

SELECT *

FROM EMP

JOIN DEPT

ON EMP.DEPTNO = DEPT.DEPTNO

JOIN SALGRADE

ON SAL BETWEEN LOSAL AND HISAL

左外連接

左外連接以FROM子句中的左邊表為基表,該表所有行數據按照連接條件無論是否與右邊表能匹配上,都會被顯示出來。

SELECT *

FROM DEPT -- 哪張表需要全部顯示哪張表就是主表,寫在前面

LEFT JOIN EMP

ON DEPT.DEPTNO = EMP.DEPTNO

mysql學習第三天筆記