數據庫分類+MySQL安裝+ SQL的五大類語言+MySQL增刪改查

MySQL簡介

數據庫簡介:

  • 用途:用於存儲生活的幾乎一切數據,如:身份、住房、車票、網站、…
  • 概念:數據庫服務器、數據庫、數據表、一行數據(一條)、一列數據(字段)
  • 分類:
    • 關係型數據庫:mysql、oracle、SQL server、…
    • 非關係型數據庫:Redis、MongoDB、…
  • SQL:Structured Query Language,結構化查詢語言
  • SQL分類:
    • 數據定義語言:DDL
    • 數據操作語言:DML
    • 數據查詢語言:DQL
    • 數據控制語言:DCL
    • 數據事務語言:DTL

MySQL(ubuntu)安裝:

  • 安裝:sudo apt-get install mysql-server
    • 若安裝出現系統服務問題,很可能是自己添加系統服務的問題,移除即可
  • 安全配置:sudo mysql_secure_installation
    • 按照提示,一路進行下去
    • 設置支持遠程連接,爲後面做準備
  • 連接測試:mysql -h host -u user -p
    • -h:指定主機,localhost/127.0.0.1表示本機,本機可以省略
    • -u:指定用戶,默認只有root用戶
    • -p:指定密碼,輸入密碼時要與登錄分開,以防不測
    • 示例:mysql [-hlocalhost] -uroot -p,然後根據提示輸入密碼
      • 端口:3306
      • 退出:\h 或 help;
      • 說明:所有的命令都是以’;'結尾

數據定義語言(DDL)

  • 查看庫:show databases;,會顯示數據庫服務器上所有的數據庫
  • 創建庫:create database test;,創建數據庫test
  • 刪除庫:drop database test;,刪除數據庫test
  • 選擇庫:use test;,選擇數據庫test
    • 查看當前選中數據庫:
      • show tables;
      • select database();
  • 查看錶:show tables;,查看當前選中數據庫中的數據表
  • 創建表:create table user(username varchar(20), password char(32));
  • 查看錶結構:desc user;
  • 刪除表:drop table user;
  • 查看創建方式:
    • 庫:show create database test;
    • 表:show create table user;
  • 修改字符集:
    • 創建時指定:在創建表的語句後指定字符集。
    • 修改配置文件:sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]後面添加
      • character-set-server=utf8
      • 重啓服務:sudo service mysql restart
      • 說明:以後再創建的庫中的表默認字符集就是utf8
  • 修改字段:alter table user modify username char(30);,不能修改名字
  • 添加字段:
    • 默認(最後)添加:alter table user add age int(3);
    • 在指定字段後添加:alter table user add email varchar(60) after password;
    • 在最開始出添加:alter table user add id int(11) first;
  • 刪除字段:alter table user drop age;
  • 修改字段名稱:alter table user change email em char(32);
  • 修改位置及名稱:add/change/modify
    • alter table user modify em char(32) first;
  • 修改表名:alter table user rename new_user;

數據類型

  • 整型:tinyint(1個字節)、smallint(2個字節)、mediumint(3個字節)、int(4個字節)、bigint(8個字節)

  • 浮點類型:

    • float(m, d),單精度浮點數,4個字節,m表示總位數,d表示小數位數
    • double(m, d),雙精度浮點數,8個字節,m表示總位數,d表示小數位數
    • decimal(m, d),以字符串的形式存儲浮點數,用於金融領域等要求嚴格的場景
  • 字符類型:

    • char:定長字符串,0~255個字節
    • varchar:變長字符串,0~65535個字節
  • 時間日期:

    • date:日期,格式:2018-04-16
    • time:時間,格式:15:36:30
    • datetime:日期時間,格式:2018-04-16 15:37:38
    • timestamp:時間戳
    • year:年,只佔1個字節,年份範圍:1901~2155
  • 符合類型:

    • set:集合類型,格式:set(s1, s2, …, s63),最多63種可能
    • enum:枚舉類型,格式:enum(e1,e2, … ,e65535),最多65535種可能
  • 字段修飾:

    • unsigned:無符號數
    • zerofill:高位0填充,防止出現負數
    • auto_increment:自動增加(1),用於整數,經常與主鍵結合使用
    • default:設置默認值
    • not null:不能爲空
  • 字符集及存儲引擎

    • 查看支持的字符集:show character set;,我們通常只使用utf8,不能書寫成utf-8
    • 查看支持的存儲引擎:show engines;
      • 常用存儲引擎:MyISAM和InnoDB
  • 索引:

    • 說明:簡單理解,就是一本書最前面的目錄,雖然可以提高讀取效率,單並非越多越好。

    • 分類:

      • 普通索引(index):最基本的索引
      • 唯一索引(unique):修飾的字段不能重複
      • 主鍵索引(primary key):是一種特殊的唯一索引,一張表中只能有一個字段設置
      • 全文索引(fulltext):多全局數據添加索引。
    • 示例:
      alter table user add index(em); # 給em字段添加普通索引
      alter table user add unique(username); # 給username字段添加唯一索引
      alter table user add primary key(id); # 將id設置爲主鍵索引

      alter table user drop index em;				# 刪除em字段的普通索引
      

      alter table 表名add fulltext(字段);

  • 很多選項都可在創建表時指定,如:
    create table user(
    id int auto_increment,
    name varchar(20),
    primary key(id),
    unique(name)
    )engine=innodb default charset=utf8;
    數據操作語言(DML)

  • 說明:在最大多數的使用中,都是對數據的增、刪、改、查的操作(CURD)

  • 準備:創建一個star表
    create table star(
    id int auto_increment,
    name varchar(20) not null,
    money float not null,
    province varchar(20) default null,
    age tinyint unsigned not null,
    sex tinyint not null,
    primary key(id)
    )engine=innodb default charset=utf8;

  • 插入數據:

    • 方式1:不指定字段,按照數據表的數據添加一條數據的全部字段
      insert into star values(1,‘黃曉明’,200000,‘山東’,28,0);
      可以同時插入多條數據,每條一個小括號。
    • 方式2:指定字段,只需要傳遞指定字段的值
      insert into star(name,money,age,sex,province) values(‘小嶽嶽’,4000000, 33, 0, ‘河南’);
      可以同時插入多條數據,每條一個小括號
    • 注意:什麼情況下可以不傳字段值
      • 自增的字段
      • 有默認值的
      • 可以爲空的
    • 說明:插入數據通常使用方式2,可以根基需要進行數據的插入。
  • 查詢數據:

    • select * from star;
  • 刪除數據:

    • delete from star where id=1;
    • 警告:刪除操作一定不要忘了指定條件,否則後果自負。
  • 修改數據:

    • update star set age=22,money=8000000 where id=6;
    • 警告:修改操作一定不要忘了指定條件,否則後果自負。

