【數據庫】1.mysql相關知識(一)

1. 常用數據庫及基本知識

一般我們需要學習的常用數據庫有三種:mysql、mongodb和redis

  • mysql:關係型數據庫,每秒併發1.2k左右
  • mongodb:非關係型數據庫(也就是文檔型數據庫,類似json,{}),每秒併發大概1.6W
  • redis:鍵值對數據庫,每秒讀的次數是11W,寫的速度是8.1W

需要注意的是:
性能高低排行:redis > mongodb > mysql
可靠性高低排行:mysql > mongodb > redis
所以,數據庫沒有最好,只有最適合

MYSQL配置

  • 配置文件:C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin\mysqld\my.ini
    • port 端口號
    • basedir 安裝目錄
    • datadir 數據存放目錄
    • charcter-set-server 字符集
    • sql-mode 語法模式
    • max-connections 最大連接數

MYSQL啓動和停止

  • 啓動:
    • net start MySQL
  • 停止:
    • net stop MySQL

通過命令行鏈接MYSQL

    mysql -uroot -p123456
    
    //也可以指定IP和端口
    mysql -h 127.0.0.1 -P 3306 -uroot -p123456

    //退出
    exit

查看有哪些數據庫(mysql命令要分號;結尾)

    show databases;

切換數據庫

    use test;

查看當前數據庫

    select database();

查看當前數據庫有哪些表

    show tables;

查看錶的結構

    desc 表名;

    //返回的結果結構如下:
    +---------+------------+----------+---------+---------+------------------+
    |  Field  |    Type    |   Null   |   Key   | Default | Extra            |
    +---------+------------+----------+---------+---------+------------------+
    |   id    |  int(11)   |    No    |   PRI   | NULL    | auto_increment   |
    |  name   |varchar(50) |    YES   |         | NULL    |                  |
    |parent_id|  int(11)   |    YES   |         | NULL    |                  |
    +---------+------------+----------+---------+---------+------------------+

  • Field 字段的名字
  • Type 數據類型
    • int 代表整形
    • float 浮點型(小數)
    • varchar 可變字符串(全稱:variable character)。最大255。假設設定字符串爲4個字符長度,如果不可變字符串的話,字符長度爲2,也會佔用4個長度,長度爲3,也會佔用4個長度。而可變字符串,是幾個字符就站幾個長度,這樣節省空間。
  • Null 是否爲空
  • Key 是否爲主鍵,PRI表示主鍵。
    • 主鍵:這個表中的某個鍵,不能重複,可以唯一表示一個記錄,一張表能有多個主鍵,如果主鍵多個,就表示聯合主鍵,也就是說只要這個聯合主鍵唯一就可以了。
    • 外鍵:別的表中的主鍵。外鍵也可以是這張表的主鍵。
  • Default 默認值
  • Extra 其他

以後這些東西,後面會詳細說明

表的操作注意事項

  • 如果存在外鍵,就說明存在父子表,添加數據應該先添加父表數據再添加子表數據,刪除數據應該先刪除子表數據再刪除父表數據。
  • 主鍵可以唯一表示一條記錄,主鍵可以一個,也可以多個。如果主鍵多個,則表示聯合主鍵,也就是說只要這個聯合主鍵唯一就可以了。

2. 數據完整性

  • 爲了實現數據完整性,需要檢驗數據庫表中的每行和每列數據是否符合要求
  • 在創建表的時候,應該保證以後的數據輸入是正確的,錯誤的數據不允許輸入

2.1 域完整性

不同的字段需要設置爲各種合適的類型,比如年齡就是整數類型

  • 列類型
    • 數值型
      • 整數型
        • tinyint 1個字節
        • smallint 2個字節
        • mediumint 3個字節
        • int 4個字節
        • bigint 8個字節
      • 小數型
        • 浮點
          • float 最大長度32位
          • Double 最大長度64位
        • 定點
          • decimal 用於計算的,比如js中小數計算不太精確,可以使用這種類型實現精確計算
    • 字符串型
      • set 集合,不可重複,比如標籤
      • enum 枚舉類型
      • blob 二進制類型,比如存一個圖片、視頻、音頻
      • text 文本,字符比較多
      • varchar 可變長度
      • char 不可變長度
    • 日期時間型
      • year 年
      • timestamp 時間戳,毫秒數,從1970-01-01 00:00:00 UTC開始
      • time 時間
      • date 日期
      • datetime 日期時間

2.2 默認值

  • 默認值是指如果用戶沒有指定值的情況下記錄的此字段提供一個預先設定的值

比如:可以把居住地默認值設置爲北京

3.2 非空約束

  • 我們可以指定某個字段不能不輸入,必須提供一個非空的值

比如:姓名字段不能爲空

3.實體完整性

什麼叫實體,就是一行行的記錄,一個記錄就是一個實體

3.1主鍵約束

3.1.1 主鍵

  • 表中一列或者幾列組合的值能用來唯一標識表中的每一行,這樣的列或者列組合稱爲表的主鍵,主鍵表的數據不能重複。

如果兩列或者多列組合起來唯一標識表中的每一行,則該主鍵又稱爲“組合鍵”

主鍵的選擇標準
  1. 最少性:儘量選擇單個鍵作爲主鍵
  2. 穩定性,由於主鍵是用來在兩個表間建立連接的,所以不能經常更新,最好就是不更新

3.1.3 唯一約束

  • 唯一約束是指某個字段值是唯一的,在所有的記錄中不能有重複的值

學生的身份證號可以設置爲唯一的約束

3.1.4 標識列

  • 當表中沒有合適的列作爲主鍵時,可以考慮增加標誌列,標識列是一個無實際業務含義的列,僅僅用來區分每條記錄。
  • 標識列的值是自動生成的,不能在該列上輸入數據

思考:如果標識列id的初始值爲1,增長量爲3,則輸入3行數據後,再刪除1行,下次再輸入數據行的時候,標識值自動插入的值是多少?

3.1.5 外鍵約束

  • 一個表的外鍵必須引用一個表的主鍵
  • 住表沒有記錄,子表不能添加相應的記錄
  • 修改和刪除住表記錄,必須先修該或刪除子表的記錄

4. SQL

  • SQL:結構化查詢語句
  • 使用SQL原因:使用界面操作數據庫不方便,所以需要通過應用程序去操作數據庫
  • SQL組成
    1. DDL 數據庫定義語言,主要用在定義或改變表的結構、數據類型、表之間的鏈接和約束等初始化工作上,大多數在簡歷表的時候使用。主要的命令有:
      • CREATE
      • ALTER
      • DROP
      • 。。。
    2. DML 數據庫操作語言,主要用來對數據庫裏的數據進行操作的語言,主要有4條命令:
      • SELECT
      • UPDATE
      • INSERT
      • DELETE
    3. DCL 數據庫控制語言,用來設置或更改數據庫用戶或角色權限的語句,包括grant、revoke等語句
  • 語句必須要分號結尾
  • 要養成大寫的習慣(雖然小寫也支持)

4.1 DDL

  • 示例代碼
    -- 關鍵字要大寫
    CREATE TABLE student
    (
    id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(64) NOT NULL,
    age INT(64) DEFAULT NULL,
    city VARCHAR(64) DEFAULT '北京'
    )
    -- SELECT表示查詢的意思,*代表查詢所有列
    SELECT * FROM student;
    -- 查詢student表的結構
    DESC student;
    -- 如何增加表裏的字段
    ALTER TABLE student ADD COLUMN idcard VARCHAR(64) NULL;
    -- 如何修改表裏的字段
    ALTER TABLE student MODIFY idcard VARCHAR(18) NOT NULL;
    -- 刪除表裏的字段
    ALTER TABLE student DROP idcard;

4.1.1 創建

4.1.1.1 創建表
  • 創建表:CREATE TABLE student()
    • 注意:如果表名是關鍵字,就應該有反引號引起來
      • 舉例:CREATE TABLE table()
4.1.1.2 創建記錄
  • 每條記錄的創建格式爲:filed type null key default extra
    • filed 爲字段名
    • type 數據類型
    • null 是否爲null
    • key 是否爲主鍵
    • default 默認值是多少
    • extra 其他,比如自動增長就是AUTO_INCREMENT
    • 舉例:id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT

4.1.2 查詢

