数据的操作也叫作crud:
C:create
R:read
U:update
D:delete
一、蠕虫复制
就是在已有的数据的基础之上,将原来的数据进行复制,插入到相对应的表中
语法规则:
insert into 表名 select *|字段列表from 表名
当一个表中的数据复制到另一个表中的时候,需要注意数据的来源要与被插入的表的字段数量和类型要保持一致!
总结蠕虫复制的优点:
1, 可以以最快的速度复制另外一张表的数据
2, 在短期内产生大量的数据,以测试服务器的压力
二、主键重复
如果在进行数据更新的时候,某条记录的主键已经存在,但是又需要将最新的数据更新到该记录中:
策略一:
insert into 表名[字段列表] values(值列表) on duplicate key update 字段1=值1,字段2=值2……
策略二:如果主键重复,直接删除原纪录再插入
replace into 表名[字段列表] values(值列表);
在插入之前进行一次判断,判断有没有主键重复,如果没有,跟普通的插入语句没有区别,如果有主键冲突,先删除以前的记录,再插入新记录!
三、修改数据
update 表名 set 字段1=值1,字段2=值2……[where 条件] [order by 字段名 asc | desc] [limit 数据量]
四、删除数据
delete from 表名 [where 条件] [order by 字段名 asc|desc] [limit 数据量]
还有一个类似删除功能的语法
truncate table 表名 或者:truncate 表名
相当于做了两件事:
1、 先把原表drop掉
2、 再按以前的原表的结构重新创建一次
五、查询数据
完整语法如下:
select 【select 选项】 *|字段列表 【as 字段别名】 from 数据源 【where 子句】 【group by 子句】 【having 子句】 【order by 子句】 【limit 子句】
以上的语法一般只是单表查询,另外还有多表查询,多表查询又有联合查询、子查询、连接查询(左连接,右连接,内连接,外连接,自然连接)
注意:
1) from后面的子句往往称之为:五子句,也叫五子查询
2) 五子查询都可以没有,但是,如果要有,就必须按顺序写
1、select 选项
select选项:all(默认值,保留所有查询结果)| distinct(去掉重复的)
2、别名
字段|表达式|表|子查询 [as] 别名
为什么要给字段起别名?
如果多表查询的时候,不同的表内可能出现相同的字段名,如果使用同名字段,PHP在提取的时候就会造成数据的丢失
为什么给表起别名?
在真实的项目中,表名往往都比较长,懒得写
为什么要给子查询起别名?
当数据源是一个子查询的时候,必须给该子查询语句起一个别名,如:select * from (select * from score)as s1;
虚拟表:
理论上认为一条sql语句必须从一个数据源中去获取数据。所以,为了保证sql语句语法的结构完整性,在Mysql中执行select语句的时候在适当的时候会自动创建一个虚拟表。这个虚拟表就是当数据源来使用。 虚拟表的名称:dual
五子查询:
1、where 子句
语法:where 表达式
功能:通过限定的表达式的条件对数据进行过滤,得到我们想要的结果
流程:逐一取出每一条记录,先通过当前记录来计算where后面表达式的值,如果计算的结果为真(非0即可),就返回来记录,如果计算的结构为假(0),则不返回记
录!相当于对所有的记录做了一次遍历!
where id = 2;
between A and B 相当于[A,B]
not between and
in | not in (集合):查找集合里面的值与字段的值匹配的记录
空值查询:
select *|字段列表 from 表名 where 字段名 is [not] null
模糊查询:
select *|字段列表from 表名 where 字段名 [not] like ‘通配符字符串’;
1、含有“全”的字符:%全%
2、查找student表中stu_name含有_或含有%的学生信息:%\%%
由于%和_都具有特殊的含义,所以如果确实想查询某个字段中含有%或_的记录,需要对它们进行转义!也就是查找 \_ 和 \%
2、group by 子句
也叫作分组统计查询语句
group by 字段1[,字段2]……
从形式上看,就是通过表内的某个或某些字段进行分组:
单纯的分组查询毫无意义,因为只会从每一组内提取第一条记录,而分组统计查询的主要作用不是分组,而是统计,针对每一个分组进行相关的统计。
select gender , max(score) as max_score from php_student group by gender;
统计函数:
sum()
max()
min()
avg()
count(*)
如果没有group by 子句,则默认的就是整个表中的数据当成一组。
多字段分组统计
group by 字段1[,字段2]……
作用是:先根据字段1进行分组,然后再根据字段2进行分组
回溯统计:
回溯统计就是向上统计,分组统计的结果再做一次统计!在group by语句的后面再加上with rollup即可
3、having 子句
where子句是把磁盘上的数据筛选到内存中,而having是把内存中的数据再次进行筛选
因此,where子句的后面不能使用统计函数,而having子句可以。因为只有在内存中的数据才能进行统计运算
4、order by 子句
order by 字段1 [asc | desc]
默认的是asc,升序,从小到大;desc从大到小,降序。
多字段排序:
order by score asc , age desc
5、limit 子句
limit子句的作用就是限制查询记录的条数
limit offset , length // offset是偏移量,默认为0,length是记录的数量
limit 3 , 5表示显示记录的第4条到第8条,类似于下标
分页原理:
假如在项目中,需要使用分页的效果,就应该使用limit子句
如果用$pageNum代表第多少页,用$rowsPerPage代表每页显示的长度
limit ($pageNum - 1)*$rowsPerPage, $rowsPerPage // 等差数列