'数据库部分'

数据库分类

1,层次式数据库 mysql (小企业) mariadb
2,网络式数据库 oracle (政府企业) postgresql

3,关系型数据库
4,非关系型数据库(常见)

关系型是以表格方式存储的 array(“name” => ‘zs’,‘pass’ => ‘pass’) 一行存放一个值
sql server/mssql运行服务,连接服务,然后进行操作 db2
access 及 sqlite (安卓使用)单文件存储,只有数据库没有表 (大数据量查询速度会变慢)
非关系型以键值对存储
mongodb 大型数据存储 (面向文档形式存储)
redis反应速度超级快,存储量相对少,做缓存服务器(中转,相对来说数据不重要)
{
‘uname’ : ‘zs’
‘age’ : 18
‘phone’ :{
‘phone1’ : 123456699
‘phone2’ : 486498887
}
}

MySQL数据库连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
1,Navicat Premium 12直接连接
2,cmd命令行进入到D:\phpstudy_pro\Extensions\MySQL8.0.12\bin>
使用命令 mysql -uroot -p 进入数据库
show databases;查看数据库
create database wordpress; 创建数据库wordpress
drop database wordpress; 丢弃(删除)数据库

yum或apt-get安装数据库,默认在var/lib/mysql路径下
账号密码在data/mysql里存放
真正的数据不放在文件夹里,而放在文件里,如 ibdata1

数据存储操作
mysqld进行存储操作
mysql客户端指使发送指令
而 access,sqlite
只有一个客户端,直接打开文件,进行读取操作

一般情况先使用 use mysql 再查看show tables;
设置主键(id)自增长 AUTO_INCREMENT
not null,就是设置不为空

插入sql语句时,可以用数字代替任何内容
DELETE DROM `mynews` . `tb_users` WHERE `username` ='1' OR `id` = `12`
OR代表符合username=1和id= 12的删除
DELETE DROM `mynews` . `tb_users` WHERE `username` ='1' AND `id` = `12`
AND在这里代表同时满足两个条件才能删除

UPDATE `mynews` . `tb_news` SET `author`=`admin`;
修改全部author
UPDATE `mynews` . `tb_news` SET `title`=`香港是中国的` WHERE `id` = 1;
修改id =1中的 `title` 值为 `香港是中国的`

UPDATE `mynews` . `tb_news` SET `title`= '香港是中国的', `title` = 'admin' WHERE `id` = 1;
这条命令执行后,title变为admin

WHERE 设置条件 WHERE `id`> 3
SELECT * FROM `mynews` . `tb_users` LIMIT 0,1000

ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
要改变表中列的数据类型,请使用下面的语法:
SQL Server / MS Access:
ALTER TABLE table_name
ALTER(ADD添加,DROP删除) COLUMN column_name datatype
//某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)

My SQL / Oracle:
ALTER TABLE table_name
MODIFY COLUMN(10G版本之后可省略此单词) column_name datatype

information_schema 数据库存放在内存中,不会有文件夹存在
SCHEMATA文件中存放当前所有数据库
TABLES里存放所有的表
COLUMUS 存放所有字段

导入
1,命令行导入数据库 source 加文件路径
2,mysql -uroot -p text < Destop/abc.sql
将abc.sql导入到text数据库
导出
mysqldump -uroot -p mysql > Destop/mysql.sql
将mysql数据库中的数据导出到mysql.sql文件


导出所有数据库,使用mysqldump –all-databases会导出所有库,
但是包含information_schema、mysql、test,这时需要排除这些库方法:

mysql -e "show databases;" -uroot -p| grep -Ev "
Database|information_schema|mysql|test" |
xargs mysqldump -uroot -p --databases > /data/mysql_bak.sql

SQL函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
select  ==>  echo   放到php相当于echo
version( ); @@version; 显示数据库版本号
database( ) 查看当前使用的数据库
user( ) 当前连接数据库的用户及IP

