思考题
- 手机号码一般使用什么数据类型存储? char(11)
- QQ号 varchar(12)
- 性别一般使用什么数据类型存储? tinyint(1) 1-男,2-女 char(1) 男,enum 单选女
- 年龄信息一般使用什么数据类型存储? Unsigned tinyint(3)
- 照片信息一般使用什么数据类型存储? varchar(60) 直接存唯一的图片名
- 薪水一般使用什么数据类型存储? decimal(10,2) php要判断小数位不能有第三位
- 学员姓名允许为空吗? 不能(使用情况)
- 家庭地址允许为空吗? 个人中心设置可以为空,购物不能为空
- 电子邮件信息允许为空吗? 可个人中心可以,用邮箱注册账号
- 考试成绩允许为空吗? 不可以 给一个默认值0
- 在主键列输入的数值,允许为空吗? 不能
- 一个表可以有多个主键吗? 不能
- 在一个学校数据库中,如果一个学校内允许重名的学员,但是一个班级内不允许学员重名,可以组合班级和姓名两个字段一起来作为主键吗? primary key(id,name)
- 表中没有合适的列作为主键怎么办? 给他添加一个编号id
- 一个表可以没有主键吗? 可以,一般使用没有主键的表都是中间表(存储两个表之间的关系)
- 如果标识列A的初始值为1,增量为1,则输入三行数据以后,再删除两行,下次再输入数据行的时候,标识值从多少开始? 4
运算符
算术运算符
+ 加
– 减
*乘
/ 除 如果除数为0怎么办? 得出的结果是null
% 取模(求余) 如果除数为0怎么办? 得出的结果是null
算术运算符一般是应用到,结果字段运算上
Select (字段运算)字段表达式 [from ] [where]
关系运算符
< 小于
>大于
<= 小于等于
>=大于等于
= 等于(比较)
<> != 不等于
关系运算符主要用在哪个类型上 数值类型,也可以用在字符串类型
Select * from 表名 id>5
Select * from 表名 name=’李明’;
Select * from 表名 name!=’李明’;
逻辑运算符
and 条件同时满足为真
or 条件有一个满足为真
not 取反
高级查询
高级查询的格式
Select [all/distinct] 字段/字段表达式
[from 子句]
[where子句]
[group by 子句]
[having子句]
[order by子句]
[limit 子句]
子句的顺序固定
All
含义就是把查询出来的结果全部展示出来
distinct去除重复数据
as别名
使用方式 as 新名字,as关键字可以省略
Where条件
In
在某个范围内
找出type 是打野,或输出的英雄信息
一般会:select * from hero where type=’打野’ or type=’输出’;查询
其实还可以使用in来查询
字段名 In (值1,值2….);含义就是 该字段的值是小括号里边的任意一个
比较:or 和in
In比or使用更方便,如果需要再加满足的条件,只需要在小括号里边加一个值就行了而or需要使用两次or运算这样执行效率慢,语法繁琐
Is null /is not null
Is是判断,一般只和null连用,判断字段的值是否是null,如果是null就返回1,如果不是就返回0;
between…and
在什么范围之内,这个范围主要指数字
大于3小于8
Between 3 and 8; 包括3和8的
Between…and…表示不了不连续的范围,比如 在这些数字里边的 1,6,8,9
like模糊查询
模糊查询就是知道要查询信息的一部分内容,不是精确的内容的查询
英雄名字我只知道第一个是‘牛’ 那么我怎么查到这些英雄的信息呢?
通配符
就是占位的符号,有一定含义
通配符 |
描述 |
_ (下划线) |
表示任意一个字符 |
% |
表示任意多个或一个或0个字符 |
1、’t_m’下列选项符合的条件的是()
A:tm B:tom C:toom D:tam E:tmo
2、’张%’ 下列选项符合的条件的是()
A:张三 B:张三丰 C:张牙舞爪 D:张 E:小张
3、’%诺基亚%’ 下列选项符合的条件的是()
A:诺基亚2100 B :2100诺基亚 C:我的诺基亚质量很好 D:诺基亚
4、SELECT * FROM 数据表 WHERE 编号 LIKE ’00_A5%C’ ()
A、0890AC B、007_A51C C、00A54C D、00AA5C
group by分组
什么是group by分组查询,作用
分组查询是按照指定的字段来分组,分组的目的是为了统计
聚合函数
聚合函数就在分组的基础上求某一个字段的相关信息,返回的是一个单独的数据,也就是 ‘一行一列’
Sum求和
Avg平均值
Max最大值
Min 最小值
Count 数量
having条件
在原有查询出来的结果上过滤
比较having和where的区别
相似的地方都是条件—–过滤数据
不同的地方
- Where在分组之前执行,having在分组之后执行说白了,having就是在where过滤之后的结果之上,再次过滤数据
- Having过滤只能使用查询结果中有的字段,where过滤数据能使用表中的任何字段
回溯查询 with rollup
就是在分组的结果基础之上,再次进行相同的分组查询
扩展:我想在一次结果中查看到不同英雄的平均伤害,和所有英雄的平均伤害
order by排序
排序,按照某一字段从大到小排,从小到大排
从大到小排序 desc order by 字段名 desc 按照某个字段从大到小排序
从小到大排序 asc order by 字段名 asc按照某个字段从小到大排序
如果没有设置排序,会按照id从小到大排序展示出来
Id从大到小排序
limit限定
限定查询出来的结果显示多少条,从第几条开始显示显示多少条
Limit 数字 –从第一条开始显示多少条数据
Limit 数字 ,数字 —从第几条开始显示,显示多少条 不包括开始的那一条
实现:显示前四条数据
实现:从第5条开始,显示3条
高级查询案例
测试数据
- 找出伤害是前三的英雄信息
select name from hero order by hurt desc limit 3;
- 找出英雄名字中有’德’字的英雄
select name from hero where name like ‘%德%’;
- 找出每种技能的平均伤害
select skill,avg(hurt) from hero group by skill;
- 找出每种技能的平均伤害 和所有技能的平均伤害
select skill,avg(hurt) from hero group by skill with rollup;
- 找出平均技能伤害大于60的技能
select skill,avg(hurt) as 平均伤害 from hero group by skill having 平均伤害>60;
- 找出伤害最高的英雄信息(不要求掌握)
select name,hurt from hero where hurt= (select max(hurt) from hero);
高级新增
之前学的新增:insert [into] 表名 [(字段列表)] values (值列表);
要求,字段列表和值列表一致,每一次执行插入一条数据的
多值插入
语法: insert [into] 表名 [(字段列表)]
values (值列表), (值列表), (值列表)……;
例如:
insert into hero values
(null,’a’,1,2,50,60),
(null,’b’,1,2,50,60),
(null,’c’,1,2,50,60);
set方式插入
很少用,只需要知道就可以了
语法: insert 表名 set 字段1=值1,字段2=值2…;每次只插入一条数据
例如:
insert into hero set name=’d’,type=1,skill=2,hurt=23,waittime=6;
蠕虫复制
什么是蠕虫复制,这个类似细胞分裂
1 变 2
2 变 4
4 变 8
每次进行一个蠕虫复制的话,数据表的数据就是成倍的增加
当前表有10条数据,蠕虫复制了10次—-现在有多少条数据?1024*10
再蠕虫复制10次 1024*1024*10—-千万级数据
所以蠕虫复制需要防止;
例如:
语法 insert [into] 表名 values select 语句
Select 语句的查询结果字段和插入的字段列表一致(数量,类型);
扩展:怎么防止蠕虫复制
加入unique key
replace插入
替换插入,如果插入的数据中在表中有(一个字段上—唯一建),那么会先把表中已有的数据删除,然后再插入
Replace[ into] 表名 [(字段列表)] values (值列表);
高级修改
Update 表名 set 字段1=值1 ,字段2=值2… where 修改条件;
排序限定条数修改
语法:update 表名 set 字段1=值1 ,字段2=值2… [where 条件] [order by 子句] [limit子句]
在修改的过程中可以限定修改的条数,和排序
我要修改英雄前三的伤害值 ,让伤害值加倍;
这里用到了排序 英雄伤害从高到低排序 order by desc
限定 修改前三条信息,让信息值加倍 limit 3
Update hero set hurt=hurt*2 [hurt+hurt] order by hurt desc limit3;
修改前,伤害前三的英雄信息
扩展:
回想limit 3;
Limit 4,2; 修改英雄伤害排名是5,6的伤害,让其加倍—update修改没有这样的用法
高级删除
delete from 表名 [where 条件] [order by 子句] [limit 子句]
排序限定条数删除
英雄伤害前2两名,英雄删除
Delete from hero order by hurt desc limit 2
删除前数据
删除伤害排名前两位的英雄,如果成功,德玛和诺克消失
扩展:能不能指定从第几条开始删除?
也就是delete语句中支不支持 limit 数字,数字;的用法
测试;删除伤害排名在第3,4的两个英雄
Sql: delete from hero order by hurt desc limit 2,2;
Truncate删除
清空表,除了清空表中的数据,还可以把表的自动增长归成1
Truncate请空表
清空完成的效果
联合查询
含义
什么是联合查询
联合查询是把两个查询结果放在一起来显示
联合查询就是把这个两个展示出来的结果放在一块展示
既然是纵向的连接:首先是字段的个数必须一致
基本形式
语法:select 语句 union [all/distinct] select 语句
注意点
- 第一纵向连接,两个结果集字段数量必须一致
- 第二如果需要对连接过后的结果集 进行排序那么必须把两个select语句用小括号包括起来
这个order by是对联合过后的结果进行排序
- 第三如果我们前边的select 语句查询的结果字段名,有别名,那么排序的时候必须用别名
错误原因:因为联合查询出来的结果集中没有id这个字段名,原来的id改成了编号,如果想用id进行排序,难么只能使用 ‘编号’这个名称;
- 第四联合查询结果的字段名,默认是第一个select语句查询出来的字段名