MySQL 基本查询(一)

文章目录

CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)

Create(insert)

指定列的单行插入和全列插入

sql 复制代码
create table students(
id int unsigned primary key auto_increment,
sn int unsigned unique key,
name varchar(30) not null,
qq varchar(30) unique key
);
// 指定列插入
insert into students (sn,name,qq) values(1,'张三','123456789');
// 全列插入
insert into students values(12,2,'李四','12345678');
// into可以省略
insert students values(13,3,'王五','123456'); 

多行全列插入和指定列的多行插入

sql 复制代码
// 全列插入
insert into students values(15,5,'曹操','12345'),
(16,6,'诸葛亮','123');
// 指定列插入
insert into students (sn,name,qq) values(6,'项羽','125'),(7,'张飞','126');

如果主键存在,要插入替换存在的值

  1. 由于 主键 或者 唯一键 对应的值已经存在而导致插入失败
sql 复制代码
// 发生主键冲突,把主键后面的属性都修改了
// 要更新的值不能和其他的主键和唯一键冲突
insert into students values(13,132,'xuyou','111111') on duplicate key update sn=132,name='xuyou',qq='111111';


  1. 1行被影响,等价于数据直接插入,2行被影响,表中有冲突数据并且要被update更新,0行被影响,表中的老的数据和update要更新的值是一样的



  1. 通过 MySQL 函数获取受到影响的数据行数
sql 复制代码
select row_count();

-1表示没有行受到影响

1行受到影响

replace

  1. 主键 或者 唯一键 没有冲突,则直接插入
  2. 主键 或者 唯一键 如果冲突,则删除后再插入
sql 复制代码
replace into students (name,name,qq) values(222,'张三','123');
  1. 1 row affected:表中没有冲突数据,数据被插入
  2. 2 row affected:表中有冲突数据,删除后重新插入

基本select

全列查询

  1. *,通配符,可以进行全列查询,把所有数据都遍历一遍,公司中不建议使用 * ,因为数据库的数据太多了,全遍历还是不方便查看
sql 复制代码
select * from 表名

指定列查询

  1. 指定列的顺序不需要按定义表的顺序来
sql 复制代码
select name,math,id from 表名
  1. select 可以帮你计算出表达式放到这一列中



4. 可以重命名表达式的名字


5. 也可以不带as重命名


sql 复制代码
// 多加一列,数学+10分的列
select name 姓名,math 数学,math+10 from exam_result;
  1. 对查询结果进行去重

where子句

  1. where可以筛选行,只要包含了=的是不可以用来比较NULL的,是不安全的
  2. 比较运算符
  1. 逻辑运算符
sql 复制代码
select name,english from exam_result where english < 60;

where子句案例

语文成绩在 [80, 90] 分的同学及语文成绩
sql 复制代码
select chinese,name from exam_result where chinese between 80 and 90;
select chinese,name from exam_result where chinese >= 80 and chinese <= 90;
数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
  1. in,如果是 option 中的任意一个,返回 TRUE(1)
sql 复制代码
select name,math from exam_result where math = 58 or math = 59 or math = 98 or math = 99;
// in表示只要在括号中存在的就满足条件
select name,math from exam_result where math in(58,59,98,99);
姓孙的同学 及 孙某同学
  1. like,模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符
sql 复制代码
// 把姓孙的都匹配出来
select name from exam_result where name like '孙%';
// 把孙某匹配出来
select name from exam_result where name like '孙_';
语文成绩好于英语成绩的同学
sql 复制代码
select name,chinese,english from exam_result where chinese > english;
总分在 200 分以下的同学
sql 复制代码
select name,chinese+english+math as total from exam_result where chinese+english+math < 200;
  1. 筛选的条件是先从哪个表中找,再按条件筛选,最后要筛选出对应的属性,第三步才知道total,所以第二步才会报错
语文成绩 > 80 并且不姓孙的同学
sql 复制代码
select name,chinese from exam_result where chinese > 80 and name not like '孙%'; 
孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
sql 复制代码
select name,chinese,math,english,chinese+math+english as 总分 from exam_result where name like '孙_' or (chinese+math+english > 200 and chinese < math and english > 80);

NULL 的查询

  1. ' '和NULL是不一样的,' '是空串
sql 复制代码
select * from test where name is null;
select * from test where name is not null;
  1. NULL和任何数比较都是NULL,NULL是不参与比较的
  1. <=> 可以用于NULL比较,0表示假,1表示真

order by 子句

  1. asc为升序,desc为降序,默认是asc
  2. SELECT ... FROM table_name [WHERE ...]
    ORDER BY column [ASC|DESC], [...];
sql 复制代码
// 按数学成绩升序排序
select name,math from exam_result where order by math asc;
// 按数学成绩降序排序
select name,math from exam_result where order by math desc;

order by 子句案例

NULL值比任何值都小
查询同学各门成绩,依次按 数学降序,英语降序,语文升序的方式显示
  1. 如果数学成绩相同,按照英语成绩升序的顺序排列,如果数学,英语成绩相同,按照语文升序的顺序排列
sql 复制代码
select name,math,english,chinese from exam_result where order by math desc,english desc,chinese asc;

// 不显示给升序和降序,默认是升序排序
select name,math,english,chinese from exam_result
where order by math;
  1. 可以使用别名了,因为是先有别名,再使用别名
查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
  1. order by的执行顺序是比where的顺序要晚
sql 复制代码
select name,math from exam_result where name like '孙%' or name like '曹%' order by math desc;

筛选分页结果

sql 复制代码
// 筛选出前5行的数据
select * from exam_result limit 5;


2. 从第二条记录开始筛选

sql 复制代码
// n表示行数,s表示从下标哪个位置开始筛选
select * from test limit n offset s;
  1. 对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死
  2. 也可以进行分页操作,如下图,按三行分1页


5. 需要有数据才能排序,只有数据准备好了,你才需要显示,limit的本质功能是'显示'数据,并且limit的顺序等级是最后的,在排序后
6. 需要排序好后再分页查看,比如要查看5到10名的成绩,则需要排升序,再分页

相关推荐
hnlucky1 分钟前
redis 数据类型新手练习系列——List类型
运维·数据库·redis·学习·bootstrap·list
橙子199110162 分钟前
请简述一下什么是 Kotlin?它有哪些特性?
android·开发语言·kotlin
梦想画家43 分钟前
Bash 脚本:让数据库管理更高效
数据库·bash
想睡好1 小时前
mysql约束
数据库
贫道绝缘子1 小时前
【Android】四大组件之Service
android
weixin_472339461 小时前
Android Studio下载安装教程
android·ide·android studio
小黄人V1 小时前
使用skywalking进行go的接口监控和报警
数据库·golang·skywalking
tangweiguo030519872 小时前
Android Kotlin 依赖注入全解:Koin appModule 配置与多 ViewModel 数据共享实战指南
android·kotlin
西楚曹长卿2 小时前
RN 获取视频封面,获取视频第一帧
android·react native·音视频·react
烂漫心空2 小时前
数据库的死锁相关(一)
数据库·sql·mysql