CRUD:Create(创建),Retrieve(读取),Update(更新),Delete(删除)。
Create
语法:
insert [into] talbe_name [(column [, column]...)] values (value_list) [,(value_list)]...
创建一张学生表
单行数据
多行数据
插入否则更新
INSERT ...ON DUPLICATE KEY UPDATE
column = value [,column = value]
也可以通过MySQL函数获取受到影响的数据行数
SELECT ROW_COUNT();
替换
主键或者唯一键没有冲突,则直接插入
主键或者唯一键如果冲突,则删除后重修插入
Retrieve
SELECT
[DISINCNT] {* | {column [,column]...}
[FORM table_name]
[WHERE...]
[ORDER BY column [ASC | DESC], ...]
LIMIT...
创建表结构
插入测试数据
全列查询
通常不建议使用*进行全列查询:
1.查询的列越多,意味着需要进行传输的数据量越大
2.可能会影响到索引的使用
指定列查询
查询字段位表达式
表达式不包含字段
表达式包含一个字段
表达式包含多个字段
为查询结果指定别名
语法:
select column [AS] alias_name [...] FROM table_name
as可以省略
结果去重
98分有俩
去重结果
where 条件
比较运算符:
运算符 | 说明 |
---|---|
>,>=,<,<= | 大于,大于等于,小于小于等于 |
= | 等于;NULL不安全,eg.NULL=NULL的结果是NULL |
<=> | 等于;NULL安全,eg.NULL<=>NULL的结果是TRUE(1) |
!=,<> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],ruguo1 a0<= value <= a1,返回TRUE(1) |
IN(option,…) | 如果是option中的任意一个,返回TRUE(1) |
IS NULL | 是NULL |
IS NOT NULL | 不是NULL |
LIKE | 模糊匹配。%表示任意多个(包括0个)任意字符;_表示任意一个字符 |
逻辑运算符: | |
运算符 | 说明 |
– | – |
AND | 多个条件必须都为TRUE(1),结果才是TRUE(1) |
OR | 任意一个条件为TRUE(1),结果为TRUE(1) |
NOT | 条件为TRUE(1),结果为FALSE(0) |
select可以设置比较条件,使用where子句。>, <, <=,>=不能直接用来比较NULL,但是可以比较int或者string
语文成绩小于七十分
在mysql中用一个等号判断相等
在mysql中‘ ’与null不一样:前者是存在,但是为空串;后者一般不参与计算
筛选null
筛选不为null
查询语文成绩在[70,85]的同学
使用and进行条件的连接
使用between……and……条件(这个区间是左闭右闭)
查询数学成绩是58或者59或者98或者99分的同学
使用or进行条件连接
使用IN条件
查询亚姓同学和亚某同学
%匹配任意多个(保罗0个)任意字符
_匹配严格的一个任意字符
查询语文成绩比英语成绩好的同学
并不是不需要查询的数据就不能在where后比较
查询语文成绩>80并且不姓亚的同学
AND与NOT的使用
查询亚某同学,否则要求总成绩>200并且语文成绩<数学成绩并且英语成绩>80
在select语句中,以from为界,是先执行后半段语句,找到对应的表,根据条件筛选。所以不能在where语句中使用前面定义的重命名,即下面语句不行
结果排序
语法:
--ASC 为升序(从小到大)
--DESC为降序(从大到小)
--默认为ASC
SELECT ... FROM table_name[WHERE...]
ORDER BY column[ASC|DESC],[...];
MySQL默认是升序
改为降序
按升序排序qq号
null随不参与比较,但一般会视其比任何值都小
查询各门成绩,数学降序,英语升序,语文升序
查询总分,按降序排列
order by 中可以使用表达式
order by子句中也可以使用列别名
相较于where子句中不能使用列别名:
排序基本是在select的最后才做
而where子句执行时,可能还没有进行列的重命名
查询亚姓或者卡姓同学的数学成绩,按降序排列
结合WHERE子句和ORDER BY子句
筛选分页结果
语法:
起始下标为0
从0开始筛选n条结果:
SELECT ... FROM table_name[WHERE...][ORDER BY...] LIMIT n;
从s开始筛选n条结果(1):
SELECT ... FROM table_name[WHERE...][ORDER BY...] LIMIT s,n;
从s开始筛选n条结果(2):
SELECT ... FROM table_name[WHERE...][ORDER BY...] LIMIT n OFFSET s;
ps:对未知表进行查询时,最好加一条LIMIT1,避免因为表中数据过大,查询全表数据导致数据库卡死
取总分前三
第1页
这样写也行
取总分第四到第六
第2页
取总分第七到第九
第3页,如果结果不足3个,不会有影响
Update
语法:
UPDATE table_name SET column
将德莱厄斯的数学成绩由78改为80
将马尔扎哈的数学成绩更改为60,语文成绩更改为70
将所有同学语文成绩更改为原来的2倍
Delete
删除数据
语法:
DELETE FROM table_name[WHERE ...] [ORDER BY ...] [LIMIT ...]
删除德莱厄斯同学的考试成绩
删除整张表数据
准备测试表
插入测试数据
删除整表数据
再插入一条数据,自增id在原值上增长
在查看表结构时,会有AUTO_INCREMENT = n项
截断表
语法:
TRUNCATE [TABLE] table_name
- 这个操作慎用
1.只能对整表操作,不能像DELETE一样针对部分数据操作
2.实际上MySQL不对数据操作,所以比DELETE更快
3.会重置AUTO_INCREMENT项
准备测试表并插入测试数据
截断整表数据
影响行数是0,所以实际上没有对数据真正操作
插入查询结果
语法:
INSERT INTO table_name[(column [, column...])] SELECT...
删除表中重复的数据(即重复的数据只能有一份)
创建原数据库并插入测试数据
创建一张列属性和duplicate_table一样的表,名为:duplicate_table_backup
为表duplicate_table_backup添加属性时,可以用like,不用挨个敲
把duplicate_table中的数据插入duplicate_table_backup中(也就是备份)
将去重的数据放入duplicate_table_backup中
重命名表
alter table duplicate_table rename to old_duplicate_table这样改也行
聚合函数
聚合统计一定是直接或者借鉴统计列方向的某些数据
函数 | 说明 |
---|---|
COUNT(DISTINCT)expr | 返回查询到的数据的 数量 |
SUM([DISTINCT]expr) | 返回查询到的数据的 总和,不是数字没有意义 |
AVG([DISTINCT]expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
MAX([DISTINCT]expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
MIN([DISTINCT]expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
统计班级多少同学
使用 * 做统计,不受NULL影响
使用表达式做统计
统计本场考试的数学成绩的分数个数
COUNT(math) 统计的是全部成绩
COUNT(DISTINCT math) 统计的是去重成绩数量
统计数学成绩总分
统计数学成绩小于30分的总分,没有结果返回NULL
统计平均分
返回英语最高分
返回大于70分以上的数学成绩中的最低分
group by子句的使用
在select中使用group by子句可以对指定列进行分组查询
select column1, column2,。。。from table group by column;
创建一张雇员信息表
EMP员工表、DEPT部门表、SALGRADE工资等级表
显示整个公司的平均工资和最高工资
显示每个部门的平均工资和最高工资
显示每个部门的每种岗位的平均工资和最低工资
group by后面跟的是分组的依据,只有分组的依据才有可能要显示出来
显示平均工资低于2000的部门和它的平均工资
聚合函数是先有数据再进行聚合统计
而where的操作是比较靠前的,但是聚合统计需要先有数据,然后再做聚合
聚合函数是先有数据再进行聚合统计
而where的操作是比较靠前的,但是聚合统计需要先有数据,然后再做聚合
在下图中,是先找到emp这个表(from emp),其次是做对应的分组(group by),再做聚合统计,最后才做筛选(having)
having:对聚合统计之后的结果进行筛选(having的执行顺序是特别靠后的)
下图,证明了where 和 having是可以共存的(1=1是必定成立的)
显示工资大于1000的员工对应的部门中 平均工资低于2000的部门的平均工资
下图的第二局sql语句中,首先执行的是(from)确定从哪个表中取数据
其次是where,where不参与任何聚合,它只是在原始的表中进行粗略的第一次的筛选
再根据分组条件进行分组(group by是通过分组这样的手段,为未来进行聚合统计提供基本的功能支持 ),分组之后再做聚合
最后再对聚合之后的数据进行筛选
SQL查询中各个关键字的执行先后顺序:from > on > join > where > group by > with > having > select > distinct > order by > limit