一、資料庫常規概念 1、什麼是資料庫 資料庫是“按照數據結構來組織、存儲和管理數據的倉庫”。 2、有哪些常見的資料庫管理系統 關係型資料庫:存儲的數據是表結構的數據 MySQL Oracle SQLServer DB2 SQLite 非關係型資料庫:存儲的是鍵值對形式的數據 redis ...
一、資料庫常規概念
1、什麼是資料庫
資料庫是“按照數據結構來組織、存儲和管理數據的倉庫”。
2、有哪些常見的資料庫管理系統
關係型資料庫:存儲的數據是表結構的數據
MySQL Oracle SQLServer DB2 SQLite
非關係型資料庫:存儲的是鍵值對形式的數據
redis mongodb memorycache
3、資料庫有哪些存儲單位
資料庫(Database)保存有組織的數據的容器(通常是一個文件或一組文件)。
數據表(Table)某種特定類型數據的結構化清單。
列(Column)表中的一個欄位。所有表都是由一個或多個列組成的。
行(Row)表中的一個記錄。
4、什麼是SQL語句
SQL是Structured Query Language(結構化查詢語言)的縮寫,SQL是一種專門用來與資料庫溝通的語言,是一種從資料庫中讀寫數據的簡單有效的方法。
二、對資料庫及表的基礎操作
1、連接資料庫伺服器 mysql -hlocalhost -uroot -p123456
2、2.退出伺服器 exit
3、查看所有的資料庫 show databases;
4、創建一個資料庫 create database java;
5、刪除資料庫 drop database java;
6、選中進入資料庫 use java;
7、查看資料庫java中所有的表 show tables;
8、在資料庫java中建person表
create table person(id int, name varchar(32), age int, info text);
語法格式: create table 表名 (欄位1 數據類型, 欄位2 數據類型,...);
9、11.查看person表的結構 desc person;
10、刪除表 drop table person;
11、修改表 語法格式: alter table 表名 +操作;
a、刪除info欄位 語法格式: alter table 表名 drop 欄位;
alter table person drop info;
b、在當前表中添加欄位 語法格式: alter table 表名 add 欄位 數據類型;
alter table person add sex boolean;
c、修改某一個欄位的數據類型 alter table 表名 modify 欄位 新的數據類型;
alter table person modify name char(32);
d、同時修改欄位名字和欄位數據類型 語法格式: alter table 表名 change 老欄位 新欄位 新的數據類型;
alter table person change sex gender int;
二、MySQL常用數據類型
1、tinyint(n) 用於存儲小整數值,括弧內的n為欄位的最大長度 。
例:tinyint(2)指定欄位類型為整數,長度最大為2。
2、int(n)用於存儲大整數值;括弧內的n為欄位的最大長度,可不寫,預設11位
3、decimal(M,D)用於存儲小數值,M為欄位最大位數,D為小數點後最大位數。
例:decimal(9,3)指定欄位最多9位,小數點後最多三位。
4、char(n) 用於存儲字元串的定長字元串,欄位長度固定占n位
5、varchar 用於存儲字元串的變長字元串,欄位最多n位
註:varchar與char的區別在於varchar的長度可變,欄位實際需要幾位便占幾位,更能節省記憶體。
6、text 用於存儲文本數據,varchar和char做大隻能存儲255個字元,超過255個字元的字元串只能以文本的形式存儲。
7、timestamp、時間戳,用於存儲混合日期和時間值。
alter table person add regTime timestamp default current_timestamp;
時間戳類型的一個欄位如果將預設值設為current_timestamp,在寫入一條數據時,這條數據的這個欄位的預設值為變為寫入數據的時間。
三、對錶中數據的增刪改操作
1、插入數據
語法:insert into 表名稱 values (值1, 值2,....), 必須安照表的欄位順序寫入全部對應類型數據
例: insert into person values(1, "蓋倫", 12, 89272.78, 1,now());
或 insert into 表名稱 (列1, 列2,...) values (值1, 值2,....) 後面的值需與前面的的保存對應,但前面的列的順序可以隨意,且不要求寫出全部欄位名,未出現的欄位會符預設值。
例: insert into person (id, name, age, salary) values (2, "亞索", 34, 27288.98);
可一次插入多條數據,數據之間用“,”分隔
例: insert into person(id, name) values(4, "世齊"), (5, '永傑'),(6, "狗蛋");
2、刪除數據
語法:delete from 表名稱 where 列名稱 = 值
例1:delete from person where id = 4;
例2:delete from person where name = "蓋倫";
例3:delete from person where id in(2,3, 5); #刪除id為2、3、5的數據
例4:delete from person; #表名後沒有限制條件,刪除表中所有數據。
3、修改數據
語法: update 表名稱 set 列名稱1 = 新值1,列2=新值2,列3=新值3.... where 列名稱 = 某值
例: update person set name="蓋倫", age = 89 where id = 1;
4、數據的約束
1、預設值 default
創建表時,如果一個欄位聲明瞭預設值(default),用戶在插入的數據時候,如果沒有給當前欄位賦值,會給當前欄位賦值一個預設值。例:
mysql> create table person2 ( -> id int, -> name varchar(32), -> country varchar(32) default "CHINA" -> ); Query OK, 0 rows affected (0.02 sec) mysql> desc person2; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(32) | YES | | NULL | | | country | varchar(32) | YES | | CHINA | | +---------+-------------+------+-----+---------+-------+ mysql> insert into person2(id, name) values(1, "蓋倫"); Query OK, 1 row affected (0.00 sec) mysql> select * from person2; +------+--------+---------+ | id | name | country | +------+--------+---------+ | 1 | 蓋倫 | CHINA | +------+--------+---------+ 1 row in set (0.00 sec)
2、非空 not null
如果給欄位設置了非空,在添加數據的時候,必須給當前欄位設置值。如果不設置會報錯。例:
mysql> create table person3( -> id int, -> name varchar(32) not null -> ); Query OK, 0 rows affected (0.01 sec) mysql> desc person3; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(32) | NO | | NULL | | +-------+-------------+------+-----+---------+-------+ mysql> insert into person3 (id, name) values(1, "sahj"); Query OK, 1 row affected (0.00 sec) mysql> insert into person3 ( name) values( "ss"); Query OK, 1 row affected (0.00 sec) mysql> insert into person3 (id) values(3); ERROR 1364 (HY000): Field 'name' doesn't have a default value mysql> select * from person3; +------+------+ | id | name | +------+------+ | 1 | sahj | | NULL | ss |
3、唯一 unique
設置欄位的值是唯一的,如果添加數據的時候重覆數據的話會報錯。例:
mysql> create table person4 ( -> id int, -> name varchar(32) unique -> ); Query OK, 0 rows affected (0.02 sec) mysql> insert into person4(id, name) values(1, "嘻嘻"); Query OK, 1 row affected (0.01 sec) mysql> insert into person4(id, name) values(2, "嘻嘻"); ERROR 1062 (23000): Duplicate entry '嘻嘻' for key 'name' mysql>
4、主鍵 primary key
是唯一和非空的組合,
主鍵必須包含唯一的值。
主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,並且每個表只能有一個主鍵。例:
#在設計資料庫的時候,一定要有一個欄位是主鍵,而且主鍵的欄位一般和業務邏輯無關。name和age等容易重覆不能設置為主鍵,開發中一般將id設置為主鍵 mysql> create table person5( -> id int primary key, -> name varchar(32) -> ); Query OK, 0 rows affected (0.01 sec)
mysql> insert into person5(name) values("嘻嘻"); ERROR 1364 (HY000): Field 'id' doesnot have a default value mysql> insert into person5(id, name) values(1,"嘻嘻"); Query OK, 1 row affected (0.00 sec) mysql> insert into person5(id, name) values(1,"嘻嘻"); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' mysql>
5、自增長 auto_increment
auto_increment 一般在開發中 主鍵設置為自增長,主鍵一旦設置為自增上,新增數據時不用填充主鍵欄位,主鍵會自動在上一次插入數據時主鍵的值加1,填入這次的主鍵。例:
mysql> create table person7( -> id int primary key auto_increment, -> name varchar(20) -> ); Query OK, 0 rows affected (0.11 sec) #在插入數據的時候,如果主鍵設置自增長,就可以不對主鍵進行賦值了,會從1開始一直往下加1 mysql> insert into person5 (name) values("狗蛋"); Query OK, 1 row affected (0.05 sec) mysql> select * from person5; +----+--------+ | id | name | +----+--------+ | 1 | 狗蛋 | +----+--------+ 1 row in set (0.00 sec) mysql> insert into person5 (name) values("hanran"); Query OK, 1 row affected (0.06 sec) mysql> insert into person5 (name) values("nanhang"); Query OK, 1 row affected (0.04 sec) mysql> select * from person5; +----+---------+ | id | name | +----+---------+ | 1 | 狗蛋 | | 2 | hanran | | 3 | nanhang | +----+---------+ mysql> delete from person5 where id = 3; Query OK, 1 row affected (0.09 sec)
6、外鍵約束
表中的一個欄位 作為一個外鍵,去關聯另外一張部門表的主鍵,將兩張表關聯起來。
mysql> create table dept ( -> id int primary key auto_increment, -> deptName varchar(32) not null -> );
mysql> create table employee ( -> id int primary key auto_increment, -> empName varchar(32) not null, -> deptId int not null, -> regTime timestamp default current_timestamp, #constraint : 約束 #fk_emp_dep: 給外鍵起的名字 隨便起名字 # foreign key(deptId): 外鍵 對哪個欄位設置外鍵 當前表的 #references: 關聯 #dept(id): 另外一張表中的主鍵 dept(id) -> constraint fk_emp_dep foreign key(deptId) references dept(id) #on delete cascade 級聯刪除 -> on delete cascade #on update cascade 級聯修改 -> on update cascade -> );
5、事務的操作(入門)
使用事務的目的是保證數據的安全。
事務內的全部操作要麼全部成功,要麼全部失敗。
例如:張三要轉給李四100元,在資料庫的具體操作分為兩步
1、使張三賬戶減少100元;
2、使李四賬戶增加100元;
未使用事務時,在操作1完成後,如果有意外情況(如伺服器宕機)導致轉賬操作不能繼續進行第2步
就會出現轉出了100元,李四卻未收到的情況。
開啟事務後,操作1完成後,操作結果不會直接提交,要等到後續操作全部成功後,所有結果一同提交,
若後續有某個操作因意外情況失敗,則會對操作進行回滾,將一切回覆到未開始操作的狀態。
開啟事務(即關閉自動提交)
set autocommit=0; #autocommit為0時自動提交關閉,為1時自動提交開啟。
增刪改sql 不會自動提交
會有兩種狀態:
回滾: roolbakc; 增刪改sql語句沒有執行
提交: commit; 增刪改sql語句執行