數據庫操作(增刪改查)


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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM