mysql> insert into students values (4,128,'xuyou','123123123') on duplicate key update id=6,sn=128,name='xuyou',qq='123123123';
那么冲突的也修改了;
但是这条操作就不行,因为更新语句主键不冲突但是唯一键冲突:
mysql> insert into students values (6,128,'xuyou','123123123') on duplicate key update id=4,sn=123,name='xuyou',qq='123123123'; //sn与id=1的sn数据冲突
正确:mysql> insert into students values (6,128,'xuyou','123123123') on duplicate key update id=4,sn=128,name='xuyou',qq='123123123'; 所以更新的唯一键要么不变要么不与其他冲突;
当然也可以这样:
老数据与新数据一样,虽然冲突了但是没变;也是可以的;
插入成功后有提示:
当然也可以用函数查找受影响的行数(是上一个语句执行后受影响的行数) row_count()
错误语句:没有受影响(-1)
查数据:没有行受影响(-1)
插入冲突数据:显示影响行数
替换
对于replace:主键或者唯一键没有冲突,则直接插入;主键或者唯一键如果冲突,则删除后再插入;
插入不冲突的:replace into students (sn,name,qq) values (129,'霸王','123');
插入冲突:replace into students (sn,name,qq) values (131,'霸王2','123'); 可以看到是先删除冲突的数据后再添加,由id的自增长可以看到;原来的10没了
Retrieve(读取)
建表插入
mysql> 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 '英语成绩'
-> );
mysql> 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);
select列
全列查询
通 常 情 况 下 不 建 议 使 用 * 进 行 全 列 查 询:
1 . 查 询 的 列 越 多 , 意 味 着 需 要 传 输 的 数 据 量 越 大 ;
2 . 可 能 会 影 响 到 索 引 的 使 用 。
未来我们的数据库服务是在远端的服务器上的; select * from exam_result;//默认整张表的信息
指定列查询
select id from exam_result;//指定id列
select id,math,english from exam_result;//指定多个列
查询字段为表达式
mysql> select 1+1; mysql> select 7*9; mysql> select id,math,english,10 from exam_result; mysql> select id,math+english,10 from exam_result;
为查询结果指定别名
mysql> select id,math+english as total from exam_result;
mysql> select id,math+english total from exam_result;//省略as也是可以的,一样结果 mysql> select name 姓名,math+english 总分 from exam_result;//多个别名,用逗号分隔
mysql> select 1+1 假发;
对哪一列起别名就在哪一列后面加别名;
结果去重
distinct:只能进行单列的去重挑选唯一值;
mysql> select distinct math from exam_result;//对那一列去重就在那一列前加distinct 错误多列去重:select distinct math,distinct english from exam_result;//不能多列去重
mysql> select english from exam_result where english<60;//使用比较运算符
语文成绩在 [80, 90] 分的同学及语文成绩
mysql> select name,chinese from exam_result where chinese>=80 and chinese<=90;
//使用逻辑运算符与比较运算符
mysql> select name,chinese from exam_result where chinese between 80 and 90;
使用between x and xx;本身就是闭区域 数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
mysql> select name,math from exam_result where math=58 or math=59 or math=98 or math=99;//使用比较和逻辑运算符 mysql> select name,math from exam_result where math in(58,59,98,99);//使用in
姓孙:mysql> select name from exam_result where name like '孙%'; 孙某:mysql> select name from exam_result where name like '孙_'; 语文成绩好于英语成绩的同学
mysql> select name,chinese,english from exam_result where chinese > english;
总分在 200 分以下的同学
错误:mysql> select name,chinese+math+english total from exam_result where total <200;
ERROR 1054 (42S22): Unknown column 'total' in 'where clause'/ /别名不能用在 WHERE 条件中
是先执行from exam_result然后执行where total <200语句最后执行select name,chinese+math+english total;但是在第二步就错了因为表中没有total列 正确:mysql> select name,chinese+math+english total from exam_result where chinese+math+english <200; 语文成绩 > 80 并且不姓孙的同学
mysql> select name,chinese total from exam_result where chinese>80 and name not like '孙%'; 孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
mysql> select name,chinese,math,english,chinese+math+english total from exam_result where name like '孙_' or (chinese+math+english>200 and chinese<math and english>80);加小括号更准确 看name中是否有NULL
mysql> select name from exam_result where name is null;
where可以理解为条件
结果排序
--ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...];
注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序 降序:mysql> select name,math from exam_result order by math desc;
升序:mysql> select name,math from exam_result order by math asc;
NULL 视为比任何值都小,升序出现在最上面 ;
NULL 视为比任何值都小,降序出现在最下面;
查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
(多字段排序,排序优先级随书写顺序)
mysql> select name,math,english,chinese from exam_result order by math desc,english,chinese;//不写的话默认asc
如果数学成绩每个人都相等,那么就按照英语成绩的升序来完成,以此类推;
就比如唐三藏和猪悟能的数学成绩一样,那么就按照英语的升序排序比较; 查询同学及总分,由高到低
ORDER BY 中可以使用表达式
mysql> select name,math+english+chinese total from exam_result order by math+english+chinese desc;
mysql> select name,math+english+chinese total from exam_result order by total desc;//可以使用别名
为什么这里可以使用呢?因为先from exam_result然后条件where再选出select name,math+english+chinese total最后比较order by 四步操作顺序进行,所以能用别名 查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
mysql> select name,math from exam_result where name like '孙%' or name like '曹%' order by math desc;
order by是有数据才能排序,先把数据按照条件筛选出来我才拍;
筛选分页结果
起始下标为 0;
从 0 开始,筛选 n 条结果:SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
从 s 开始,筛选n条结果 SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用 SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
n相当于步长;
从 0 开始,筛选 n 条结果:
mysql> select * from exam_result limit 5;//下标是0的位置是id=1,连续5个
mysql> select * from exam_result limit 3;//下标是0的位置是id=1,连续3个
从表开始(0)连续n行 从 s 开始,筛选n条结果:s指的是下标,这里id=1的下标是0
mysql> select * from exam_result limit 1,3;//下标是1的位置是id=2,连续3个
mysql> select * from exam_result limit 2,3;//下标是2的位置是id=3,连续3个
从 s 开始,筛选 n 条结果:
mysql> select * from exam_result limit 5 offset 0;