赞
踩
在前面我们学习了针对库的操作以及针对表结构的操作,下面我们来学习针对表中数据的操作。对数据操作的类型无非就是C(创建)R(读取)U(修改)D(删除)
,针对以上四种类型的操作,结合案例展开讨论
语法:
insert
表
插入列
values
数据
现创建一张学生表,表结构如下:
CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
sn INT NOT NULL UNIQUE COMMENT '学号',
name VARCHAR(20) NOT NULL,
qq VARCHAR(20)
);
如果我们再插入数据时遇到了主键或者唯一键冲突,我们选择性的进行同步操作,例如:
使用ON DUPLICATE KEY UPDATE
可以在发生冲突之后执行update语句。
主键或者唯一键发生冲突,删除再插入
没有发生冲突就直接插入
读取数据其实就是查询数据,查询数据使用select语句
语法:
select {cloumn1,cloumn2..} from {table1,table2...} [where...] [order by...] [goup by...] [limit...]
创建一个exam_result
表记录学生的考试成绩:
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
chinese float DEFAULT 0.0 COMMENT '语文成绩',
math float DEFAULT 0.0 COMMENT '数学成绩',
english float DEFAULT 0.0 COMMENT '英语成绩'
);
给出一组数据用于测试:
INSERT INTO exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);//多行全列插入
假设要查看所有同学的数学成绩以及姓名
假设要查询所有同学的总成绩
使用as
可以给一个表达式或者是一张表或者一个字段起别名,例如还是查询所有同学的总成绩:
其中as也可以省略不写
可以在查询字段前添加distinct
表示对该字段去重,例如查询所有同学的数学成绩:
去重前:
去重后
这样就没有重复的数学成绩了。
使用where可以保证查询数据的准确性。
下面给出常见的比较运算符
逻辑运算符
下面结合具体案例来使用where
语法:
select
聚合函数,
列(要求出现在group by的后面)
from
表
where
筛选条件
order by
cloumn asc;//升序
cloumn desc;//降序
语法:
-- 起始下标为 0
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
比如查询所有同学的总成绩,显示分数最高的三个人
也可以使用offset:
语法:
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
delete可以删除表中的部分数据,也可以删除全部数据。delete并不会影响表的结构。
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
案例1:删除孙悟空同学的考试成绩
查看原数据:
删除后:
案例2:删除整张表的数据
delete table table_name
表示删除table_name表的数据,这里不做演示。
截断truncate
和delete都是对表中数据进行删除,truncate只能用来删除表中的所有数据。
语法:
TRUNCATE TABLE table_name;
truncate
.如果希望删除操作能回滚即恢复数据,或者只是删除部分数据,那就用delete
语法:
INSERT INTO table_name [(column [, column ...])] SELECT ...
mysql支持将select查询到的结果作为数据对某一张表进行多行插入,比如当我们想复制一个表中的数据到另一个表里。
现给出原始表数据:
-- 创建原数据表
CREATE TABLE duplicate_table (id int, name varchar(20));
Query OK, 0 rows affected (0.01 sec)
-- 插入测试数据
INSERT INTO duplicate_table VALUES
(100, 'aaa'),
(100, 'aaa'),
(200, 'bbb'),
(200, 'bbb'),
(200, 'bbb'),
(300, 'ccc');
duplicate_table
表中的重复数据duplicate_table
保持一致,然后将duplicate_table
去重查询到的数据插入到新表中,再将新表重命名为duplicate_table
like
,例如:将duplicate_table
去重查询到的数据插入到新表中:
重命名表名
MySQL中的聚合函数主要用于对一组数据进行计算,返回单个值。常见的聚合函数包括SUM(求和)、AVG(平均值)、MAX(最大值)、MIN(最小值)、COUNT(计数)等。
比如以下语句:
执行的顺序为:
from
exam_resultwhere
math>60select
name,mathorder by
math asc在select中使用group by
子句可以对指定列进行分组查询
语法:
select
聚合函数,
列(要求出现在group by的后面)
from
表
where
筛选条件
group by
分组的列表
having
条件查询
order by
排序
limit
分页
其中having
表示对分组结果进行条件筛选,执行顺序在group by
之后。
下面有一张员工表EMP,字段包括员工工资sal、部门号deptno,岗位job。具体内容如下:
select deptno,max(sal),avg(sal) from emp group by deptno;
select deptno,max(sal),avg(sal) from emp goup by deptno,joib;
select avg(sal) avg_sal from emp group by deptno having avg(sal)<2000;
from > on> join > where > group by> with > having> select > distinct > order by > limit
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。