orcl資料庫連線字串+DbHelperOra
1.資料庫簡答介紹:
1)什麼是資料庫——儲存資料的倉庫
2)常見的資料庫:Mysql、Oracle、SQLServer、MongoDB
關係型資料庫:Mysql、Oracle、SQLServer
非關係型資料庫:MongoDB
本文接下來重點在於Mysql,其他關係型資料和Mysql類似,非關係型資料庫mongodb參考另一篇文章:
2.MySQL必知:
1)MySQL的預設埠:3306
2)每條語句以【;】結尾
3)不區分大小寫
4)專屬名字:表、記錄(行)、欄位值(用以對標mongodb中的集合(collection)、文件(document)、欄位值(filed))
5)mysql有哪些約束:非空(nut null)、主鍵約束(primary key)、外來鍵約束(foreign key)、唯一性(unique)
小tips:工作中的表不建議加主外來鍵約束
3.Mysql資料型別:int、tinaint、smallint、bigint、float、 double、decimal、set、enum、char、varchar、year、time、date、timestamp、datetime、text、json
1)數值型別:int、tinaint、smallint、bigint、float、double、decimal
float:4個位元組,最多7個有效位,精度不夠自動補全小數位,超過精度會四捨五入,最多顯示7個有效位,超過7個顯示亂七八糟的數
double:8個位元組,最多15個有效位
decimal:M+2個位元組,最多28個有效位
tips:
與金錢掛鉤的資料一般用decimal型別比較好,比如:【salary decimal(9,2)】——總共9位,2位小數)
int(10)只代表顯示10位,不足的話前面補0
2)字元型別:char、varchar
char:預設1個有效位、固定長度,如果不足則用空格補齊(所以搜尋的時候需要去末尾空格),浪費空間,效能高
varchar:沒有預設有效位,必須給定長度、節約空間,效能低
3)列舉型別:enum(單選)、set(可多選),這倆型別的欄位在資料庫插入值時用的是序號,而不是值
tips:省份、性別最好用enum型別
4)日期型別:year(YYYY)、date(YYYYMMDD)、time(HHMMSS)、datetime(預設為空:YYYYMMDDHHMMSS)、timestamp(預設為系統當前時間:YYYYMMDDHHMMSS)
面試題:一個表中的某一列被定義為Timestamp格式時,會發生什麼? tips:timestamp在定義列的型別時: 下面這句話update_time的值只有資料行新建的時候才會獲取系統當前時間: alter table user info add column update_time timestamp not null default current_timestamp; 下面這句才是在更新時獲取系統當前時間 alter table user info add column update_time timestamp nut null default current_timestamp on update current_timestamp; 注意: 1)not null 必須寫,如果不寫,這列的值一直為null 2)default current_time 這裡的deafult不設定值的話,會一直顯示【0000-00-00 00:00:00】 實際中的使用場景:資料庫中一般會有兩個欄位,一個為建立時間,一個為更新時間,就可以用,其中一個欄位設定為【default current_timestamp】,另一個設定為【default current_timestamp on update current_stamp】4.Mysql的語句:
1)庫操作語句
檢視已有的庫:show databases;
建立資料庫:create database 資料庫名;
檢視當前所在的庫:select database();
切換庫:use 庫名;
檢視當前庫中已有的表:show tables;
刪除庫:drop database 庫名;
資料庫備份:mysqldump -u root -p >>> beifeng.sql
匯入資料庫:source beifeng.sql
2)表的操作
建立表:create table 表名(欄位名1 資料型別 約束,欄位名2 資料型別 約束,欄位名3 資料型別 約束) default chartset=utf8;
檢視建立表的語句(字符集):show create table 表名;
查看錶結構(3種方法):desc 表名; describe表名; show create table 表名;
插入列:alter table 表名 add column 列名 型別 約束;
刪除列:alter table表名 drop column;
刪除表:drop table 表名;
表裡插入資料: insert into 表名 (欄位1,欄位2,欄位3) values(值1,值2,值3);
3)表查詢語句:
關鍵字:where、as、and、or、in、not in、group by、order by、having、like、on、is、left join、right join、inner join、=、>、<、count、avg、max、min、distinct、union、is null、between、limit等
like:%多個字元,_一個字元,一般用like代替=
union:把前後兩個select出來的列的所有不同項都列出來
order by::預設asc,desc降序,多個條件時先按第一個條件排序,在第一個條件相同的行按第二個排序以此類推
group by:分組(用來去重挺好用的)
having:只和group by配合使用,在group by的結果中進行篩選
limit:分頁 limit 10,15
distinct:去重,單一的只有一個去重功能,而且必須寫在列名前
in:如果後面跟子查詢,子查詢的結果只能有一列
舉例:
select u.class as cls,u.name as nam from userinfo u where u.class in (select g.class from grade g where g.class like 'A%') and u.name='李白';
select class,count(*) as num from user group by class having num=1;
select distinct class from user;
mysql> select * from grade; +----+-------+-------+ | id | class | grade | +----+-------+-------+ | 1 | A01 | one | | 2 | B01 | two | | 3 | xxx | xxx | +----+-------+-------+ 3 rows in set (0.00 sec) mysql> select * from userinfo; +----+-----------+-------+---------------------+ | id | name | class | update_time | +----+-----------+-------+---------------------+ | 1 | xiaoming1 | A01 | 2020-10-18 22:26:21 | | 2 | xiaoli | B01 | 2020-10-18 22:20:25 | | 3 | wangwu | C01 | 2020-10-18 22:20:25 | | 4 | zhaoliu | A01 | 2020-10-18 22:20:25 | | 5 | 李白 | A01 | 2020-10-20 07:41:15 | +----+-----------+-------+---------------------+ 5 rows in set (0.00 sec) mysql> select class from userinfo union select class from grade; +-------+ | class | +-------+ | A01 | | B01 | | C01 | | xxx | +-------+ 4 rows in set (0.01 sec)
union distinct : 把union後的欄位值進行去重
mysql> select class from userinfo union distinct select class from grad e; +-------+ | class | +-------+ | A01 | | B01 | | C01 | | xxx | +-------+ 4 rows in set (0.00 sec)
union:把所有union出來的值都顯示出來
mysql> select class from userinfo union all select class from grade; +-------+ | class | +-------+ | A01 | | B01 | | C01 | | A01 | | A01 | | A01 | | B01 | | xxx | +-------+ 8 rows in set (0.00 sec) mysql> select class from userinfo union select grade from grade; +-------+ | class | +-------+ | A01 | | B01 | | C01 | | one | | two | | xxx | +-------+ 6 rows in set (0.00 sec)
4)索引檢視事務儲存過程:
事務:就是一系列操作,要麼一起提交做完,要麼其中一個報錯就全都不錯回滾
事務的特性:原子性、一致性、隔離性、永續性 開始事務:begin; 提交事務:commit; 回滾事務:rollback; set autocommit=0; 索引的底層原理:B+樹建立索引:create index 索引名字 on 表名(欄位名)
刪除索引:drop index 索引名字 on 表名
建立臨時表,命令列視窗關閉就沒了:create temporary table XXX();
建立檢視:create view 檢視名(欄位1,欄位2,欄位3) as select XXX
create view test (num,class,grade) as select count(userinfo.class),userinfo.class,grade.grade fromuserinfo left join grade on userinfo.class=grade.class group by userinfo.class,grade.grade;
select *,if(num>1,'more','less') as level from test; 簡單的一個儲存過程:儲存過程常用於批量造資料mysql> delimiter $$ mysql> create procedure select_class(in u_id int) -> begin -> select * from userinfo where id=u_id; -> end$$ mysql> delimiter ; mysql> call select_class(1)5)連線查詢:內連線、左連線、右連線 注意:連線查詢的條件是用on關鍵字: select * from user left jion grade on user.class=grade.class 內連線就是交叉連線,只連線兩個表中欄位相同的 左連線,以左表為主表,按連線欄位匹配右表,如果沒能在右表中匹配到的話,那就左表完全顯示,沒有匹配到的右表部分顯示null 右連線和左連線一樣的道理,只不過以右表的基表
小tips:mysql裡命令列設定utf8才是utf8,實際上通過desc看是【utf8mb4】,這個才是真正的utf8,如果工具上右鍵的話設定的話,不起作用
5.mysql效能:
一個好的mysql資料庫設計:
1)儘量避免jion連線 2)適當的新增索引 3)主從配置,讀寫分離 4)新增快取機制 5)不使用select * 等查詢語句 開始Mysql的慢查詢分析就會自動幫捕獲慢sql了,開啟之前先把引數設定好,比如:long_query_time=1,slow_query_log開關開啟: 實際工作中遇到的寫的比較難的一個語句: select if(concat(a.name,a.class)=(select concat(b.name,b.class) from b where a.id=b.id),1,0) as status from a;