1. 程式人生 > 實用技巧 >資料庫操作(增刪改查)

資料庫操作(增刪改查)

MySQL資料操作DML

DML(Data Manipulation Language 資料操縱語言)

DML是用來對資料庫裡的資料進行操作的語言。DML需要 commit
當使用 mysql 客戶端操作資料庫時,這些語句都會自動提交,不用執行 commit

MySQL資料庫查詢

結構化查詢語言SQL介紹
sql是用於訪問和處理資料庫的標準的計算機語言
什麼是SQL

SQL 指結構化查詢語言
SQL 使我們有能力訪問資料庫
SQL 是一種 ANSI 的標準計算機語言
注:ANSI,美國國家標準化組織

sql能做什麼?

SQL 面向資料庫執行查詢
SQL 可從資料庫取回資料
SQL 可在資料庫中插入新的記錄

SQL 可更新資料庫中的資料
SQL 可從資料庫刪除記錄
SQL 可建立新資料庫
SQL 可在資料庫中建立新表
SQL 可在資料庫中建立儲存過程
SQL 可在資料庫中建立檢視
SQL 可以設定表、儲存過程和檢視的許可權

sql是一種標準嗎,但是....

SQL 是一門 ANSI 的標準計算機語言,用來訪問和操作資料庫系統。SQL 語句用於取回和更新資料庫中的資料。SQL 可與資料庫程式協同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他資料庫系統。

不幸地是,存在著很多不同版本的 SQL 語言,但是為了與 ANSI 標準相相容,它們必須以相似的方式共同地來支援一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。

註釋:除了 SQL 標準之外,大部分 SQL 資料庫程式都擁有它們自己的私有擴充套件

建立表

create table student(
      id    int    auto_increament    primary key,
      name varchar(10),
      age   int(4),
      phone  int(32)
);

插入資料 (增)

insert into .... values
/*插入一條資料*/
insert into 表 (列名,列名...) values (值,值,值...)

/*一次插入多條資料 */ 
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)

/*以下為擴充套件*/
/*方式三*/
insert into 表1 (列名,列名...) select  列名,列名... from 表2

注意

這個插入是按行插入的 ;
每個欄位對應一個值,非常嚴格的一一對應;
形式:數字可以直接寫,字串和時間加單引號,但如果是函式值,則不能加引號;
auto_increment,timestamp等欄位無需插入

image.png
上面這個表用sql語句來寫
insert into student (name, age, phone) values('王麻子', 32, '13141098899');
$ 插入一行資料
insert into student (
    id,name, age, phone
) values(
    2,'九筒', 32, '13721096541'),
    (3,'六子', 18, '13139192657'),
    (4,'馬邦德', 37, '15855996688');     $插入多行資料

修改資料 (改)

update ...set...
update 表名 set 欄位名1=值表示式1,欄位名2=值表示式2,....[where條件] [order排序] [limit限定];
update  student set name='李四' where id=2  
 將id=2的那條資料中的九筒換成name是李四的

中間的欄位名可以修改多個 條件一定要是可以唯一標識的你要修改的那條記錄
執行updata語句的時候一定不能沒有wherer條件 執行沒有where的更新語句一定要慎重

查詢 (查)

select .... from 表名
select * from 表   -這個是全表查詢,建議不要這麼查會加重cpu
select * from 表 where id > 2  -加上條件的查詢id大於2的資訊
select id,name,age as gg from 表 where id > 2  -裡面的as是給前面要查詢那個欄位換個名字來顯示 僅作用於顯示 原表中的資料不會改變

高階查詢

a、條件
    select * from 表 where id > 1 and name != '王麻子' and age = 18;
    -查詢表中id大於1的資料並且name不等於王麻子且age等於18的資訊
    select * from 表 where id between 5 and 16;
    -查詢表中id在5到16 之間的資訊
    select * from 表 where id in (11,22,33)   -查詢id是11,22,33的1
    select * from 表 where id not in (11,22,33)   -查詢id不是11,22,33的1
    select * from 表 where id in (select id from 表)  -查詢的id是從另一長表中查詢出來的id
 