數據查詢語言(DQL)

  • 基礎查詢:select * from star;
  • 指定字段查詢:select id,name,money from star;
  • 排除重複記錄:select distinct name from star;
    • 使用distinct修飾的字段組合不能重複
  • 指定條件查詢:
    • 條件:
      符號 說明
                     	大於             
      

      = 大於等於
      < 小於
      <= 小於等於
      = 等於
      != 或 <> 不等於
      and 並且
      or 或者
      [not] between m and n [不]在指定[m,n]的閉區間
      [not] in [不]在指定的集合中
      [not] like 模糊匹配,%表示任意字符

    • 示例:
      select id,name,money from star where id > 4;
      select id,name from star where id between 2 and 5;
      select id,name from star where id in(2,4,6);
      select id,name from star where id not in(2,4,6);
      select id,name from star where name like ‘小%’;
  • 結果集排序:
    • 示例:select id,name,money from star order by money desc;
    • order by :指定排序字段
      • asc:升序,默認的
      • desc:降序
    • 也可以多字段排序,先按照前面的字段排序,再按照後面字段排序
      • 示例:select id,name,money,age from star order by money desc,age asc;
  • 限制結果集:
    • 示例:
      select id,name,money from star limit 3; # 取3條數據
      select id,name,money from star limit 2,3; # 偏移2條,然後取3條數據
      select id,name,money from star limit 3 offset 2; # 偏移2條,然後取3條數據
    • 用途:分頁顯示,假設一頁顯示10條數據
      第一頁:limit 0, 10
      第二頁:limit 10, 10
      第三頁:limit 20, 10
      page:表示頁數,pageSize:表示一頁的大小
      查詢條件:limit (page-1)*pageSize, pageSize
  • 常用聚合函數
    函數 功能
    count 統計個數
    sum 求和
    max 最大值
    min 最小值
    avg 平均值
    1. 使用count時指定任何字段都行
    2. 使用其他函數時必須要指定字段
      示例:
      select count(*) from star;
      select max(money) as m from star;
      as可以給字段其別名
  • 分組操作
    • 示例:
      select * from star group by sex; # 分組
      select count(*), sex from star group by sex; # 分組統計
  • 結果集過濾:
    • 示例:
      select count(*) as c,province from star group by province having c>1;
      搜索所有記錄,然後按照省份分組,統計成員大於1的省份

數據控制語言(DCL)

  • 創建用戶:
    • 格式:create user ‘用戶名’@‘主機’ identified by ‘密碼’
    • 示例:create user ‘liusan’@’%’ identified by ‘123456’
  • 授權用戶:
    • 格式:grant 權限 privileges on 庫.表 to ‘用戶’@‘主機’ identified by ‘密碼’
    • 示例:grant all privileges on test.* to ‘liusan’@’%’ identified by ‘123456’
  • 查看授權:
    • 格式:show grants for ‘用戶’@‘主機’
    • 示例:show grants from ‘liusan’@’%’
  • 刷新權限:flush privileges;
  • 取消授權:
    • 格式:revoke 權限 privileges on 庫.表 from ‘用戶’@‘主機’;
    • 示例:revoke all privileges on test.* from ‘liusan’@’%’;
  • 刪除用戶:
    • 格式:drop user ‘用戶’@‘主機’
    • 示例:drop user ‘liusan@’%’
  • root用戶遠程登錄:
    • sudo mysql_secure_installation,根據提示配置,允許root用戶遠程登錄
    • 修改配置文件:sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
      • 將bind-address=127.0.0.1,改爲bind-address=0.0.0.0
    • 給root添加授權主機,%表示所有主機
      • 如:grant all privileges on . to ‘root’@’%’ identified by ‘123456’
      • 給root用戶添加任意主機以123456作爲密碼登錄,對所有的庫下的所有表用於所有權限

