Mysql數據庫知識梳理--超全整理

一、數據庫基本概述

數據庫(DataBaseDB):指長期保存在計算機的存儲設備上,按照一定規則組織起來,可以被各種用戶或應用共享的數據集合(文件系統)

數據庫管理系統(DataBase Management SystemDBMS):指一種操作和管理數據庫的大型軟件,用於建立、使用和維護數據庫,對數據庫進行統一管理和控制,以保證數據庫的安全性和完整性。用戶通過數據庫管理系統訪問數據庫中的數據。

數據庫軟件應該爲數據庫管理系統,數據庫是通過數據庫管理系統創建和操作的。

數據庫:存儲、維護和管理數據的集合。


二、sql概述

SQLStructure Query Language。(結構化查詢語言)

SQL被美國國家標準局(ANSI)確定爲關係型數據庫語言的美國標準,後來被國際化標準組織(ISO)採納爲關係數據庫語言的國際標準。

各數據庫廠商都支持ISOSQL標準。(普通話)

各數據庫廠商在標準的基礎上做了自己的擴展。(方言)


三、Sql的分類


4.1 DDL

Data Definition Language:數據定義語言,用來定義數據庫對象:庫、表、列等;

使用的關鍵字:CREATEALTERDROP

4.1.1操作數據庫

創建名稱爲mydatabase數據庫

create  database  mydatabase;   //創建數據庫

查看當前數據庫服務器中所有的數據庫

show  databases;

刪除mydatabase數據庫

drop  database  mydatabase;

查看當前使用的數據庫

select  database();

切換數據庫

use  mydatabase;

4.1.2操作數據表

* 創建表語法:

create table 表名(

字段1  字段類型  長度,

字段2  字段類型  長度,

...

字段n  字段類型  長度

);


* MySql常用數據類型:


int

整型

double/float

浮點型,例如double(5,2)表示最多5位,其中必須有2位小數

char

固定長度字符串類型char(10)  'abc       '

varchar

可變長度字符串類型;varchar(10) 'abc'

text

大文本類型

blob

字節類型,多用於存儲圖片

date

日期類型,格式爲:yyyy-MM-dd

time

時間類型,格式爲:hh:mm:ss

timestamp

時間戳類型 yyyy-MM-dd hh:mm:ss  會自動賦值

datetime

日期時間類型 yyyy-MM-dd hh:mm:ss


修改表結構

ALTER TABLE table_name  ADD column_name datatype

ALTER TABLE table_name DROP COLUMN column_name

ALTER TABLE table_name  change COLUMN column_name   datatype



查看錶的字段信息

desc emp;

emp表添加“age”字段(int類型,長度爲5):

alter table emp add age int(5) ;

刪除emp表中age字段:

alter table emp drop age;

修改emp表中name字段的名稱爲rname,類型改爲字符串,長度15

alter table emp change name rname varchar(15);

修改emp表的名稱爲emp2

rename table emp to emp2;

刪除表

drop table emp2 ;


4.2 DML

數據操縱語言;

DML是對表中的數據進行增、刪、改的操作。

INSERT UPDATEDELETE

 

小知識:

mysql中,字符串類型和日期類型都要用單引號括起來。'tom'  '2015-09-04'

空值:null 


4.2.1 插入操作 INSERT:

語法:  INSERT INTO 表名(列名1,列名2 ...VALUES(列值1,列值2...);

注意:  1.列名與列值的類型、個數、順序要一一對應。

2.值不要超出列定義的長度。

3.如果插入空值,使用null

4.插入的日期和字符一樣,都使用引號括起來。

Ø 逐條插入:

INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)

VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');

Ø 批量插入:

INSERT INTO emp VALUES

(2,'zs','m','2015-09-01',10000,'2015-09-01',NULL),

(3,'li','m','2015-09-01',10000,'2015-09-01',NULL),


4.2.2 修改操作 UPDATE:

Ø 語法:UPDATE 表名 SET 列名1=列值1,列名2=列值2 …… WHERE 列名=

注:如果沒有where條件,那麼將會對所有行進行修改

 

練習:在修改上面創建的emp員工表

將所有員工薪水修改爲5000元。

UPDATE emp SET salary=5000

將姓名爲’tom’的員工薪水修改爲3000元。

UPDATE emp SET salary=3000 WHERE name=tom;

將姓名爲 ’lili’ 的員工薪水修改爲4000,job改爲’HR’。

 UPDATE emp SET salary=4000,job=HRWHERE name='lili';

tom的薪水在原有基礎上增加1000元。

 UPDATE emp SET salary=salary+1000 WHERE name='tom';


4.2.3 刪除操作 DELETE:

語法 delete from 表名 【WHERE 列名=值】

練習

刪除表中名稱爲zs’的記錄。

delete from emp where name=zs;

刪除表中所有記錄。

delete from emp;

注:不加where條件,會將表中所有數據刪除


4.3 DQL

DQLData Query Language):數據查詢語言,用來查詢表中記錄(數據)。使用SELECT命令;數據庫執行DQL語句不會對數據進行改變,而是讓數據庫發送結果集給客戶端。查詢返回的結果集是一張虛擬表。

語法: SELECT 列名1, 列名2…列名n  from表名

WHERE --> GROUP BY -->HAVING--> ORDER BY

解析:

SELECT  column1, column1…columnN   /*要查詢的列名稱*/

FROM   tablename     /*要查詢的表名稱*/

WHERE  condition    /*行條件*/

GROUP BY  grouping_columns  /*對結果分組*/

HAVING    condition           /*分組後的行條件*/

ORDER BY  sorting_columns    /*對結果排序*/

LIMIT  offset_start, row_count  /*結果限定*/


1 基礎查詢

1.1 查詢所有列

SELECT * FROM stu;

1.2 查詢指定列

SELECT sid, sname, age FROM stu;

2 條件查詢

2.1運算符及關鍵字

條件查詢就是在查詢時給出WHERE子句,WHERE子句中可以使用如下運算符及關鍵字:

Ø =!=<><<=>>=

Ø BETWEENAND

Ø IN(.)

Ø IS NULLIS NOT NULL

Ø AND

Ø OR

Ø NOT


2.2 查詢性別爲女,並且年齡小於50的記錄

  SELECT * FROM stu

WHERE gender='female' AND age<50;

2.3 查詢學號爲S_1001,或者姓名爲liSi的記錄

SELECT * FROM stu

WHERE sid ='S_1001' OR sname='liSi';

2.4 查詢學號爲S_1001S_1002S_1003的記錄

SELECT * FROM stu

WHERE sid IN ('S_1001','S_1002','S_1003');

2.5 查詢學號不是S_1001S_1002S_1003的記錄

SELECT * FROM tab_student

WHERE s_number NOT IN ('S_1001','S_1002','S_1003');

2.6 查詢年齡爲null的記錄

SELECT * FROM stu

WHERE age IS NULL;

2.7 查詢姓名不爲null的學生記錄

SELECT *

FROM stu

WHERE sname IS NOT NULL;

或者

SELECT *

FROM stu

WHERE NOT sname IS NULL;


2.8 查詢年齡在2040之間的學生記錄

SELECT *

FROM stu

WHERE age>=20 AND age<=40;

或者

SELECT *

FROM stu

WHERE age BETWEEN 20 AND 40;


3 模糊查詢

當想查詢姓名中包含a字母的學生時,需要使用模糊查詢。

關鍵字:LIKE

通配符:

l _ (下劃線)代表任意一個字符

l % (百分號)代表任意0 ~ n個字符

3.1 查詢姓名由5個字母構成的學生記錄

SELECT *

FROM stu

WHERE sname LIKE '_ _ _ _ _';5個下劃線)

模糊查詢必須使用LIKE關鍵字。其中 “_”匹配任意一個字母,5個“_”表示5個任意字母。

3.2 查詢姓名由5個字母構成,並且第5個字母爲“i”的學生記錄

SELECT *

FROM stu

WHERE sname LIKE '_ _ _ _ i';

3.3 查詢姓名以“z”開頭的學生記錄

SELECT *

FROM stu

WHERE sname LIKE 'z%';

其中%”匹配0~n個任何字母。

3.4 查詢姓名中第2個字母爲“i”的學生記錄

SELECT *

FROM stu

WHERE sname LIKE '_i%';

3.5 查詢姓名中包含“a”字母的學生記錄

SELECT *

FROM stu WHERE sname LIKE '%a%';

4 字段控制查詢

4.1 去除重複記錄

如果需要找出表中的某一列有哪些不同的值,可以使用DISTINCT關鍵字(去重複值)

Select distinct 列名稱 from 表名稱

4.2 字段之間的運算

Ø 查看僱員的月薪與佣金之和

  如果表中的兩列字段的類型都是數值類型,可以做算數運算。

SELECT *,sal+comm FROM emp;

如果相加的兩列中的其中一列值爲null,相加後得出的結果還是爲null,因爲任何數值與NULL相加結果還是NULL,所以結算結果可能會出現NULL需要使用ifnull()函數把NULL轉換成數值0 

SELECT *,sal+IFNULL(comm,0) FROM emp;

4.3 爲列名添加別名

在上面查詢結果中,出現列名爲sal+IFNULL(comm,0),這很不美觀,現在我們給這一列給出一個別名,爲total

SELECT *, sal+IFNULL(comm,0) as total  FROM emp;as可以省略)

4.4 爲表添加別名

Select s.sid,s.sname,s.* from t_student  s;

爲表添加別名,直接在表明後添加即可;這樣就可以通過別名的方式調用表中的字段。

5 排序  

order by 列名 asc(默認- 升序)  /  desc(降序)

5.1 查詢所有學生記錄,按年齡升序排序

SELECT  *  FROM  stu  ORDER BY  sage  asc ; asc可以省略)

5.2 查詢所有學生記錄,按年齡降序排序

SELECT  *  FROM  stu  ORDER BY  age  desc ;

5.3 查詢所有僱員,按月薪降序排序,月薪相同時,按編號升序

SELECT * FROM  emp ORDER BY  sal  DESC  , empno  ASC;

6 聚合函數

sum()avg()max()min() count()

聚合函數是用來做縱向運算的函數:

l COUNT():統計指定列不爲NULL的記錄行數;

l MAX():計算指定列的最大值,如果指定列是字符串類型,那麼使用字符串排序運算;

l MIN():計算指定列的最小值,如果指定列是字符串類型,那麼使用字符串排序運算;

l SUM():計算指定列的數值和,如果指定列類型不是數值類型,那麼計算結果爲0

l AVG():計算指定列的平均值,如果指定列類型不是數值類型,那麼計算結果爲0

6.1COUNT

查詢emp表中記錄數:

SELECT COUNT(*) AS cnt FROM emp;

SELECT COUNT(1) AS cnt FROM emp;(效率更高,推薦使用)

查詢emp表中有佣金的人數:

SELECT COUNT(comm) cnt FROM emp;

注意,因爲count()函數中給出的是comm列,那麼只統計comm列非NULL的行數。

查詢emp表中月薪大於2500的人數:

SELECT  OUNT(*)  ROM  emp  WHERE  sal  >  2500;

統計月薪與佣金之和大於2500元的人數:

SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;

6.2SUMAVG

當需要縱向求和時使用sum()函數。

l 查詢所有僱員月薪和:

SELECT SUM(sal) FROM emp;

l 統計所有員工平均工資:

SELECT AVG(sal) FROM emp;

6.3MAXMIN

l 查詢最高工資和最低工資:

SELECT MAX(sal), MIN(sal) FROM emp;


7 分組查詢

當需要分組查詢時需要使用GROUP BY子句;

例如查詢每個部門的工資和(部門,工資),這說明要使用部門來分組,對每個部門的工資求和;

select deptno,sum(sal) from emp group by deptno;

注:凡和聚合函數同時出現的列名,一定要寫在group by 之後作爲分組維度。

7.1 分組查詢

l 查詢每個部門的部門編號和每個部門的工資和:

SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;

l 查詢每個部門的部門編號以及每個部門的人數:

SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;

查詢每個部門的部門編號以及每個部門工資大於1500的人數:

SELECT deptno,COUNT(*)

FROM emp

WHERE sal>1500

GROUP BY deptno;

7.2HAVING子句

查詢工資總和大於90000的部門編號以及工資和:

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno

HAVING SUM(sal) > 90000;

   注:havingwhere的區別:

1. having是在分組後對數據進行過濾.

   where是在分組前對數據進行過濾

2. having後面可以使用聚合函數(統計函數)

           where後面不可以使用聚合函數。

8LIMIT 限定查詢

LIMIT用來限定查詢結果的起始行,以及要顯示的總行數。

8.1 起始行從第0行開始,查詢5行記錄

SELECT * FROM emp LIMIT 0, 5;

注意,起始行從0開始,即第一行開始!

8.2 查詢10行記錄,起始行從3開始

SELECT * FROM emp LIMIT 3, 10;

8.3分頁查詢

如果一頁記錄爲10條,希望查看第3頁記錄應該怎麼查呢?

第一頁記錄起始行爲0, 一共查詢10行;

第二頁記錄起始行爲10,一共查詢10行;

第三頁記錄起始行爲20,一共查詢10行;


4.4 DCL

DCLData Control Language):數據庫控制功能

用來設置或更改數據庫用戶或角色權限的語句,包括(grant,deny,revoke等)語句。在默認狀態下,只有sysadmin,dbcreator,db_ownerdb_securityadmin等人員纔有權力執行DCL


四、數據的完整性

保證用戶輸入的數據保存到數據庫中是正確的,確保數據的完整性就是在創建表時給表中添加約束。

完整性的分類:

> 實體完整性

> 域完整性

> 引用完整性


1、實體完整性

實體:即表中的一行(一條記錄)代表一個實體對象(entity

實體完整性指表中行的完整性。要求表中的所有行都有唯一的標識符,稱爲主關鍵字。

約束類型: 主鍵約束(primary key  唯一約束(unique)  自動增長列(auto_increment)

1.1主鍵約束(primary key)

特點:數據唯一,且不能爲null

Ø 第一種添加方式:

CREATE TABLE student(

Id int primary key not null,

Name varchar(50)

);

Ø 第二種添加方式

CREATE TABLE student(

id int,

Name varchar(50),

Primary key(id)

);

此種方式優勢在於,可以創建聯合主鍵多個字段組合起來做爲一個表的主鍵

CREATE TABLE student(

id int,

Name varchar(50),

Primary key(idname)

);

Ø 第三種添加方式:

CREATE TABLE student(

Id int,

Name varchar(50)

);

ALTER TABLE student

ADD  PRIMARY KEY (id);


1.2唯一約束(unique)

添加唯一約束

方式1

CREATE TABLE student(

Id int primary key,

Name varchar(50) unique

);

方式2

CREATE TABLE student(

Id int primary key,

Name varchar(50)

);

ALTER TABLE emp2

ADD  UNIQUE  (name);

使用場景:新浪微博校驗用戶名唯一

1.3自動增長(auto_increment)

給主鍵添加自動增長的數值,列只能是整數類型,但是如果刪除之前增長的序號,後面再添加的時候序號不會重新開始,而是會接着被刪除的那一列的序號

CREATE TABLE student(

Id int primary key auto_increment,

Name varchar(50)

);

INSERT INTO student(name) values(‘tom’);

2、域完整性

域完整性指列的值域的完整性保證表中某些列不能輸入無效的值。

2.1 數據類型

包括:數值類型、日期類型、字符串類型…

例如如果屬性類型是整數,那麼它就不能是101.5或任何非整數。


2.2 非空約束 not null

CREATE TABLE student(

Id int pirmary key,

Name varchar(50) not null,

Sex varchar(10)

);

INSERT INTO student values(1,’tom’,null);

2.3 默認值約束 default

CREATE TABLE student(

Id int pirmary key,

Name varchar(50) not null,

Sex varchar(10) default ‘男’

);

insert into student1 values(1,'tom','');

insert into student1 values(2,'jerry',default);


2、引用完整性

3.1  表與表之間的關係

3.1.1一對一

例如t_person表和t_card表,即公民表和身份證表。這種情況需要找出主從關係,即誰是主表,誰是從表。人可以沒有身份證(黑戶),但每一張身份證必須要有對應的公民,所以人是主表,而身份證是從表。

設計從表可以有兩種方案:

1、在t_card表中添加“外鍵列”(指向t_person表主鍵)並且給外鍵添加唯一約束

2、給t_card表的主鍵添加外鍵約束(相對t_person表),即t_card表的主鍵也是外鍵


3.1.2一對多

例如班級與學生的關係(t_classt_student)從t_class的角度來看是一對多,從t_student的角度來看就是多對一

處理方式:在多方表中創建外鍵字段(class_id),指向一方表的主鍵(cid

 

3.1.3多對多

例如t_stut_teacher表,即一個學生可以有多個老師,而一個老師也可以有多個學生。這種情況通常需要創建中間表來處理多對多關係。例如再創建一張表t_stu_tea表,給出兩個外鍵,一個相對t_stu表的外鍵,另一個相對t_teacher表的外鍵。

 


3.2  引用完整性

引用完整性又稱參照完整性。引用完整性用來保證主表和從表之間的數據一致性,它通過主鍵(PRIMARY KEY)約束和外鍵(FOREIGN KEY)約束來實現。


五、多表查詢

多表查詢有如下幾種:

合併結果集(聯合查詢):UNION UNION ALL(縱向拼接)

l 連接查詢

Ø 內連接  [INNER] JOIN ON

Ø 外連接  OUTER JOIN ON

² 左外連接 LEFT [OUTER] JOIN

² 右外連接 RIGHT [OUTER] JOIN

² 全外連接(MySQL不支持)FULL JOIN

Ø 自然連接  NATURAL JOIN

l 子查詢

1 合併結果集

a) 合併結果集就是把兩個select語句的查詢結果合併到一起(縱向拼接)

b) 合併結果集有兩種方式:

l UNION:去除重複記錄,例如:SELECT * FROM t1 UNION SELECT * FROM t2

l UNION ALL:不去除重複記錄,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2



六、MySQL函數

一、數學函數
ABS(x)   返回x的絕對值
BIN(x)   返回x的二進制(OCT返回八進制,HEX返回十六進制)
CEILING(x)   返回大於x的最小整數值
EXP(x)   返回值e(自然對數的底)的x次方
FLOOR(x)   返回小於x的最大整數值
GREATEST(x1,x2,...,xn)返回集合中最大的值
LEAST(x1,x2,...,xn)      返回集合中最小的值
LN(x)                    返回x的自然對數
LOG(x,y)返回x的以y爲底的對數
MOD(x,y)                 返回x/y的模(餘數)
PI()返回pi的值(圓周率)
RAND()返回0到1內的隨機值,可以通過提供一個參數(種子)使RAND()隨機數生成器生成一個指定的值。
ROUND(x,y)返回參數x的四捨五入的有y位小數的值
SIGN(x) 返回代表數字x的符號的值
SQRT(x) 返回一個數的平方根
TRUNCATE(x,y)            返回數字x截短爲y位小數的結果

二、聚合函數(常用於GROUP BY從句的SELECT查詢中)
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的個數
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col) 返回由屬於一組的列值連接組合而成的結果