b、萬用字元
    select * from 表 where name like 'sha%'  - sha開頭的所有(多個字串)
    select * from 表 where name like 'shar_'  - sha開頭的所有(一個字元)
 
c、限制
    select * from 表 limit 5;            - 獲取前 5 行
    select * from 表 limit 0,2;          - 從第 1 行開始, 取出 2 行, 包含第 1 行
    select * from 表 limit 2 offset 0    - 從第 1 行開始, 取出 2 行, 包含第 1 行
 
d、排序
    select * from 表 order by 列 asc              - 根據 “列” 從小到大排列
    select * from 表 order by 列 desc             - 根據 “列” 從大到小排列
    select * from 表 order by 列1 desc,列2 asc    - 根據 “列1” 從大到小排列,如果相同則按列2從小到大排序
 
e、分組
    select age from 表 group by age   -相當於給age單獨分成一個小組
    select age,id from 表 group by age,id
    select age,id from 表  where id > 10 group by age,id order by id desc
    select age,id,count(*),sum(age),max(age),min(age) from 表 group by age,id
 
    select age from 表 group by age having max(id) > 10
    - having和where一樣都是篩選 但篩選不同 having是對group by 物件進行篩選的
    特別的:group by 必須在where之後,order by之前,order by 是最後進行的是對group by分的組進行排序
    
f、巢狀查詢
select * from  (select name from t1 where age>18 and age < 25 order by id desc limit 2 ) as tt  order by id; 
- 首先先執行括號中的select語句將t1表中的年齡在18到25之間的name 根據id從大到小排序只取兩行
  的資料結果 然後根據這個結果查詢所有結果別名為tt 並根據id進行排序

多表查詢

image.png

刪除 (刪)

delete from ...

後面一定加where條件 欄位唯一可以標識整行資料的 id

刪之前用select查查是否是要刪除的那個

慎重刪除

清空表的內容,表本身還在
delete from 表名    /*自增列的值繼續遞增,可以加 where 子句*/
truncate table 表名  /*自增列的值重新從 1 開始*/
/*刪除表中的所有資料,自增列的值繼續遞增*/
delete from tb1;

/*刪除表中的某些資料,被刪除的資料的自增列的值將不會再次出現,自增列的值繼續遞增*/
delete  from  tb1   where id < 20;

刪除表 表會消失

drop table  表名     /*整個表將不復存在*/

注意
“以行為單位”刪除
刪除語句中,where條件如果不寫,則就刪除了所有資料
order排序子句用於設定刪除資料的先後順序
limit限定子句用於限定在設定的順序情況下刪除指定的某些行

drop delete truncate的區別