concat( )
concat_ws( ) 把查询结果连接起来
可以加~分隔 concat_ws(1,'~',2,'~',3 )
group_concat ( )
left( ) 从左开始切割 left('hello world! ' ,5 ); 结果为hello
right( ) 从右开始切割
substr( ) 从 * 开始取多少位的值
substr('hello world!',1,5) 从1开始往后取5位 (从1开始)
substr('hello world!',10,5) 从10开始往后取5位
mid( ) substring( ) 用法和substr( )一样
拿数据时,1,10 9,20 19,30
截取数据时尽量1,2个字符重复,还原数据时不会出错

select 0x7e 输出为~
concat查询的时候可以把'~' 替换成 0x7e

/* */ 注释
-- ; 杠杠空格,把后面的注释
distinct 进行去重 放在select后

union select 联合查询
select `username`,`passwd` from `text` . `users` union select 1,2;
select `username`,`passwd` from `text` . `users` union select user( ),version( ) ;
order by 排序 放在表名的后面
select `username`,`passwd` from `text` . `users` order by `username `;
根据用户名排序
like 模糊查询
like '%a' a结尾的 like '%a%' 包含a的 like 'a%' a开头的
limit 取数据
select `username`,`passwd` from `text` . `users` limit 0,2 ;
下标为0开始取两行

select username,passwd from text.users where username = 'admin'
union select 1,(select group_concat(schema_name) from information_schema.schemata);
查询text.users下username = 'admin' 对应的值,联合查询所有数据库

select username,passwd from text.users where username = 'admin'
union select 1,(select group_concat(schema_name)from information_schema.schemata)

select username,passwd from text.users where username = 'admin'
union select 1,(select group_concat(table_name)from information_schema.TABLES)


写文件
into dumpfile "filepath" //绝对路径 直接写二进制文件
into outpfile "filepath" //绝对路径 写文本文档的文件
select 123 into outfile/dumpfile '/var/www/html/eval/php';
读文件
load_file(' filepath ') //绝对路径
select load_file(' /etc/passwd ');
一般情况将文件转成select hex(load_file(' /etc/passwd ');
16进制,然后再解码进行查看
select 123 into outfile “/users/Desktop/a.txt”
桌面创建一个a.txt 内容为123
mysql的 --secure-file-priv 限制写文件

本地 使用select hex(load_file(' /etc/passwd ')处理二进制文件
服务器上,执行select unhex(0x十六进制内容) into dumpfile "/tmp/a.exe"

union 后只能结合 select 使用
不能把两个同级别的语句放到一起,select delete

页面输出 只显示第一行

通过行数判断是否删除
修改密码,删除用户,注册用户,删除新闻,添加新闻
insert into updat delete

mysql_fetch_array( )
关联数组和索引数组结合
mysql_fetch_assoc( ) 关联数组
mysql_fetch_row( ) 索引数组

mysql_affected_rows( ) 行数

连接数据库语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
php连接mysql数据库
mysql 驱动 php5.6之前都支持,但5.6在连接时会显示警告 @屏蔽错误
mysqli 驱动 5.0之后都有
pdo 驱动 5.1之后都有

现在学校,培训机构,80%都是mysql驱动

mysql_connect 连接数据库
如果失败显示 bool(false)

@$con = mysql_connect('127.0.0.1','root','root');

var_dump($con); // 输出为resource 资源类型
// mysql_error()
if (!$con){
die(mysql_error());
}

mysql_select_db( 'text' ) or die(mysql_error());
die(mysql_error()); 判断报错信息

mysql_query( 'set names "utf8"',$con); 设置编码
mysql_query 函数用于执行sql语句查询,设置编码等
mysql_error()作用是显示报错信息
连接成功 报错信息为空

@$con = mysql_connect('127.0.0.1','root','root') or die(mysql_error());
// 第二种写法,正确 输出or前面的代码 ,错误 输出后面的代码

以上所述结合最终语句:PHP中连接本地mysql数据库
<?php
@$con = mysql_connect('127.0.0.1','root','root');
mysql_select_db('mysql') or die(mysql_error());
mysql_query('set names "utf8"') or die(mysql_error());

?>