4.1.2.1 查詢列
  • 查詢列:
    • 查詢某一列:SELECT 列名 FROM 表名
      • 舉例:SELECT name FROM student
    • 查詢某幾列:SELECT 列名1,列名2 FROM 表名
      • 舉例:SELECT id,name,age FROM 表名
    • 查詢所有列:SELECT * FROM 表名
      • 舉例:SELECT * FROM student
    • 在某個條件下查詢: SELECT 列名1,列名2,列名3,… FROM 表名 WHERE ADD/OR/NOT等條件語句
      • 舉例:SELECT
4.1.2.2 查詢表結構
  • 查詢表的結構:DESC 表名
    • 舉例:DESC student

4.2.3 修改(增刪改查)

4.2.3.1 增加字段(新增列)
  • 增加表裏的字段(新增列)
    • 格式:ALTER TABLE 表名 ADD CLOUMN <+記錄的創建格式>
      • 舉例:ALTER TABLE student ADD CLOUMN idcard VARCHAR(64) NULL;
    • “ALTER TABLE 表名”中的ALTER TABLE代表“修改表”
4.2.3.2 修改字段
  • 修改表裏的字段
    • 格式: ALTER TABLE 表名 MODIFY <+記錄的創建格式,只寫需要修改的條件即可>
      • 舉例:ALTER TABLE student MODIFY idcard VARCHAR(18) NOT NULL;
4.2.3.3 刪除字段
  • 刪除表裏的字段
    • 格式:ALTER TABLE 表名 DROP 字段名
      • 舉例:ALTER TABLE student DROP idcard;
4.2.3.4 增加約束條件
  • 增加主鍵
    • 格式:ALTER TABLE 表名 ADD PRIMARY KEY(要成爲主鍵的列名)
      • 舉例: ALTER TABLE student ADD PRIMARY KEY(id)
  • 增加唯一的約束
    • 格式:ALTER TABLE 表名 ADD UNIQUE INDEX 新的約束字段名稱 (約束字段)
      • 舉例: ALTER TABLE student ADD UNIQUE INDEX uq_studentz-idcard (idcard)
  • 增加默認約束
    • 格式:ALTER TABLE student MODIFY CLOUMN city 類型 DEFAULT ‘默認值’
      • 舉例:ALTER TABLE student MODIFY CLOUMN city VARCHAR(64) DEFAYKR ‘南京’;
  • 主外鍵
    • 格式:ALTER TABLE 添加外鍵的表名 ADD CONSTRAINT 新增的外鍵名 FOREIGN KEY(當前表對應外鍵的鍵名) REFERENCES 目標數據庫名.目標表名(目標鍵名)
      • 舉例:ALTER TABLE score ADD CONSTRAINT fk_score_student_id FOREIGN KET(student_id) REFERENCES studb.student(id)
## 以上屬於DDL(Data Definition Language,數據庫定義語言),不需要背誦,一般都是視圖操作,如果需要SQL語言代碼,直接導出轉儲SQL文件即可
## 下面的DML(Data Manipulation Language, 數據庫操作語言),需要牢記

4.2 DML

4.2.1 插入數據行

4.2.1.1 語法
    INSERT [INTO] 表名 [(列名)] VALUES (值列表)
  • []內的可以省略
  • 列名跟值列表要一一對應,每一對的順序先後沒關係
4.2.1.2 向學生表中插入一條記錄,姓名張三,身份證號123456,年齡30,城市杭州
    INSERT INTO student(name,idcard,age,city) 
    VALUES('張三','123456',30,'杭州');
4.2.1.3 注意事項
  • 每次插入一行數據,不能只插入一部分數據,插入的數據是否有效將按照整行的完整性要求來檢驗
  • 每個數據值的數據類型、精度、位數必須與對應的列名精確匹配
  • 不能爲標識符指定值
    • 比如上例中不能寫id,因爲id是標誌位,由數據庫自己維護,不能由你來寫
  • 如果某字段設置不能爲空,則必須要插入數據
  • 插入數據時要符合檢查性約束的要求
  • 有缺省值的列,可以用DEFAULT關鍵字來代替插入實際的值

4.2.2 更新數據行

4.2.2.1 語法
    UPDATE 表名 SET 列名 = 更新值[WHERE 更新條件]
4.2.2.2 更新ID等於1的學生年齡改爲40,城市改爲上海
    UPDATE sudent SET age=40,city='上海' WHERE id=1 OR name='張三';
4.2.2.3 注意事項
  • 可以一次更新多列,用逗號隔開
  • 可以指定更新條件,如果有多個條件,用and or not

4.2.3 刪除數據行

4.2.3.1 語法
    DELETE FROM 表名 WHERE 條件
4.2.3.2 刪除id爲2的數據
    DELETE FROM student WHERE id = 2;
4.2.3.3 注意事項
  • 刪除是整行刪除,所以不需要提供列名
  • 如果你要刪除的表示主表,那需要先刪除子表

4.2.4 截斷表

4.2.4.1 語法
    TRUNCATE TABLE 表名;
4.2.4.2 截斷student表
    TRUNCATE TABLE student;
4.2.4.3 截斷與刪除的區別
  • 截斷也是刪除整個表,跟DELETE一樣
  • 區別:
    • 截斷會重置標誌種子,而DELETE FROM 不會
      • 比如當前表的id作爲標識符,id爲5,DELETE FROM後,再增加,id爲6,但是TRUNCATE後id又從1開始
    • 截斷不寫入日誌,沒有備份;DELETE FROM寫入日誌,有備份

4.2.5 數據查詢(重點)

  • 查詢就是從客戶端發出的查詢請求數據庫服務器,並從數據庫返回查詢結果的過程
  • 每次查詢從表中提取數據,並且按照表的方式呈現出來
  • 查詢產生的表示虛擬表,不會保存起來
4.2.5.1 精確查詢
4.2.5.1.1 語法
    SELECT <列名> [AS] [別名]
    FROM <表名>
    [WHERE <查詢條件表達式>]
    [ORDER BY <排列的列名>[ASC或DESC]]
4.2.5.1.2 查詢北京的學生,並按照id正序排列
    SELECT id,name,city AS home //這樣就相當於給city取了別名叫做home,返回的結果中city列頁就變成了home列。當然別名可以省略AS,直接寫成city home
    FORM student
    WHERE city='北京'
    ORDER BY id ASC;
4.2.5.1.3 先按照課程編號升續排,如果一樣,按照課程成績降序排
    SELECT * 
    FROM score
    ORDER BY course_id ASC,grade DESC;
4.2.5.1.4 查詢某個字段爲空的所有行
  • 使用 ‘字段 IS NULL’ 作爲條件語句
  • 不爲空就是 ‘字段 NOT NULL’
    SELECT *
    FROM student
    WHERE level IS NULL
4.2.5.1.5 常量列(添加常量列)
SELECT id,name,city,'中國' as country
FROM student
WHERE city='北京'
ORDER BY id DESC
//返回的結果就是
id  name  city  country
5   陳七   北京  中國
4   趙六   北京  中國
1   張三   北京  中國
//這樣就多出來一個country列,值爲常量'中國'
4.2.5.1.6 分頁(極其常用)
  • 語法:
    • limit 索引,個數
      • 注意索引從0開始
    SELECT id,name
    FROM student
    limit 0,3 //從第0條開始,取3條
4.2.5.1.7 去重(查詢同學們都來自哪些不同的城市)
  • DISTINCT 關鍵字,表示唯一的
    SELECT DISTINCT city 
    FROM student;
    //出來的結果就是
    city
    北京
    杭州
4.2.5.2 模糊查詢
4.2.5.2.1 通配符
  • 主要使用關鍵字LIKE,以及符號%和_
    • LIKE 表示模糊查詢
    • %表示任意長度的字符(0或大於0)
      • '%郭’表示最後一個字是郭,前面任意
      • '%郭%'表示含有郭,前後任意
      • '郭%'表示第一個字是郭,後面任意
    • _表示字符,一個_表示一個字符,—兩個_表示兩個字符
      • '郭_'表示兩個字,郭開頭,後面的字隨意
      • '__郭’表示三個字,郭結尾,前面的子隨意
  • 舉例:
    SELECT * 
    FROM student
    WHERE name LIKE '%郭'