drop 直接刪掉表
truncate 刪除表中資料,再插入時自增長id又從1開始
delete 刪除表中資料,可以加where字句, 增長 id 會繼續增長。
(1)DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。TRUNCATE TABLE則一次性地從表中刪除所有的資料並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度快。
(2) 表和索引所佔空間。當表被TRUNCATE後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操作不會減少表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。
(3) 一般而言,drop > truncate > delete
(4) 應用範圍。TRUNCATE只能對TABLE;DELETE可以是table和view(檢視)
(5)TRUNCATE和DELETE只刪除資料,而DROP則刪除整個表(結構和資料)。
(6)truncate與不帶where的delete:只刪除資料,而不刪除表的結構(定義)drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger)索引(index);依賴於該表的儲存過程/函式將被保留,但其狀態會變為:invalid。
(7)delete語句為DML(data maintain Language),這個操作會被放到rollback segment中,事務提交後才生效。如果有相應的tigger,執行的時候將被觸發。
(8)truncate、drop是DLL(data define language),操作立即生效,原資料不放到 rollback segment中,不能回滾
(9) 在沒有備份情況下,謹慎使用drop與truncate。要刪除部分資料行採用delete且注意結合where來約束影響範圍。回滾段要足夠大。要刪除表用drop;若想保留表而將表中資料刪除,如果於事務無關,用truncate即可實現。如果和事務有關,或老師想觸發trigger,還是用delete。
(10)Truncate table表名 速度快,而且效率高,因為:
truncate table 在功能上與不帶 WHERE 子句的DELETE語句相同:二者均刪除表中的全部行。但TRUNCATE TABLE比DELETE速度快,且使用的系統和事務日誌資源少。DELETE語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。TRUNCATE TABLE通過釋放儲存表資料所用的資料頁來刪除資料,並且只在事務日誌中記錄頁的釋放。
(11)TRUNCATE TABLE刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用DELETE。如果要刪除表定義及其資料,請使用DROP TABLE 語句。
(12) 對於由FOREIGN KEY約束引用的表,不能使用TRUNCATE TABLE,而應使用不帶WHERE子句的DELETE語句。由於TRUNCATE TABLE不記錄在日誌中,所以它不能啟用觸發器。

複製表的結構

-- 清空表資料
    TRUNCATE [TABLE] 表名

-- 複製表結構
    CREATE TABLE 表名 LIKE 要複製的表名

-- 複製表結構和資料
    CREATE TABLE 表名 [AS] SELECT * FROM 要複製的表名

-- 檢查表是否有錯誤
    CHECK TABLE tbl_name [, tbl_name] ... [option] ...

-- 優化表
   OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

-- 修復表
   REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]

-- 分析表
   ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] 
image.png

建立有外來鍵的表

create table class(
    id int not null auto_increment primary key,
    class_name varchar(8),
    create_date DATE
);

create table teacher(
    id int not null auto_increment primary key,
    name varchar(12) not null,
    class_id int(2) not null,
    foreign key (class_id) references class(id) - mysql 自動給外來鍵起名字teacher_ibfk_1*/
    
    /*給外來鍵命名*/
    /*constraint fk_class foreign key (class_id) references class(id)*/
);

建立完表就可以執行增、刪、改、查這些語句了 首先的是往表裡插入資料,後面的根據要求來進行操作

mysql> insert into class ( class_name, create_date ) values ( '雲端計算1805', '2018-05-16' );
mysql> insert into class ( class_name, create_date) values ( '雲端計算1806', '2018.06.16' );
mysql> insert into class ( class_name, create_date ) values ( '雲端計算1807', '2018_07_16' ),('雲端計算1808','20180816');

連表

企業通用方法

-- 查詢到 楊哥 多負責的班級的班級名
select teacher.name, class.class_name
from teacher, class
where 
teacher.class_id = class.id
and
teacher.name = "楊哥";


-- 查詢到 每個老師負責的班級名稱

select teacher.name, class.class_name
from teacher, class
where 
teacher.class_id = class.id;

-- 查詢到 雲端計算1806 班都有那些老師負責

select teacher.name, class.class_name
from teacher, class
where 
teacher.class_id = class.id
and
class.class_name = "雲端計算1806";
/*無對應關係則不顯示*/
select  A.class_name, B.name
from class as A, teacher as B
Where A.id = B.class_id
 
/* 內連線   無對應關係則不顯示*/
select A.class_name, B.name
from class as A inner join teacher as B
on A.id = B.class_id
 
/* 左連線   左邊的表(A)所有顯示,如果右邊的表(B)中無對應關係,則值為null*/
select A.class_name, B.name
from class as A left join teacher as B
on A.id = B.class_id
 
/* 右連線 右邊的(B)表所有顯示,如果左邊的表(A)中無對應關係,則值為 NULL*/
select A.name, B.name
from class as A right join teacher as B


作者:_str_
連結:https://www.jianshu.com/p/6a748cc6e99e
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。