MySql安裝配置、DDL DML DCL語法解析及函數擴展

MySql


安裝

​ 雙擊即可,大部分都是一路next

​ 關鍵節點注意事項:

  1. 選中Typical,典型安裝模式

  2. 選中Detailed Configuration(詳細配置)單選按鈕

  3. 選中Developer Machine(開發者機器)單選按鈕

  4. 選中Multifunctional Database(多功能數據庫)單選按鈕

  5. 服務端口3306,不建議更改

  6. 字符集註意要選Manual Selected Default Character Set/Collation單選按鈕,設置字符集編碼爲utf8

  7. 設置密碼儘量簡單,注意不要忘了,我們只是來做實驗

    用戶名:root 密碼:root

啓動MySql服務

  • “我的電腦”→“管理”→“服務”在服務器的列表中找到mysql服務並右鍵單擊,在彈出的快捷菜單中,完成MySQL服務的各種操作(啓動、重新啓動、停止、暫停和恢復)

  • 也可以通過命令行的方式來管理

    Window鍵+R

    net start mysql(mysql服務名)
    net stop mysql
    

命令行連接

mysql -u usernname -p password

SQL

在這裏插入圖片描述

DDL

數據定義語言(DDL ,Data Defintion Language)語句:數據定義語句,用於定義不同的數據對象、數據庫、表、列、索引等。常用的語句關鍵字包括create、drop、alter等。

  • 數據庫操作

    create database dbNaem;--創建數據庫
    	show datebases;--顯示所有數據庫
    	use dbName;--使用數據庫
    	show tables;--顯示數據庫中所有表
    
  • 表操作

    create table tName(
        fName fieldtype [COMMENT 'note'],
        ...
        );--創建數據表
    	--字段類型:
    	INT:整型,
    	float:浮點,
    	字符串:char(32) -最多隻能存儲32個個字符,沒有存滿也佔32個字符空間
    		  varchar(32) -最多存儲32個字符,沒有存滿只佔實際存儲的字符空間
    		注意:	兩種字符串存儲沒有設置指定存儲大小時,最多存儲255字符
    	datetime,timestamp:時間
    
    drop table tName;--刪除表
    
    alter table old_tName rename new_tName;--修改表名
    
    --擴展
    CREATE TABLE 新表 SELECT * FROM 舊錶 WHERE 1=2;
    CREATE TABLE 新表 LIKE 舊錶 ;--只複製表結構
    --注意
    上面兩種方式,前一種方式是不會複製時的主鍵類型和自增方式是不會複製過去的,而後一種方式是把舊錶的所有字段類型都複製到新表。
    
    CREATE TABLE 新表 SELECT * FROM 舊錶;--複製表結構以及數據
    
    INSERT INTO 新表 SELECT * FROM 舊錶;--複製表數據(表結構相同)
    
    INSERT INTO 新表(字段1,字段2,...) SELECT 字段1,字段2,... FROM 舊錶;--複製表數據(表結構不相同)
    
  • 數據字段操作

    alter table tName modify fName fieldtype;--修改字段類型 
    
    alter table tName add column fName fieldtype;--添加字段
    
    alter table tName change column old_fName new_fName fieldtype;--修改字段名
    
DML

數據操作語言(DML , Data Manipulation Language)語句:數據操縱語句,用於添加、刪除、更新和查詢數據庫記錄,並檢查數據的完整性。常用的語句關鍵字主要包括insert、delete、update和select等。

(DML:添加,修改,刪除,DQL:查詢)

  • 插入(INSERT)

    insert into tName values(value,...);
    insert into tName(fName,...) values(value,...); --插入數據
    
    --兩種語法的區別:
    式一中,表中有多少個字段就必須要插入多少個值。若有默認值,不想傳,可以寫上null。
    式二中,除非有必填字段必須要寫入值外。如果有默認值的不想寫可以忽略不寫。mysql會自動補主默認值
    
    --擴展
    INSERT INTO 新表 SELECT * FROM 舊錶;--複製表數據(表結構相同)
    INSERT INTO 新表(字段1,字段2,...) SELECT 字段1,字段2,... FROM 舊錶;--複製表數據(表結構不相同)
    
  • 查詢(SELECT)

    select [distinct][method(params)] *|(fName,...) from tName;
    --注:如果是distinct 多列 是以多列一起判斷是否重複
    
    select fName from tName where condition and condition or condition;
    
    select fName from tName where fName like '%content%';--模糊查詢
    
    select fName from tName order by fName,... asc|desc;--關鍵詞asc順序查詢,默認.desc倒序查詢
    
    --多字段排序
    order by 後面可以跟多個不同的字段排序,並且排序字段的不同結果集的順序也不同,如果排序字段的值一樣,則值相同的字段按照第二個排序字段進行排序。
    --注意:
    只有在第一個字段排序後,出現相同值纔會比較第二個字段,否則第二個比較字段無效,主排序字段和次排序字段
    
    select fName from tName limit [offset,]size;--分頁查詢,取前size個數據
    
    select fName from tName order by fName asc|desc limit size;--限制結果集並排序
    
    --擴展
    select * from tName order by rand() limit size;--隨機取數據
    
    • 子查詢

    • 分組查詢

      select fName,... from tName group by fName having(conditon|method(params));
      --注:如果是分組 多列 是以多列一起判斷是否相同分組
      
    • 多表聯合查詢

      表連接

      當需要查詢多個表中的字段時,就可以使用表連接來實現。表聯接分爲內連接和外連接。

      內聯結:將兩個表中存在聯結關係的字段符合聯結關係的那些記錄形成記錄集的聯結。

      在這裏插入圖片描述

      外連接:會選出其他不匹配的記錄,分爲外左聯結和外右聯結。

      在這裏插入圖片描述

      在這裏插入圖片描述

      --內連接
      select tName1.fName,tName2.fName from tName1,tName2  where condition;
      select tName1.fName,tName2.fName from tName1 [INNER] JOIN tName2 on condition;
      
      --外連接
      select1.字段 [as 別名],表n.字段 from1 LEFT JOIN 表n on 條件;
      select1.字段 [as 別名],表n.字段 from1 right JOIN 表n on 條件;
      
      左連接:包含所有的左邊表中的記錄甚至是右邊表中沒有和它匹配的記錄
      右連接:包含所有的右邊表中的記錄甚至是右邊表中沒有和它匹配的記錄
      
    • UNION操作符

      MySQL UNION 操作符用於連接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重複的數據。

      --語法
      SELECT expression1, expression2, ... expression_n
      FROM tables
      [WHERE conditions]
      UNION [ALL | DISTINCT]--UNION ALL去重
      SELECT expression1, expression2, ... expression_n
      FROM tables
      [WHERE conditions];
      
    • 聚合函數(統計類函數):

      函數 說明
      sum 求和
      count 統計總數
      max 最大值
      min 最小值
      avg 平均值
  • 更新(UPDATE)

    update tName set fName = value,...;--更新一個或多個字段值
    
  • 刪除(DELETE)

    delete from tName [where condition]
    
    1. drop table tName
    2. truncate table tName 
    --三者區別(加上delete三個,這是考點需要掌握):
    	drop:刪除表所有數據與表的數據結構,也就是表之間不存在了(無法回滾)
    	truncate: 會清空表中所有的數據,速度快,不可回滾;實質是刪除整張表包括數據再重新創建表(一旦提交不可回滾)
    當然,涉及到刪除數據delete語句也是刪除數據,這兒就一起說了
    	delete: 逐行刪除數據,每步刪除都是有日誌記錄的,可以回滾數據;實質是逐行刪除表中的數據
    	
    --總結:
    速度:一般來說: drop> truncate > delete
    安全性:小心使用 droptruncate,尤其沒有備份的時候.否則哭都來不及
    使用上,想刪除部分數據行用 delete,注意帶上where子句. 回滾段要足夠大.
    想刪除表,當然用 drop;想保留表而將所有數據刪除,如果和事務無關,用truncate即可。如果和事務有關,delete
    
DCL

