數據庫的安裝啓動系列:
1,將Mysql啓動路徑配置在windows環境變量裏,在環境變量path裏的頭行輸入mysql的bin路徑,C:\program files\mysql\bin;
2,mysql的啓動:net start mysql
mysql -uroot -p123 -h127.0.0.1
其中-u後面表示用戶名,-p後面表示用戶名密碼,-h表示要登錄數據庫的ip地址。
3,mysqladmin -uroot -p[password] 修改密碼,
|--但是對於初始數據庫的修改密碼,可用下列方式,(因爲初始密碼爲空)
mysqladmin -u root password [你要修改的密碼]
4、mysql -uroot -p[password] -------直接登錄
5、mysql -uroot -p[password] -h[IP] 登錄別人的數據庫
6、alter table [表] add constraint [約束名稱] check ([約束條件])
add constraint [約束名稱] foreign key [主鍵名] references [表].[主鍵名]
創建數據庫時的注意項:
1、create datebase [t] character set utf8 collate utf8_general_ci; --表示在創建數據庫的時候設置數據庫字符編碼以及字符集爲utf8和他、ut8_genearal_ci.中文編碼集。(若不設置,其默認設置爲lan_ti字符,在後面插入中文字符數據的顯示的時候會顯示亂碼)所以要注意了。
2、那麼不小心在創建數據庫的時候沒有設置字符編碼爲utf8怎麼辦呢,這個時候我們就可以在創建後對數據庫的字符編碼進行修改。
alter database [db] character set utf8 collate utf8_general_ci;
alter datebase [db] character set GBK collate utf8_general_ci;
但是注意以前的數據任然爲亂碼,設置之後的數據爲正常字符。
3、創建表時設置字段編碼
use [db];
drop table [dbt] if exists [dbt] ;
create table [dbt] (
id int(10) auto_increment,
user_name varchar(60) character set utf8 collate utf8_general_ci,
email varchar(60) primary key(id)
) character set utf8 collate utf8_general_ci;
4、修改表編碼
alter table [dbt] character set utf8 collate utf8_general_ci;
5、查看所有字符編碼
show character set;
6、查看數據庫編碼
show variables like '%char%'; -- 查看數據庫編碼
set character_set_server = "utf8" --設置數據庫編碼
7、查看某字段使用的編碼
select charset(id) from [dbt];
mysql的備份以及還原:
1、例如有個java數據庫,
mysqldump -u[用戶名] -p[password] java > F:\java.bak
還原:
mysql -u[用戶名] -p[password] java < F:\java.bak
配置文件的處理:(my.ini或者my-default.ini配置文件)
若配置文件沒有[client],自己手動添加。並在下方添加default-character-set=utf8
若配置沒有[mysql] 手動添加,並在下方添加default-character-set=utf8
在[mysqld]項裏添加character-set-server=utf8
該配置可以處理數據顯示亂碼問題。
常用函數類:
1、now()表示返回現在時間值,時間格式爲日期: 例如:2017-5-5 12:50:20,此情景也可以用在創建表的時候,
create table emp1 (ordertime datetime default NOW() );
2、abs(x),表示返回x的絕對值。例如:
select abs(deptno) from [dbt];
3、PERIOD_ADD(datetime1,datetime2),表示返回兩個時間的差值
select PERIOD_ADD(20030201,20170205);
返回值爲:188115206
4、curdate()或current_date()返回目前日期:
select curdate() as 現在日期;
select CURRENT_DATE() as 現在日期;
5、關於MySQL的top用法,MySQL無select top n from table 用法
所以可以用limitv n 代替
select * from table limit 10; //表示查看前10行
或者
select * form table limit n,m; //查看指定行之間
6、更改表名稱
alter table [表名] rename to [新表名];
7、修改默認存儲引擎
在my.ini文件里加入或者修改一下一句話
default-storage-engine=[存儲引擎名稱]
其中有九種引擎名稱可以選擇,但要看你的MySQL是否支持這些引擎了。
8、三種常用的存儲引擎
1)、MyISAM存儲引擎:由於該存儲引擎不支持事物、外鍵所以訪問速度比較快,所以對事物完整性要求不高可以選用此存儲引擎。
2)、InnoDB存儲引擎:在事務上具有優勢,支持具有提交、回滾和崩潰恢復能力,所以會比MyISAM存儲引擎會佔用更多的磁盤空間
3)、MEMORY存儲引擎:是使用內存來存儲數據,所以訪問數據的速度非常快,但安全上沒有保障。
二、表操作、
9、查看錶結構
DESC [表名稱];
10、在表裏增加字段
alter table [表名稱] add 【屬性名】 【屬性類型】;
11、對進行重新命名
alter table [表] rename [新命名] ;
12、在某一字段後添加字段
alter table [表] add [屬性名] [屬性類型] after [屬性名] ;
13、 插入數據
1. 正常插入數據
insert into table_test value("value1","value2","value3");
2. 其他方式插入數據(表之間的插入數據)
insert into table_test(test1,test2,test3) SELECT test1,test2,test3 FROM table_test1;
把table_test1表的test1,test2,test3字段的值查出來並插入到table_test表中。
14、 刪除
正常刪除數據(單表)
delete from table where ...
連表刪除數據
delete A.*,B.* from A join B on A.test1 = B.test1;
當表之間有外鍵連接的時候可能會刪除數據失敗
比如:table_test(test1 int primary key,test2 int, test3 int)
table_test1(test4 int primary key,test5 int)
兩張表用test1與test4進行連接
若刪除兩張表內test4字段爲7的數據:
DELETE table_test,table_test1
FROM table_test LEFT JOIN table_test1 ON table_test.`test1` = table_test1.`test4`
WHERE table_test1.`test4` = 7;
執行上述語句會有報錯。因爲有外鍵約束。
所以要先取消外鍵約束問題,然後在刪除數據後,在將外鍵恢復即可
set foreign_key_checks = 0;來將所有的外鍵取消
DELETE table_test,table_test1
FROM table_test LEFT JOIN table_test1 ON table_test.`test1` = table_test1.`test4`
WHERE table_test1.`test4` = 7;
set foreign_key_checks = 1;來將外鍵恢復
CAST函數的使用:
CAST函數語法規則是:Cast(字段名 as 轉換的類型 ),其中類型可以爲:
CHAR[(N)] 字符型
DATE 日期型
DATETIME 日期和時間型
DECIMAL float型
SIGNED int
TIME 時間型
實例1:
表table1
date:2015-11-03 15:31:26
select cast(date as signed) as date from table1;
結果如下:
date:20151103153126
select cast(date as char) as date from table1;
結果如下:
date:2015-11-03 15:31:26
實例2:
select cast(date as datetime) as date from table1;
結果如下:
date:2015-11-03 15:31:26
實例3:
select cast(date as date) as date from table1;
結果如下:
date:2015-11-03
實例4:
select cast(date as time) as date from table1;
結果如下:
date:15:31:26
這裏date對應日期,time對應時間
實例5:
表table2
num:20
select cast(num as decimal(10, 2)) as num from table2
結果如下:
num:20.00
REGEXP_REPLACE函數的使用:
現有字符串如下“000000-00000h-010000-C0000b-000000-000000-000000-d0000d-0002e0-00003a”
要求:
1、全爲0的子串不替換
2、把由0 開始的子串第一個“0”替換爲“A”
替換後結果如下
“000000-A0000h-A10000-C0000b-000000-000000-000000-d0000d-A002e0-A0003a”
先看語句,然後解釋
WITH tab AS
(SELECT '000000-00000h-010000-C0000b-000000-000000-000000-d0000d-0002e0-00003a' col FROM dual
UNION ALL
SELECT '00000h-010000-C0000b-000000-000000-000000-d0000d-0002e0-00003a' col FROM dual)
SELECT ltrim(regexp_replace(col, '(^0|-0)(0{0,}[^0-]{1,}[^-]{0,})', '-A\2'), '-') AS col
FROM tab;
COL
--------------------------------------------------------------------------------
000000-A0000h-A10000-C0000b-000000-000000-000000-d0000d-A002e0-A0003a
A0000h-A10000-C0000b-000000-000000-000000-d0000d-A002e0-A0003a
爲了便於理解。我們來分拆下。首先分把各子串均轉爲一行顯示,然後把各正則分組分列顯示。
WITH tab0 AS
(SELECT '000000-00000h-010000-C0000b-000000-000000-000000-d0000d-0002e0-00003a' col
FROM dual),
tab AS
(SELECT regexp_substr(col, '(^0|-)[^-]+', 1, LEVEL) AS col
FROM tab0
CONNECT BY LEVEL <= regexp_count(col, '-') + 1)
SELECT col,
ltrim(regexp_replace(col, '(^0|-0)(0{0,}[^0-]{1,}[^-]{0,})', '-A\2'), '-') AS col0,
regexp_replace(col, '(^0|-0)(0{0,})([^0-]{1,})([^-]{0,})', '\1') AS col1,
regexp_replace(col, '(^0|-0)(0{0,})([^0-]{1,})([^-]{0,})', '\2') AS col2,
regexp_replace(col, '(^0|-0)(0{0,})([^0-]{1,})([^-]{0,})', '\3') AS col3,
regexp_replace(col, '(^0|-0)(0{0,})([^0-]{1,})([^-]{0,})', '\4') AS col4
FROM tab;
結果如下
COL | COL0 | COL1 | COL2 | COL3 | COL4 |
000000 | 000000 | 000000 | 000000 | 000000 | 000000 |
-00000h | A0000h | -0 | 0000 | h | |
-010000 | A10000 | -0 | 1 | 0000 | |
-C0000b | C0000b | -C0000b | -C0000b | -C0000b | -C0000b |
-000000 | 000000 | -000000 | -000000 | -000000 | -000000 |
-000000 | 000000 | -000000 | -000000 | -000000 | -000000 |
-000000 | 000000 | -000000 | -000000 | -000000 | -000000 |
-d0000d | d0000d | -d0000d | -d0000d | -d0000d | -d0000d |
-0002e0 | A002e0 | -0 | 00 | 2e | 0 |
-00003a | A0003a | -0 | 000 | 3a |
正則表達式分爲四組
第一組:(^0|-0) 開頭爲0或-0,這一組限制了只能匹配以0開頭的子串,第4、8行不符合這個標準
第二組:0{0,} 0或多個0,這一組可爲空值,如第3行。
第三組:[^0-]{1,} 中間至少有一個非0 且非分割符的字符,這一組限制了子串不能都是0。第1、5、6、7都不符合這個標準
第四組:[^-]{0,} 串中不能有分隔符,這一組可爲空值,如2、10行
通過上圖可以看到能匹配的只有2、3、9、10四行。
按上面分爲四個組的方式,正則表達式也可以寫爲
regexp_replace(col, '(^0|-0)(0{0,})([^0-]{1,})([^-]{0,})', '-A\2\3\4')
而“-A\2\3\4”如果用上面的結果來模擬就是“'-A' || col2 || col3 || col4”
WITH tab0 AS
(SELECT '000000-00000h-010000-C0000b-000000-000000-000000-d0000d-0002e0-00003a' col
FROM dual),
tab AS
(SELECT regexp_substr(col, '(^0|-)[^-]+', 1, LEVEL) AS col
FROM tab0
CONNECT BY LEVEL <= regexp_count(col, '-') + 1),
tab1 AS
(SELECT col,
ltrim(regexp_replace(col, '(^0|-0)(0{0,})([^0-]{1,})([^-]{0,})', '-A\2\3\4'), '-') AS col0,
regexp_replace(col, '(^0|-0)(0{0,})([^0-]{1,})([^-]{0,})', '\1') AS col1,
regexp_replace(col, '(^0|-0)(0{0,})([^0-]{1,})([^-]{0,})', '\2') AS col2,
regexp_replace(col, '(^0|-0)(0{0,})([^0-]{1,})([^-]{0,})', '\3') AS col3,
regexp_replace(col, '(^0|-0)(0{0,})([^0-]{1,})([^-]{0,})', '\4') AS col4
FROM tab)
SELECT col, col0, ltrim('-A' || col2 || col3 || col4, '-') AS "-A\2\3\4"
FROM tab1
COL | COL0 | -A\2\3\4 |
000000 | 000000 | A000000000000000000 |
-00000h | A0000h | A0000h |
-010000 | A10000 | A10000 |
-C0000b | C0000b | A-C0000b-C0000b-C0000b |
-000000 | 000000 | A-000000-000000-000000 |
-000000 | 000000 | A-000000-000000-000000 |
-000000 | 000000 | A-000000-000000-000000 |
-d0000d | d0000d | A-d0000d-d0000d-d0000d |
-0002e0 | A002e0 | A002e0 |
-00003a | A0003a | A0003a |