1. 程式人生 > 實用技巧 >orcl資料庫連線字串+DbHelperOra

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;