三、字符串函數
ASCII(char)返回字符的ASCII碼值
BIT_LENGTH(str)返回字符串的比特長度
CONCAT(s1,s2...,sn)將s1,s2...,sn連接成字符串
CONCAT_WS(sep,s1,s2...,sn)將s1,s2...,sn連接成字符串,並用sep字符間隔
INSERT(str,x,y,instr) 將字符串str從第x位置開始,y個字符長的子串替換爲字符串instr,返回結果
FIND_IN_SET(str,list)分析逗號分隔的list列表,如果發現str,返回str在list中的位置
LCASE(str)或LOWER(str) 返回將字符串str中所有字符改變爲小寫後的結果
LEFT(str,x)返回字符串str中最左邊的x個字符
LENGTH(s)返回字符串str中的字符數
LTRIM(str) 從字符串str中切掉開頭的空格
POSITION(substr,str) 返回子串substr在字符串str中第一次出現的位置
QUOTE(str) 用反斜槓轉義str中的單引號
REPEAT(str,srchstr,rplcstr)返回字符串str重複x次的結果
REVERSE(str) 返回顛倒字符串str的結果
RIGHT(str,x) 返回字符串str中最右邊的x個字符
RTRIM(str) 返回字符串str尾部的空格
STRCMP(s1,s2)比較字符串s1和s2
TRIM(str)去除字符串首部和尾部的所有空格
UCASE(str)或UPPER(str) 返回將字符串str中所有字符轉變爲大寫後的結果