4.2.5.2.2 BETWEEN AND
  • 查詢某一列在指定的規範內的記錄,包括兩個邊界
    SELECT * FROM score WHERE grade BETWEEN 80 ADN 100;
    //包括80 跟 100
4.2.5.2.3 IN
  • 查詢某一列中的值在列出的內容列表中
    SELECT * FROM student WHERE city IN ('北京','杭州','上海');
4.2.5.2.4 IS NULL
  • 爲空 IS NULL
  • 不爲空 IS NOT NULL

4.3 DCL

4.3.1 創建用戶

    CREATE USER 用戶名@訪問地址 IDENTIFIED BY '密碼'
    CREATE USER user1@localhost IDENTIFIED BY '12345'

4.3.2 授予權限

    GRANT 權限1,權限2,..ON 數據庫.* TO 用戶名
    GRANT CREATE,DROP ON db1.* TO user1@localhost;//賦予創建和刪除的權限

4.3.3 查看用戶權限

    SHOW GRANTS FROM 用戶名
    SHOW GRANTS FROM user1@localhost

4.3.4 刪除用戶

    DROP USER 用戶名
    DROP USER yuhua

4.3.5 修改密碼

    UPDATE USER SET PASSWORD=PASSWORD('password') WHERE User='username' and Host='localhost';
    FLUSH PRIVILEGES;

4.3 函數

4.3.1 字符函數

函數名稱 描述
CONCAT 字符串連接
CONCAT_WS 使用指定的分隔符進行字符串連接
FORMAT 數字格式化
LOWER 轉小寫字母
UPPER 轉大寫字母
LEFT 返回字符串最左邊n個字符
RIGHT 返回字符串最右邊的n個字符
LENGTH 返回字符串的長度
SUBSTR 截取字符串
INSTR 計算子字符串在父字符串的位置索引
TRIM 去除字符串前後空格
LTRIM 去除字符串左邊的空格
RTRIM 去除字符串右邊的空格
LPAD 往左補齊
RPAD 往右補齊
REPLACE 替換
4.3.1.1 CONCAT(a,b)
  • 把a和b字符拼接起來
SELECT CONCAT(age,city) AS agecity FROM student;
//返回的結果是
agecity
40上海
40北京
30杭州
20北京
30上海
4.3.1.2 CONCAT_WS(拼接符號a,b)
  • 把a和b用拼接符號拼接起來
SELECT CONCAT_WS('-',age,city) AS agecity FROM student;
//返回的結果是
agecity
40-上海
40-北京
30-杭州
20-北京
30-上海
4.3.1.3 FORMAT(數字,保留的小數位數)
  • 數字格式化
  • 整數位每三位加一個逗號,
    SELECT FORMAT(100000,2) AS newNum;
    //返回的結果是
    newNum
    100,000.00
4.3.1.4 LOWER(字符串)
  • 返回小寫的字符串
SELECT LOWER('YUHUA');
//返回
LOWER('YUHUA')
yuhua


SELECT LOWER('YUHUA') AS name;
//返回
name
yuhua
4.3.1.5 UPPER(字符串)
  • 返回大寫的字符串
SELECT UPPER('yuhua');
//返回
UPPER('yuhua')
YUHUA


SELECT UPPER('yuhua') AS name;
//返回
name
YUHUA
4.3.1.6 LEFT(字符串,n)
  • 取字符串最左邊的n個字符
    SELECT LEFT('yuhua',2);
    //返回表格
    LEFT('yuhua',2)
    yu



    SELECT LEFT('yuhua',2) AS leftstr;
    //返回表格
    leftstr
    yu
4.3.1.7 RIGHT(字符串,n)
  • 取字符串最右邊的n個字符
    SELECT RIGHT('yuhua',3);
    //返回表格
    RIGHT('yuhua',3)
    hua


    SELECT RIGHT('yuhua',3) AS rightstr;
    //返回表格
    rightstr
    hua
4.3.1.8 LENGTH(字符串)
  • 返回字符串長度
    SELECT LENGTH("yuhua");
    //返回表格(注意,所有結果都是表格)
    LENGTH("yuhua")
    5


    SELECT LENGTH("yuhua") AS len;
    //返回表格
    len 
    5


4.3.1.9 SUBSTR的四種用法
  • SUBSTR(字符串 FROM 開始截取的索引 FOR 截取的長度)

    • 注意,這裏的索引從1開始(回憶一下:哪裏的索引從0開始?答:分頁中limit的索引從0開始)
        SELECT SUBSTR('yuhua' FROM 2 FOR 3) AS namestr;
        //返回結果
        namestr
        uhu
    
  • SUBSTR(字符串,開始截取的索引,截取的長度)

    • 與上面的相同
  • SUBSTR(字符串 FROM 開始截取的索引)

    • 這個沒有截取的位數,說明是截取到末尾
        SELECT SUBSTR('yuhua' FROM 2) AS namestr;
        //返回結果
        namestr
        uhua
    
  • SUBSTR(字符串,開始截取的索引)

    • 與上面的相同
4.3.1.10 INSTR(父字符串,子字符串)
  • 計算子字符串在父字符串的位置索引,索引從1開始
    SELECT INSTR('yuhua','ua') as childStrIndex;
    //返回表格
    childStrIndex
    4
4.3.1.11 TRIM(字符串)
  • 去除字符串前後的空格
    SELECT TRIM(' YU HUA ') as trimStr;
    //返回結果
    trimStr
    YU HUA
4.3.1.12 LTRIM(字符串)
  • 去除字符串左邊的空格
    SELECT LTRIM(' YU HUA ') as trimStr;
    //返回結果
    trimStr
    YU HUA 
4.3.1.13 RTRIM(字符串)
  • 去除字符串右邊的空格
    SELECT RTRIM(' YU HUA ') as trimStr;
    //返回結果
    trimStr
     YU HUA
4.3.1.14 LPAD(字符串,向左補齊成幾位,從哪個索引位置開始補齊)
  • 向左補齊
    SELECT LPAD('yuhua',10,'0') AS lyuhua;
    //返回的結果是
    lyuhua
    00000yuhua
4.3.1.15 RPAD(字符串,向右補齊成幾位,從哪個索引位置開始補齊)
  • 向右補齊
    SELECT RPAD('yuhua',10,'0') AS ryuhua;
    //返回的結果是
    ryuhua
    yuhua00000
4.3.1.16 REPLACE(被替換的字符串,被替換的內容,替換成的內容)
  • 替換
    SELECT REPLACE('yuhua','hua','shuaihua') AS newName;
    //返回的結果是
    newName
    yushuaihua
4.3.1.17 姓名首字母大寫,其他字母小寫,然後用_拼接
SELECT CONCAT_WS('_',UPPER(SUBSTR(name,1,1)),LOWER(SUBSTR(name,2))) 
FROM student;

4.3.2 數學函數

函數名稱 描述
CEIL 向上取整
FLOOR 向下取整
DIV ???
MOD 取餘(取模)
POW 冪運算
POWER 冪運算
ROUND 四捨五入
TRUNCATE 數字截取
4.3.2.1 CEIL(數字) 向上取整
    SELECT CEIL(1.2) AS intNum;
    //返回結果
    intNum
    2
4.3.2.2 FLOOR(數字) 向下取整
    SELECT FLOOR(1.7) AS intNum;
    //返回結果
    intNum
    1
4.3.2.3 DIV 取整數部分
    SELECT 2 DIV 3 AS res;
    //返回結果是
    res
    0

    SELECT 10 DIV 3 AS res;
    //返回結果是
    res
    3

    SELECT 9 DIV 2 AS res;
    //返回結果是
    res
    4

    SELECT 5 DIV -3 AS res; 
    //返回結果是
    res
    -1
4.3.2.4 MOD(被除數,除數) 取餘(取模)
    SELECT MOD(3,2) AS res;
    //返回結果是
    res
    1
4.3.2.5 POWER(x,y) 與 POW(x,y) 都是x^y 冪運算
    SELECT POW(2,3) as res;

    SELECT POWER(2,3) as res;

    //返回的結果都是
    res
    8
4.3.2.6 ROUND(數值,精確到的小數位數) 四捨五入
  • 第二個參數可以省略,省略就成了精確到個位
    SELECT ROUND(2.56) AS res;
    //返回的結果是
    res
    3


    SELECT ROUND(2.56,1) AS res;
    //返回的結果是
    res
    2.6
4.3.2.7 TRUNCATE(數值,要截取的位數) 數值截取(截取小數部分)
  • 第二個參數不可以省略,省略就報錯
  • 第二個參數爲負數的時候,就是對整數取整,並且捨去小數。具體看下例:
    SELECT TRUNCATE(2.5682,2) AS res;
    //返回的結果是
    res
    2.56

    SELECT TRUNCATE(234.548,-2) AS res;
    //返回結果是
    res
    200

4.3.3 日期函數

函數名稱 描述
NOW 當前日期和時間
CURDATE 當前日期
CURTIME 當前時間
DATE_ADD 日期變化
DATEDIFF 計算日期差
DATE_FORMAT 日期格式化
YEAR 獲取年
MONTH 獲取月
DAY 獲取日
HOUR 獲取小時
MINUTE 獲取分鐘
SECOND 獲取秒數
4.3.3.1 NOW()
  • 當前的日期時間
    SELECT NOW() AS res;
    //返回的結果是
    res
    2019-09-17 13:20:52
4.3.3.2 CURDATE()
  • 當前的日期
    SELECT CURDATE() AS res;
    //返回的結果是
    res
    2019-09-17
4.3.3.3 CURTIME()
  • 當前的日期
    SELECT CURTIME() AS res;
    //返回的結果是
    res
    13:20:52
4.3.3.4 DATE_ADD(date,INTERVAL expr type)
  • 作用:函數向日期添加指定的時間間隔。
  • 參數:
    • data:表示基準時間
    • INTERVAL expr type:表示時間的增量
      • type可以取一下的值:
Type 值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
  • 舉例:在當前基礎上增加2天,返回一個新的時間
    SELECT DATE_ADD(NOW(),INTERVAL 2 DAY) AS res;
    //返回的結果是
    res
    2019-09-19 13:59:01
4.3.3.5 DATEDIFF(日期A,日期B) 日期差
  • 日期A - 日期B 的差值
    SELECT DATEDIFF('2008-12-30','2008-12-29') AS res;
    //返回的結果是
    res
    1

    SELECT DATEDIFF('2008-12-29','2008-12-30') AS res;
    //返回的結果是
    res
    -1
4.3.3.6 DATE_FORMAT(date,format) 日期/時間格式化
DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p')
DATE_FORMAT(NOW(),'%m-%d-%Y')
DATE_FORMAT(NOW(),'%d %b %y')
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')

結果爲:
Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635
  • format的格式有如下幾種:
格式 描述
%a 縮寫星期名
%b 縮寫月名
%c 月,數值
%D 帶有英文前綴的月中的天
%d 月的天,數值(00-31)
%e 月的天,數值(0-31)
%f 微秒
%H 小時 (00-23)
%h 小時 (01-12)
%I 小時 (01-12)
%i 分鐘,數值(00-59)
%j 年的天 (001-366)
%k 小時 (0-23)
%l 小時 (1-12)
%M 月名
%m 月,數值(00-12)
%p AM 或 PM
%r 時間,12-小時(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 時間, 24-小時 (hh:mm:ss)
%U 周 (00-53) 星期日是一週的第一天
%u 周 (00-53) 星期一是一週的第一天
%V 周 (01-53) 星期日是一週的第一天,與 %X 使用
%v 周 (01-53) 星期一是一週的第一天,與 %x 使用
%W 星期名
%w 周的天 (0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,與 %V 使用
%x 年,其中的星期一是周的第一天,4 位,與 %v 使用
%Y 年,4 位
%y 年,2 位
4.3.3.7 獲取年月日
SELECT YEAR(NOW());//2019
SELECT MONTH(NOW());//9
SELECT DAY(NOW());//17
SELECT HOUR(NOW());//14
SELECT MINUTE(NOW());//13
SELECT SECOND(NOW());//5

4.3.3.8 STR_TO_DATE(日期,格式)
  • 格式化日期
SELECT STR_TO_DATE('2019-9-10','%Y-%m-%d') AS newDate;
//返回結果
newDate
2019-09-10
  • 格式化時間符號
    | 格式符 | 功能 |
    | — | — |
    | %Y | 4位的年份 |
    | %y | 2位的年份 |
    | %m | 月份(01,02) |
    | %c | 月份(1,2) |
    | %d | 日(01,02) |
    | %H | 小時(24小時制) |
    | %h | 小時(12小時制) |
    | %i | 分鐘(00,01) |
    | %s | 秒(00,01) |

4.3.4 自定義函數

  • 自定義函數是對MySQL的擴展,使用方式和內置函數相同
  • 函數必須要有參數的括號和返回值
  • 函數可以接受任意類型的值,頁可以接受這些類型的參數
  • 函數體由合法的SQL語句組成
  • 函數體可以是簡單的SELECT語句或INSERT語句,如果是符合結構要用BEGIN…END
  • 函數體頁可以包含生命、循環和流程控制
  • 返回值只能有一個
4.3.4.1 創建(定義)一個函數
  • 語法:
    CREATE FUNCTION 函數名稱() RETURNS 返回值類型 函數體
  • 注意:
    • 定義函數的時候要有RETURNS
    • 函數體要包含RETURN
    • 函數體多條語句要用BEGIN…END包裹
  • 舉例:
    • 例1:返回中文的當前時間
        CREATE FUNCTION ZHNOW(format VARCHAR(64)) RETURNS VARCHAR(64)
        RETURN DATE_FORMAT(NOW(),format);
    
        //函數執行
        SELECT ZHNOW('%Y年%m月%d日 %H點%i分%s秒');
    
    • 例2:添加一個用戶,返回其ID
        CREATE FUNCTION ADD_USER(nameVal VARCHAR(64)) RETURNS INT
        BEGIN
            INSERT INTO student(name) VALUES(nameVal);
            RETURN LAST_INSERT_ID();
        END
    
        SELECT ADD_USER('小魚兒');
    

4.4 數據庫其他操作

4.4.1 每個客戶端連接上服務器後產生的一個連接ID

    SELECT CONNECTION_ID();
    //返回連接ID
    CONNECTION_ID()
    5

4.4.2 獲取當前數據庫名稱

    SELECT DATABASE();
    //返回當前數據庫名稱
    DATABASE()
    studb

4.4.3 獲取數據庫版本

    SELECT VERSION();
    //返回當前數據庫版本
    VERSION()
    5.5.29

4.4.4 獲取數據庫當前登錄的用戶信息

    SELECT USER();
    //返回當前登錄的用戶信息
    USER()
    root@localhost

4.4.5 獲取最近一次插入的信息的ID

    SELECT LAST_INSERT_ID();
    //返回最近一次插入的信息的ID
    LAST_INSERT_ID()
    5

4.4.6 將字符串抽象成MD5

    SELECT MD5('yuhua');
    //返回結果
    MD5('yuhua')
    e3e6fa5586cdb4bd0cf4facf17bed233

4.4.7 獲取指定用戶的密碼(該密碼是加密過的密碼)

    SELECT PASSWORD('root');
    //返回的結果是
    PASSWORD('root')
    *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

4.5 流程控制

4.5.1 IF語句

  • 語法:IF(條件,成功執行的語句,失敗執行的語句)
  • 舉例:
SELECT IF(1>2,'YES','NO');
//返回結果
IF(1>2,'YES','NO')
NO

4.5.2 CASE語句

  • 語法:
    CASE 要判斷的字段或表達式
    WHEN 表達式1 THEN 要顯示的值
    WHEN 表達式2 THEN 要顯示的值
    ELSE 要顯示的值
    END
  • 舉例:
    SELECT 
    CASE city
    WHEN '杭州' THEN '新一線'
    WHEN '北京' THEN '一線'
    WHEN '上海' THEN '一線'
    WHEN '廣州' THEN '一線'
    ELSE '其他'
    END
    FROM student;

4.7 常用例子舉例

4.7.1 把學生表中的郵箱由小寫改成大寫

    UPDATE student SET email = UPPER(email);

4.6 注意點

  • +號
    • 只能用來加數字,能轉成數字的轉成數字後相加,不能轉成數字的變成0相加
      • 1+1結果爲2
      • 1+'1’結果爲2
      • 1+'a’結果爲0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章