SQL語句
- 數據定義語言(DDL Data Definition Language):創建、修改或刪除數據庫中表、視圖、索引等對象的操作,常用命令爲create、alter和drop。
/*創建:
create database 數據庫名 [ character set 字符集 ] */
create database student character set utf8
/*創建表:*/
create table student(
id char(12),
name varchar(20),
mobile char(11),
address varchar(30)
)
/*刪除:
drop database 數據庫名稱*/
drop database student
/*修改:
alter database 數據庫名 character set 編碼*/
alter database student character set utf8
- 數據查詢語言(DQL Data Query Language):按照指定的組合、條件表達式或排序檢索已存在的數據庫中數據,不改變數據庫中數據,常用命令爲select。
/*查詢:
select from student [where ='']*/
delete from student where id='001'
/*查看正在使用的數據庫 select database()*/
select database()
/*查看MySQL數據庫管理系統中所有數據庫:show databases*/
show database
/*查看某個數據庫的定義信息:show create database 數據庫名*/
show create database
- 數據操縱語言(DML Data Manipulation Language):向表中添加、刪除、修改數據操作,常用命令有insert、update和delete。
/*刪除數據*/
delete from student where id='001'
/*修改數據*/
update student set name='Jim',mobile='13528375637' where id='002'
/*添加數據*/
insert into student (id,name,mobile,address) value('001','Jack','13526509597','henan')/*依次對應添加*/
insert into student value('002','Make','18703628548','zhengzhou')/*默認全部依次添加*/
- 數據控制語言(DCL Data Control Language):用來授予或收回訪問數據庫的某種特權、控制數據操縱事務的發生時間及效果、對數據庫進行監視等操作,常用命令有GRANT、REVOKE、COMMIT、ROLLBACK。
rollback;
commit;
事務
事務四大特性(ACID):
- 原子性(Atomicity):化學中的原子指不可再分的基本微粒,數據庫中原子性強調事務是一個不可分割的整體,事務開始後所有操作要麼全部成功,要麼全部失敗,不可能停滯在中間某個環節。如果事務執行過程中出錯就會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣不會對數據庫有任何影響。
- 一致性(Consistency):事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,即一個事務執行之前和執行之後都必須處於一致性狀態。拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還是5000,這就是事務的一致性。
- 隔離性(Isolation):當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離,比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉入錢。
- 持久性(Durability):一個事務一旦被提交,則對數據庫的所有更新將被保存到數據庫中,不能回滾。
完成一個事務:
(在轉賬時,轉出和轉入必須同時成功才能修改餘額數據,若有任意一個不成功,則不對數據庫內容進行修改)
通過Navicat Premium操作:
#創建一個用戶信息表
create table account(
id char(36) primary key,
card_id varchar(20) unique,
name varchar(8) not null,
money float(10,2) default 0
);
insert into account values('6ab71673-9502-44ba-8db0-7f625f17a67d','1234567890','張三',1000);
insert into account (id,card_id,name) values('9883a53d-9127-4a9a-bdcb-96cf87afe831','0987654321','張三');
select * from account
update account set money=money-100 where card_id='1234567890';
update account set money=money+100 where card_id='0987654321';
select * from account
update account set money=money-100 where card_id='1234567890';
update account set money=money+100 where card_d='0987654321';
select * from account
#默認:每一條sql語句都是一個獨立的事務,執行完單條sql語句後直接持久化到磁盤
set autocommit=0;#設置執行完一條sql語句後不再自動提交
update account set money=money-100 where card_id='1234567890';
update account set money=money+100 where card_d='0987654321';
commit;#手動提交
rollback;#手動回滾
select * from account
通過Java操作:
package com.jd.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public boolean batch(String...sqls) {
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver");//1、加載驅動
String url = "jdbc:mysql://127.0.0.1:3306/test";
connection = DriverManager.getConnection(url ,"root","root");//2、獲取連接
connection.setAutoCommit(false);//3、關閉自動提交
Statement statement = connection.createStatement();//4、創建sql語句
for (String sql : sqls) {
statement.addBatch(sql);
}
statement.executeBatch();//5、執行sql語句
connection.commit();//6、手動提交
return true;
} catch (Exception e) {
try {
if (connection!=null) {
connection.rollback();//7、若出現問題,則進行回滾
}
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
return false;
}
public static void main(String[] args) {
if(new Test().batch("update account set money=money-100 where card_id='1234567890'","update account set money=money+100 where card_id='0987654321'")) {
System.out.println("Yes");
return;
}
System.out.println("No");
}
}