四、日期和時間函數
CURDATE()或CURRENT_DATE() 返回當前的日期
CURTIME()或CURRENT_TIME() 返回當前的時間
DATE_ADD(date,INTERVAL int keyword)返回日期date加上間隔時間int的結果(int必須按照關鍵字進行格式化),如:SELECTDATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);
DATE_FORMAT(date,fmt)  依照指定的fmt格式格式化日期date值
DATE_SUB(date,INTERVAL int keyword)返回日期date加上間隔時間int的結果(int必須按照關鍵字進行格式化),如:SELECTDATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);
DAYOFWEEK(date)   返回date所代表的一星期中的第幾天(1~7)
DAYOFMONTH(date)  返回date是一個月的第幾天(1~31)
DAYOFYEAR(date)   返回date是一年的第幾天(1~366)
DAYNAME(date)   返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
FROM_UNIXTIME(ts,fmt)  根據指定的fmt格式,格式化UNIX時間戳ts
HOUR(time)   返回time的小時值(0~23)
MINUTE(time)   返回time的分鐘值(0~59)
MONTH(date)   返回date的月份值(1~12)
MONTHNAME(date)   返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
NOW()    返回當前的日期和時間
QUARTER(date)   返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
WEEK(date)   返回日期date爲一年中第幾周(0~53)
YEAR(date)   返回日期date的年份(1000~9999)
一些示例:
獲取當前系統時間:SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());
SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE);
SELECT EXTRACT(DAY_SECOND FROM CURRENT_DATE);
SELECT EXTRACT(HOUR_MINUTE FROM CURRENT_DATE);
返回兩個日期值之間的差值(月數):SELECT PERIOD_DIFF(200302,199802);
在Mysql中計算年齡:
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)),'%Y')+0 AS age FROM employee;
這樣,如果Brithday是未來的年月日的話,計算結果爲0。
下面的SQL語句計算員工的絕對年齡,即當Birthday是未來的日期時,將得到負值。
SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthday, '%Y') -(DATE_FORMAT(NOW(), '00-%m-%d') <DATE_FORMAT(birthday, '00-%m-%d')) AS age from employee

五、加密函數
AES_ENCRYPT(str,key)  返回用密鑰key對字符串str利用高級加密標準算法加密後的結果,調用AES_ENCRYPT的結果是一個二進制字符串,以BLOB類型存儲
AES_DECRYPT(str,key)  返回用密鑰key對字符串str利用高級加密標準算法解密後的結果
DECODE(str,key)   使用key作爲密鑰解密加密字符串str
ENCRYPT(str,salt)   使用UNIXcrypt()函數,用關鍵詞salt(一個可以惟一確定口令的字符串,就像鑰匙一樣)加密字符串str
ENCODE(str,key)   使用key作爲密鑰加密字符串str,調用ENCODE()的結果是一個二進制字符串,它以BLOB類型存儲
MD5()    計算字符串str的MD5校驗和
PASSWORD(str)   返回字符串str的加密版本,這個加密過程是不可逆轉的,和UNIX密碼加密過程使用不同的算法。
SHA()    計算字符串str的安全散列算法(SHA)校驗和
示例:
SELECT ENCRYPT('root','salt');
SELECT ENCODE('xufeng','key');
SELECT DECODE(ENCODE('xufeng','key'),'key');#加解密放在一起
SELECT AES_ENCRYPT('root','key');
SELECT AES_DECRYPT(AES_ENCRYPT('root','key'),'key');
SELECT MD5('123456');
SELECT SHA('123456');

六、控制流函數
MySQL有4個函數是用來進行條件操作的,這些函數可以實現SQL的條件邏輯,允許開發者將一些應用程序業務邏輯轉換到數據庫後臺。
MySQL控制流函數:
CASE WHEN[test1] THEN [result1]...ELSE [default] END如果testN是真,則返回resultN,否則返回default
CASE [test] WHEN[val1] THEN [result]...ELSE [default]END  如果test和valN相等,則返回resultN,否則返回default
IF(test,t,f)   如果test是真,返回t;否則返回f
IFNULL(arg1,arg2) 如果arg1不是空,返回arg1,否則返回arg2
NULLIF(arg1,arg2) 如果arg1=arg2返回NULL;否則返回arg1
這些函數的第一個是IFNULL(),它有兩個參數,並且對第一個參數進行判斷。如果第一個參數不是NULL,函數就會向調用者返回第一個參數;如果是NULL,將返回第二個參數。
如:SELECT IFNULL(1,2), IFNULL(NULL,10),IFNULL(4*NULL,'false');
NULLIF()函數將會檢驗提供的兩個參數是否相等,如果相等,則返回NULL,如果不相等,就返回第一個參數。
如:SELECT NULLIF(1,1),NULLIF('A','B'),NULLIF(2+3,4+1);
和許多腳本語言提供的IF()函數一樣,MySQL的IF()函數也可以建立一個簡單的條件測試,這個函數有三個參數,第一個是要被判斷的表達式,如果表達式爲真,IF()將會返回第二個參數,如果爲假,IF()將會返回第三個參數。
如:SELECTIF(1<10,2,3),IF(56>100,'true','false');
IF()函數在只有兩種可能結果時才適合使用。然而,在現實世界中,我們可能發現在條件測試中會需要多個分支。在這種情況下,MySQL提供了CASE函數,它和PHP及Perl語言的switch-case條件例程一樣。
CASE函數的格式有些複雜,通常如下所示:
CASE [expression to be evaluated]
WHEN [val 1] THEN [result 1]
WHEN [val 2] THEN [result 2]
WHEN [val 3] THEN [result 3]
......
WHEN [val n] THEN [result n]
ELSE [default result]
END
這裏,第一個參數是要被判斷的值或表達式,接下來的是一系列的WHEN-THEN塊,每一塊的第一個參數指定要比較的值,如果爲真,就返回結果。所有的WHEN-THEN塊將以ELSE塊結束,當END結束了所有外部的CASE塊時,如果前面的每一個塊都不匹配就會返回ELSE塊指定的默認結果。如果沒有指定ELSE塊,而且所有的WHEN-THEN比較都不是真,MySQL將會返回NULL。
CASE函數還有另外一種句法,有時使用起來非常方便,如下:
CASE
WHEN [conditional test 1] THEN [result 1]
WHEN [conditional test 2] THEN [result 2]
ELSE [default result]
END
這種條件下,返回的結果取決於相應的條件測試是否爲真。
示例:
mysql>SELECT CASE 'green'
     WHEN 'red' THEN 'stop'
     WHEN 'green' THEN 'go' END;
SELECT CASE 9 WHEN 1 THEN 'a' WHEN 2 THEN 'b' ELSE 'N/A' END;
SELECT CASE WHEN (2+2)=4 THEN 'OK' WHEN(2+2)<>4 THEN 'not OK' END ASSTATUS;
SELECT Name,IF((IsActive = 1),'已激活','未激活') AS RESULT FROMUserLoginInfo;
SELECT fname,lname,(math+sci+lit) AS total,
CASE WHEN (math+sci+lit) < 50 THEN 'D'
WHEN (math+sci+lit) BETWEEN 50 AND 150 THEN 'C'
WHEN (math+sci+lit) BETWEEN 151 AND 250 THEN 'B'
ELSE 'A' END
AS grade FROM marks;
SELECT IF(ENCRYPT('sue','ts')=upass,'allow','deny') AS LoginResultFROM users WHERE uname = 'sue';#一個登陸驗證

七、格式化函數
DATE_FORMAT(date,fmt)  依照字符串fmt格式化日期date值
FORMAT(x,y)   把x格式化爲以逗號隔開的數字序列,y是結果的小數位數
INET_ATON(ip)   返回IP地址的數字表示
INET_NTOA(num)   返回數字所代表的IP地址
TIME_FORMAT(time,fmt)  依照字符串fmt格式化時間time值
其中最簡單的是FORMAT()函數,它可以把大的數值格式化爲以逗號間隔的易讀的序列。
示例:
SELECT FORMAT(34234.34323432,3);
SELECT DATE_FORMAT(NOW(),'%W,%D %M %Y %r');
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
SELECT DATE_FORMAT(19990330,'%Y-%m-%d');
SELECT DATE_FORMAT(NOW(),'%h:%i %p');
SELECT INET_ATON('10.122.89.47');
SELECT INET_NTOA(175790383);

八、類型轉化函數
爲了進行數據類型轉化,MySQL提供了CAST()函數,它可以把一個值轉化爲指定的數據類型。類型有:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED
示例:
SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;
SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);

九、系統信息函數
DATABASE()   返回當前數據庫名
BENCHMARK(count,expr)  將表達式expr重複運行count次
CONNECTION_ID()   返回當前客戶的連接ID
FOUND_ROWS()   返回最後一個SELECT查詢進行檢索的總行數
USER()或SYSTEM_USER()  返回當前登陸用戶名
VERSION()   返回MySQL服務器的版本
示例:
SELECT DATABASE(),VERSION(),USER();
SELECTBENCHMARK(9999999,LOG(RAND()*PI()));#該例中,MySQL計算LOG(RAND()*PI())表達式9999999次。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章