①Oracle Database:甲骨文公司
②SQL Server:微软公司
③DB2:IBM 公司
④PostgreSQL:开源
⑤MySQL:开源
⑥Access:微软公司 [古董]
红色为最常见服务器
数据库结构:
数据库结构
1.服务端:用于接收并处理其它程序发出的请求的程序(软件),或者是安装此类程序的设备(计算机)。
2.客户端:向服务器发出请求的程序(软件),或者是安装此类程序的设备(计算机)。
3.库:就是一堆表组成的数据集合
4.表(table):类似 Excel,由行和列组成的二维表。
5.字段:字段就是表格的表头(垂直方向)。
6.记录:表里面的的数据。【注意】关系数据库必须以行为单位进行数据读写。
字段+记录形成了<=>很多表<=>库<=>服务端<=>通过服务端访问
SQL 语句:用关键字、表名和列名等组合而成的一条语句。
3 种 SQL 语句种类:
(1)ddl(数据定义语言):创建、删除或修改数据库以及数据库中的表等对象。
①create:创建数据库和表等对象
②drop:删除数据库和表等对象
③alter:修改数据库和表等对象
(2)dml(数据操作语言):查询或修改表中的记录。
①select:查询表中的数据
②insert:向表中插入数据
③update:修改表中的数据
④delete:删除表中的数据
(3)DCL(数据控制语言):确认或取消对数据库中的数据变更的执行操作,以及对用户的操作数据库中的对象权限进行设定。
数据库操作:
create database kali;
show databases;
drop database kali;
use kali;
建表>定义类型>定义属性
ps:要先定义类型才能加上属性
create table shuju(xm int,xb varchar(99));
ps:字符串属性要记得指定长度
create table 表名 (字段 类型 属性,字段 类型 属性); [新建表]
create table shuju3(xm int not null,xb varchar(99) not null);
show tables;
drop table shuju;
删除多张表
drop table shuju2,shuju3;
desc shuju;
alter table shuju drop xb;
alter table shuju add admin varchar(99) not null;
alter table shuju change admin admins int(99) not null;
例子:create table aa(xh int primary key auto_increment not null,xm varchar(99));
create table表名(字段名+类型+属性,字段名+类型(长度));
字段其实是有一些类型属性的。
数据类型: varchar(255)《字符串(255)是长度》 int(1)《整数》 char float《浮点数》
主键 PRIMARY KEY [不能为空,而且是不能重复的值]
设置编码:CHARSET=utf8
自增长 AUTO_INCREMENT
NOT NULL 数据不能为空
基本SQL语法(2)
insert into shuju values ('admin','admin');
ps:没有字段则需要添加新的字段才能插入数据,整数类型只会输出数字,不会输出字符串,无法输出字符串先改变字段类型
insert into shuju (xs,xm) values ('admin','password');
数据与字段是相对应的,一对一,二对二
insert into user (username,password) values (’admin’, ’admin’);
红色是字段名,绿色是对应的数据,不定义就是默认对认
查询数据 :
select * from 表名;(意思是从中选择)
select*from shuju;
select 字段名 查询什么东西 ,from 表名,从哪个表查询
select xm,xs from shuju;
where 表达式,条件 要通过什么来查询
update shuju set xm='zhanghao';
update 表名 set 字段名=字段里的数据 where 指定的字段名=指定的字段数据;
update shuju set xm='nihao' where xs=245;
and:与
update shuju set xm='h' where xs=245 and xm='hao';
or:或
update shuju set xm='kjkj' where xs=245 or xm='qq';
delete from shuju where xm='ppp';
mysql字符串是可以接受16进制的insert into 表名 values (0x十六进制之后的数据);
ps:0x就是告诉数据库这个不是字符串是数据,十六进制只能代表数据
极端情况下,不让用引号可以转换为十六进制。
insert into shuju (xm) values (0x7368617a69);
insert into 表名 (字段名) values (0x字符转十六进制);
16进制到文本字符串的转换,16进制-BeJSON.com
http://www.bejson.com/convert/ox2str/
select database(); 查询当前库名
select database();
SQL 语句书写规范:
①以英文分号(;)结尾;
②SQL语句本身大小写不敏感,不区分关键字的大小写;【注意】插入到表中的数据是区分大小写的,如“HI”、“Hi”和“hi”都不同。
③该系列随笔将采用“关键字大写,表名和列名的首字母大写”的格式。
④单词使用英文空格或换行符隔开
常数的书写方式:
字符串、日期:用单引号括起来('),如'Hello World','2018-12-4'。
数字:直接书写,不用加单引号,如:5。
选库>>建表>>字段+类型+属性>插数据
表字段排序
升序
知道字段的情况下,select*from 表 order by 字段 [ASC(默认)/DESC];
select*from shuju order by xm;
假如不知道字段名可以用1,2,1是排序第一个字段,2是排序第二个字段。
select*from shuju order by 1;
select*from shuju order by 2;
倒序
select*from 表 order by 字段 desc
升序(从小到大)ASC,降序(从大到小) desc
select*from shuju order by xm desc;
select*from shuju order by xm asc;
查询分页
select*from 表 limit n,m;
n表示从第几行开始,m表示取几条
select*from shuju limit 1,3;
模糊查询
select *from 表 where 字段名 like '%设想的数据%';
select*from shuju where xs like '%5%';
like就是像的意思,%是通配符(意思是百分号是任意数量任意字符)
select *from 表 where 字段名 like '%a'(把字段里的以a结尾的全部输出)
select*from shuju where xm like '%j';
select *from 表 where 字段名 like 'a%'(把字段里的以a开头的全部输出)
select*from shuju where xm like 'k%';
select *from 表 where 字段名 like '%a%'(有a的全部输出)
select*from shuju where xm like '%k%';
运算符号: + - * / % 加减乘除取余
select a+ - * / %a
逻辑运算:
NOT (!!)变假为真,变真为假,取反
select*from shuju where not xs=245;
AND (&&)满足两个
select*from shuju where xs=245 && xm='kjkj';
OR (||)满足两个之一
select*from shuju where xs=245 or xm='kjkj';
and就是满足and前后的两个条件返回真
or就是两个条件满足其中一个即可为真
!就是 否定你前面的结果,若条件结果为false 加!后 最终结果为true
0是假,1是真
sleep(想延时几秒就写几秒);是延时的意思
mysql> select*from shuju where xm='kjkj' and sleep(2);
Empty set (4.00 sec)
ps:因为sleep() 没有返回值 就默认是0
mysql> select*from shuju where xm='kjkj' or sleep(2);
+-----+------+
| xs | xm |
+-----+------+
| 245 | kjkj |
| 245 | kjkj |
+-----+------+
2 rows in set (2.00 sec)
a and b ,a和b两个条件都为真 才会返回真
sleep()函数是没有返回值的 就默认是0
0是假
所以总体就返回假
所以就会查询失败
联合查询(union条件:字段数必须相同)
表的内容无重复:
SELECT * FROM 表1 UNION SELECT * FROM 表2;
select*from shuju union select*from shuju2;
表的内容有重复:
SELECT * FROM 表1 UNION ALL SELECT * FROM 表2;
select*from shuju union all select*from shuju2;
官方定义:子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块。当一个查询是另一个查询的条件时,称之为子查询。
老师理解:子查询就如同 1+2*2=5 (1+2)*2=6
子查询就是优先执行,然后执行得到的结果作为某个查询的条件
select*from shuju where xm=(select 'kjkj');
select *from user where username = (select username from admin where id=1);
admin表当id=1的用户名是否在user表也存在
select*from user where username in (select username from admin)
检查admin表和user表是否有用户名相等
子查询就行优先执行括号里的数据。
GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果
多行输出字段里的数据:
select xm from shuju;
一行输出字段里的全部数据:
select group_concat(xm) from shuju;
DATABASE() 返回当前数据库名
select database();
USER()或SYSTEM_USER() 返回当前登陆用户名
select user();
select system_user();
VERSION() 返回MySQL服务器的版本
select version();
SLEEP(n) 休眠n秒
select sleep(想休眠几秒就写几秒);
PHP与数据库交互
<?php
$conn = mysqli_connect('localhost','root','root','jjj');
链接地址,账号,密码,库名
mysqli_select_db($conn,'jjj');
链接,库名
$sql='insert into kali value(88,\'nf\')';
mysqli_query($conn,$sql);
执行任意SQL语句
?>