多表聯合查詢

  • 隱式內連接:沒有出現join關鍵的連接
    • 示例:select username,name from user,goods where user.gid=goods.gid;
    • 說明:查看用戶買的商品名
  • 顯式內連接:會出現join關鍵字,後面的條件使用on
    • 示例:select username,name from user [inner/cross] join goods on user.gid=goods.gid;
    • 說明:功能同上
    • join前可以加inner,也可以使用cross,也可以省略
  • 外左連接:以左表爲主
    • 示例:select username,name from user left [outer] join goods on user.gid=goods.gid;
    • 說明:以左表爲主,顯示左邊所有內容,右表不匹配的選項顯示NULL

DTL,數據事務語言

事務的定義:
就是指一組相關的SQL操作,我們所有的操作都是事務中的。

注意:在數據庫中,執行業務的基本單位是【事務】,不是以某一條SQL。
數據庫在默認情況下,事務是都打開的,也就是說它一種處在事務當中的,一個事務的結束,代表着下一個事務的開啓。
執行commit或者rollback指令時,會結束當前事務

作用:用來保證數據的平穩性和可預測性
例如:銀行轉賬業務
SQL1:A賬號向B賬號轉賬10000
update tbl_account set balance=balance-10000 where accountNo=A賬號;
SQL2:
update tbl_account set balance=balance+10000 where accountNo=B賬號;
SQL1和SQL2必須處在同一個事務中,從而保證同時成功或者同時失敗。

事務的四大特性(ACID):
atomic,原子性,事務是不可分割的,要麼同時成功,要麼同時失敗;
consistency,一致性,事務一旦結束,內存中的數據和數據庫中的數據是保持一致;
isolation,隔離性,事務之間互不干擾,一個事務的結束意味着下一個事務的開啓;
duration,持久性,事務一旦提交,則數據持久化到數據庫中,永久保存

在oracle中,操作事務的命令:
1.commit,提交事務
把事務中所有的數據持久化到磁盤中

2.rollback to 回滾點,回滾事務
把事務中所做的操作全部取消,回到初始化狀態

3.savepoint 回滾點,設置回滾點
事務回滾時,回滾到起點

總結:
1.目前主流的數據庫都是支持事務的,而且其中Oracle支持的最好
2.一個事務不能讀取到另一個事務還沒有提交的數據
3.DDL語句都會自動提交事務
4.DML語句不會自動提交事務,需要手動提交commit
多事務的併發處理機制:
原因:多個事務同時操作一個表中的同一行數據,如果這些操作同時修改的話,就會產生併發問題,如果不處理,則會造成數據的不一致的情況

數據庫可能產生的併發問題包括:
1.髒讀
是指一個事務正在訪問數據,並且對這個數據進行修改,而這種修改還沒有提交到數據庫中,而另一個事務也訪問了這個數據,並且使用了這個數據。
解決方法:一個事務在修改數據時,該數據不能被其他事務訪問

2.不可重複讀:
是指一個事務多次讀取同一條記錄,如果此時另一個事務也訪問並且修改了該數據,則就會出現多次讀取出現數據不一致的情況,原來的數據變成了不可重複讀取的數據。
解決方法:只有在修改事務完全提交過後纔可以讀取數據

3.幻讀
是指一個事務修改表中的多行記錄,但是此時另一個事務對該表格進行了插入數據的操作,則第一個事務會發現表格中會出現沒有被修改的行,就像發生了幻象一樣;
解決方法:在一個事務提交數據之前,其他事務不能添加數據

Oracle中採用‘鎖’來做併發處理
1.表級排它鎖(X) exclusive mode
2.表級共享鎖(S) share mode
3.表中行級排它鎖 share row exclusive
注:這三種鎖是通過專門的命令來申請的

語法:
lock table tbl_name in mode;

例如:
–以共享鎖鎖表
lock table tbl_emp in share mode;

–以排它鎖鎖表
lock table tbl_emp in exlusive mdoe;

4.行級共享鎖(RS) row share
5.行級排它鎖(RX) row exclusive
注:這兩種鎖無需通過專門的命令申請,而是通過DQL和DML來自動申請的

注意:
1.所有的DQL語句默認情況下都會自動申請RS鎖
2.所有的DML語句默認情況下都會自動申請RX鎖,每一行記錄都有唯一的RX鎖
3.在項目中,爲了滿足業務要求,一般select語句需要申請RX鎖

select語句通過for update來申請RX鎖:
select * from s_emp for update;
select * from s_emp for update wait 5;等待5秒
select * from s_emp for update nowait;

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