數據控制語言(DCL, Data Control Language)語句:數據控制語句,用於控制不同數據段直接的許可和訪問級別的語句。這些語句定義了數據庫、表、字段、用戶的訪問權限和安全級別。主要的語句關鍵字包括grant、revoke等。

  • 添加權限

    首先,需創建用戶:

    create user username identified by password;
    --可以針對一個用戶增加多條權限。
    
    類別 詳細解示
    基本語法 grant 權限 on dbName.tName to ‘username’@‘host’ identified by ‘password’;
    示例 grant select, insert on test.* to ‘huangguizhao’@‘localhost’ identified by ‘4311’;
    示例說明 給予huangguizhao用戶,在本機連接test庫所有表的權限。操作的這些表具有查詢和寫入權限
  • 刪除權限

    類別 詳細解示
    基本語法 revoke 權限 on dbName.tName from ‘username’@‘host’;
    示例 revoke select, insert on test.* from ‘huangguizhao’@‘localhost’;
    示例說明 給予huangguizhao用戶,在本機連接test庫所有表的權限。操作的這些表具有查詢和寫入權限

    參數說明

    符號 說明
    grant all 在grant後接all說明給予所有權限
    revoke all 在revoke後接all說明刪除所有權限
    權限 on . . 所明給予所有庫所有表的操作權限
    ‘用戶’@‘主機’ 主機裏面若爲%。任意來源的主機均可以使用這個用戶來訪問

    解決編碼問題:

    Set charset gbk;

數據庫備份和恢復
  • --備份:
    在未登錄狀態
    mysqldump -u root -p  huangguizhao>d:\hgz.sql
    密碼過後輸入
    mysqldump -u root -proot  huangguizhao>d:\hgz.sql
    
    --恢復:
    前提:必須先創建數據庫
    需先登錄mySQL,進入指定數據庫後執行SQL
    Source d:\hgz.sql
    
    還有一種方式
    mysql -uroot -proot huangguizhao<d:\hgz.sql
    

擴展

