数据库的安装启动系列:
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 |