朋友们、伙计们,我们又见面了,本期来给大家带来数据库表的基本查询知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!
C 语 言 专 栏:C语言:从入门到精通
数据结构专栏:数据结构
个 人 主 页 :stackY、
C + + 专 栏 :C++
Linux 专 栏 :Linux
目录
1. 插入
语法:
INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ...
示例:
创建表
create table students( id int unsigned primary key auto_increment, sn int not null unique comment '学号', name varchar(20) not null );
1.1 单行数据 + 全列插入
一次只插入一行,且插入的列数据包含全列字段;
-- values前面没有指定字段列就表示全列插入,所以values后面需要将全部列属性按照顺序填充 insert into students values(100,1000,'唐三藏'); insert into students values(100,1000,'唐三藏'); -- 查看插入的数据 select * from students;
1.2 单行数据 + 指定列插入
一次只插入一行,且向指定的列字段插入数据;
--values前面指定列字段,则表示向指定的列字段插入数据; --values后面填充的数据必须和前面指定的列字段数量、顺序一致 insert into students(sn,name) values(1002,'猪悟能');
1.3 多行数据 + 指定列插入
一次只插入多行,且向指定的列字段插入数据;
-- 插入多行数据用()和,分割即可 --insert into students values(103,2000,'曹孟德'),(104,2001,'孙仲谋'); insert into students(id,sn,name) values(103,2000,'曹孟德'),(104,2001,'孙仲谋'); -- 也表示全列插入
1.4 插入否则更新
我们有时候插入时会遇到主键冲突或者唯一键冲突的情况,但是我们想实现:如果不存在就插入,如果存在就修改。
选择性的同步更新语法:
INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...
示例:
-- update后面跟上要更新的新数据 insert into students values(100,1000,'唐长老') on duplicate key update name='唐长老';
在更新完数据之后会有2 rows affected的字段,那这是什么意思呢?
0 row affected --表中有冲突数据,但冲突数据的值和 update 的值相等 1 row affected --表中没有冲突数据,数据被插入 2 row affected --表中有冲突数据,并且数据已经被更新
所以我们在数据冲突时更新数据会显示 2 rows affected;
-- 通过 MySQL 函数获取受到影响的数据行数 mysql> select row_count(); +-------------+ | ROW_COUNT() | +-------------+ | 2 | +-------------+ 1 row in set (0.00 sec)
1.5 替换插入
替换插入的细节:
- 主键 或者 唯一键 没有冲突,则直接插入;
- 主键 或者 唯一键 如果冲突,则删除后再插入。
示例演示:
-- 替换操作就是将插入操作的insert换为replace replace into students(sn,name) values(2000,'曹阿瞒'); -- 1 row affected: 表中没有冲突数据,数据被插入 -- 2 row affected: 表中有冲突数据,删除后重新插入
2. 查询
2.1 select查询
语法:
SELECT [DISTINCT] {* | {column [, column] ...} [FROM table_name] [WHERE ...] [ORDER BY column [ASC | DESC], ...] LIMIT ...
示例:
-- 创建表结构 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);
2.1.1 全列查询
查询整个表的全部列信息及数据;
select * from exam_result; -- * from后面跟上要查询的表名 -- * 就表示要全列查询
通常情况下不建议使用 * 进行全列查询
- 查询的列越多,意味着需要传输的数据量越大;
- 可能会影响到索引的使用。
2.1.2 指定列查询
指定的查询若干列;
-- 指定查询的列信息不要按照定义表的顺序来 -- select 后面可以跟上需要查询的列信息,用,分割 select name,english from exam_result;
2.1.3 表达式查询
① 表达式不包含字段
-- 在要查指定列信息后面跟上表达式即可 select name,english,10 from exam_result;
② 表达式包含一个字段
-- 可以用表达式来计算一些