數據類型
  • 整型

    MySQL數據類型 所佔字節 值範圍
    tinyint 1字節 -128~127
    smallint 2字節 -32768~32767
    mediumint 3字節 -8388608~8388607
    int 4字節 範圍-2147483648~2147483647
    bigint 8字節 ±9.22*10的18次方

    UNSIGNED(無符號) 主要用於整型和浮點類型,使用無符號。即,沒有前面面的-(負號)。
    存儲位數更長。tinyint整型的取值區間爲,-128~127。而使用無符號後可存儲0-255個長度。

    創建時在整型或浮點字段語句後接上:Unsigned

  • 浮點類型

    MySQL數據類型 所佔字節 值範圍
    float(m, d) 4字節 單精度浮點型,m總個數,d小數位
    double(m, d) 8字節 雙精度浮點型,m總個數,d小數位
    decimal(m, d) decimal是存儲爲字符串的浮點數
  • 字符類型

    MySQL數據類型 所佔字節 值範圍
    CHAR 0-255字節 定長字符串
    VARCHAR 0-255字節 變長字符串
    TINYBLOB 0-255字節 不超過255個字符的二進制字符串
    TINYTEXT 0-255字節 短文本字符串
    BLOB 0-65535字節 二進制形式的長文本數據
    TEXT 0-65535字節 長文本數據
    MEDIUMBLOB 0-16 777 215字節 二進制形式的中等長度文本數據
    MEDIUMTEXT 0-16 777 215字節 中等長度文本數據
    LOGNGBLOB 0-4 294 967 295字節 二進制形式的極大文本數據
    LONGTEXT 0-4 294 967 295字節 極大文本數據
    VARBINARY(M) 允許長度0-M個字節的定長字節符串 值的長度+1個字節
    BINARY(M) M 允許長度0-M個字節的定長字節符串
  • 時間類型

    MySQL數據類型 所佔字節 值範圍
    date 3字節 日期,格式:2014-09-18
    time 3字節 時間,格式:08:42:30
    datetime 8字節 日期時間,格式:2014-09-18 08:42:30
    timestamp 4字節 自動存儲記錄修改的時間 格式: 2014-09-18 08:42:30
    year 1字節 年份 格式: 2014
    • DATETIME

      類型用在你需要同時包含日期和時間信息的值時。MySQL檢索並且以’YYYY-MM-DD HH:MM:SS’格式顯示DATETIME值,支持的範圍是’1000-01-01 00:00:00’到’9999-12-31 23:59:59’。(“支持”意味着儘管更早的值可能工作,但不能保證他們可以。)

    • DATE

      類型用在你僅需要日期值時,沒有時間部分。MySQL檢索並且以’YYYY-MM-DD’格式顯示DATE值,支持的範圍是’1000-01-01’到’9999-12-31’。

    • TIMESTAMP

      可以表示年月日時分秒,你可以使用它自動地用當前的日期和時間標記INSERT或UPDATE的操作。

    • TIME

      數據類型表示一天中的時間。MySQL檢索並且以"HH:MM:SS"格式顯示TIME值。支持的範圍是’00:00:00’到’23:59:59’。

    --系統時間
    select NOW();--語句開始執行的時間
    select SYSDATE();--動態的實時時間
    
    --時間操作函數
    1.DATE_ADD(date,INTERVAL expr unit)
    select date_add(now(), interval 1 day); -- 當前時間add 1 day
    select date_add(now(), interval 1 hour); -- add 1 hour
    select date_add(now(), interval 1 minute); -- ...
    select date_add(now(), interval 1 second);
    select date_add(now(), interval 1 microsecond);
    select date_add(now(), interval 1 week);
    select date_add(now(), interval 1 month);
    select date_add(now(), interval 1 quarter);
    select date_add(now(), interval 1 year);
    select date_add(now(), interval -1 day); --減掉一天
    
    2.TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2);-- date2-date1
    select timestampdiff(day,'2011-11-11','2012-12-12');
    select timestampdiff(hour,'2011-11-11 01:12:00','2012-12-12 00:12:00');
    
    3.TIMESTAMP();
    select TIMESTAMP('2008-08-08 08:00:08','01:01:01');--前面的時間加上後面的時間
    

    注意:

    1. 時間類型在web系統中用的比較少,很多時候很多人喜歡使用int來存儲時間。插入時插入的是unix時間戳,因爲這種方式更方便計算。在前端業務中用date類型的函數,再將unix時間戳轉成人們可識別的時間。

    2. 上面的類型你可以根據實際情況實際進行選擇,有些人爲了在數據庫管理中方便查看,也有人使用datetime

約束

約束是一種限制,它通過對錶的行或列的數據做出限制,來確保表的數據的完整性、唯一性。

  • 主鍵約束(PIMARY KEY)

    主鍵約束相當於 唯一約束 + 非空約束 的組合,主鍵約束列不允許重複,也不允許出現空值。

    每個表最多隻允許一個主鍵,建立主鍵約束可以在列級別創建,也可以在表級別創建。

    當創建主鍵的約束時,系統默認會在所在的列和列組合上建立對應的唯一索引。

    - 基本模式
    create table temp( 
    id int primary key,
    name varchar(20)
    );
    
    -- 組合模式
    create table temp(
    id int ,
    name varchar(20),
    pwd varchar(20),
    primary key(id, name)
    );
    
    -- 刪除主鍵約束
    alter table temp drop primary key;
    
    -- 添加主鍵約束
    alter table temp add primary key(id,name);
    
    -- 修改主鍵約束
    alter  table temp modify id int primary key
  • 外鍵約束(FOREIGN KEY)

    外鍵約束是保證一個或兩個表之間的參照完整性,外鍵是構建於一個表的兩個字段或是兩個表的兩個字段之間的參照關係

    -- 基本模式
    -- 主表
    create table temp(
    id int primary key,
    name varchar(20)
    );
    
    -- 副表
    create table temp2(
    id int,
    name varchar(20),
    classes_id int,
    foreign key(id) references temp(id)
    );
    
    
    -- 多列外鍵組合,必須用表級別約束語法
    -- 主表
    create table classes(
    id int,
    name varchar(20),
    number int,
    primary key(name,number)
    );
    
    -- 副表
    create table student(
    id int auto_increment primary key,
    name varchar(20),
    classes_name varchar(20),
    classes_number int,
    /*表級別聯合外鍵*/
    foreign key(classes_name, classes_number) references classes(name, number) 
    );
    
    -- 刪除外鍵約束
    alter table student drop foreign key student_id;
    
    -- 增加外鍵約束
    alter table student add foreign key(classes_name, classes_number) references classes(name, number);
    
    
  • 唯一約束(UNIQUE)

    • 唯一約束是指定table的列或列組合不能重複,保證數據的唯一性。
    • 唯一約束不允許出現重複的值,但是可以爲多個null。
    • 同一個表可以有多個唯一約束,多個列組合的約束。
    • 在創建唯一約束時,如果不給唯一約束名稱,就默認和列名相同。
    • 唯一約束不僅可以在一個表內創建,而且可以同時多表創建組合唯一約束。
    -- 創建表時設置,表示用戶名、密碼不能重複
        create table temp(
        id int not null ,
        name varchar(20),
        password varchar(10),
        unique(name,password)
    );
    
    -- 添加唯一約束
    alter table temp add unique (name, password);
    
    -- 修改唯一約束
    alter table temp modify name varchar(25) unique;
    
    -- 刪除約束
    alter table temp drop index name;
    
  • 非空約束和默認值Default

    非空約束用於確保當前列的值不爲空值,非空約束只能出現在表對象的列上。
    Null類型特徵:
      所有的類型的值都可以是null,包括intfloat 等數據類型

    -- 創建table表,ID 爲非空約束,name 爲非空約束 且默認值爲abc
    create table temp(
               id int not null,
               name varchar(255) not null default  'abc',
               sex char null
    )-- 增加非空約束
    alter table temp
    modify sex varchar(2) not null;
    
    -- 取消非空約束
    alter table temp modify sex varchar(2) null;
    
    -- 取消非空約束,增加默認值
    alter table temp modify sex varchar(2) default 'abc' null;
    
    
case when then else end
--語法
case :指定字段
when:當什麼條件
then:滿足上面的條件 就幹什麼
else:前面的條件都不滿足
end:結束語

SELECT  SUM(population) '人口', 
        CASE country 
                WHEN '中國'     THEN '亞洲' 
                WHEN '印度'     THEN '亞洲' 
                WHEN '日本'     THEN '亞洲' 
                WHEN '美國'     THEN '北美洲' 
                WHEN '加拿大'  THEN '北美洲' 
                WHEN '墨西哥'  THEN '北美洲' 
        ELSE '其他' END '洲'
FROM    Table_A 
GROUP BY CASE country 
                WHEN '中國'     THEN '亞洲' 
                WHEN '印度'     THEN '亞洲' 
                WHEN '日本'     THEN '亞洲' 
                WHEN '美國'     THEN '北美洲' 
                WHEN '加拿大'  THEN '北美洲' 
                WHEN '墨西哥'  THEN '北美洲' 
        ELSE '其他' END;
NULL值處理

首先在mysql中,NULL表示的是“a missing unknown value”,而字符串’'是一個確定的值,這本質上就已經不一樣了,NULL是指沒有值,而”則表示值是存在的,只不過是個空值

  • NULL作爲where條件是is null 或者 is not null 而不是=null

  • NULL值排序

    order by ... asc時,null值會被放在最前面,而用order by ... desc時,null時會被放在最後面,相當於null是一個無窮小的值。

  • MIN,ARG函數和COUNT計算,NULL值將會被忽略

  • IFNULL函數

    上面使用avg等的時候結果不是正確的,是因爲null值的 原因,那麼我們在日常使用聚合函數的時候,可以使用ifnull函數

    Ifnull(a,b) 表示如果a爲null 就賦值爲b

    所以可以在計算中通過ifnull,根據你的邏輯來賦值計算,這兒用0

  • NULL值加減乘除

    null的四則運算的結果都爲null,在計算時需要配合IFNULL函數使用

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