文章目录
- 一. 基础查询
- 二. where条件子句
- 三. NULL的比较
- 结束语
操作如下表
//创建表结构
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 '英语成绩'
-> );
//插入测试数据
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);
一. 基础查询
全列查询
通常不建议使用*进行全列查询
1.查的列越多,需要传输的数据量越大
2.可能影响到索引的使用
mysql> select * from exam_result;
+----+-----------+---------+------+---------+
| id | name | chinese | math | english |
+----+-----------+---------+------+---------+
| 1 | 唐三藏 | 67 | 98 | 56 |
| 2 | 孙悟空 | 87 | 78 | 77 |
| 3 | 猪悟能 | 88 | 98 | 90 |
| 4 | 曹孟德 | 82 | 84 | 67 |
| 5 | 刘玄德 | 55 | 85 | 45 |
| 6 | 孙权 | 70 | 73 | 78 |
| 7 | 宋公明 | 75 | 65 | 30 |
+----+-----------+---------+------+---------+
指定列查询
指定列的顺序不需要按照表的属性顺序来
mysql> select id,name,english,math from exam_result;
+----+-----------+---------+------+
| id | name | english | math |
+----+-----------+---------+------+
| 1 | 唐三藏 | 56 | 98 |
| 2 | 孙悟空 | 77 | 78 |
| 3 | 猪悟能 | 90 | 98 |
| 4 | 曹孟德 | 67 | 84 |
| 5 | 刘玄德 | 45 | 85 |
| 6 | 孙权 | 78 | 73 |
| 7 | 宋公明 | 30 | 65 |
+----+-----------+---------+------+
查询字段为表达式
//表达式不包含属性
mysql> select id,name,1+1 from exam_result;
+----+-----------+-----+
| id | name | 1+1 |
+----+-----------+-----+
| 1 | 唐三藏 | 2 |
| 2 | 孙悟空 | 2 |
| 3 | 猪悟能 | 2 |
| 4 | 曹孟德 | 2 |
| 5 | 刘玄德 | 2 |
| 6 | 孙权 | 2 |
| 7 | 宋公明 | 2 |
+----+-----------+-----+
//表达式包含一个属性
mysql> select id,name,english+10 from exam_result;
+----+-----------+------------+
| id | name | english+10 |
+----+-----------+------------+
| 1 | 唐三藏 | 66 |
| 2 | 孙悟空 | 87 |
| 3 | 猪悟能 | 100 |
| 4 | 曹孟德 | 77 |
| 5 | 刘玄德 | 55 |
| 6 | 孙权 | 88 |
| 7 | 宋公明 | 40 |
+----+-----------+------------+
//表达式包含多个属性
mysql> select id,name,chinese+math+english from exam_result;
+----+-----------+----------------------+
| id | name | chinese+math+english |
+----+-----------+----------------------+
| 1 | 唐三藏 | 221 |
| 2 | 孙悟空 | 242 |
| 3 | 猪悟能 | 276 |
| 4 | 曹孟德 | 233 |
| 5 | 刘玄德 | 185 |
| 6 | 孙权 | 221 |
| 7 | 宋公明 | 170 |
+----+-----------+----------------------+
为查询结果指定别名
select 属性 [as] 别名 ... from table_name
[]内的内容可省略
mysql> select id,name,chinese+math+english as total from examm_result;
+----+-----------+-------+
| id | name | total |
+----+-----------+-------+
| 1 | 唐三藏 | 221 |
| 2 | 孙悟空 | 242 |
| 3 | 猪悟能 | 276 |
| 4 | 曹孟德 | 233 |
| 5 | 刘玄德 | 185 |
| 6 | 孙权 | 221 |
| 7 | 宋公明 | 170 |
+----+-----------+-------+
结果去重
select distinct 属性 from table_name
mysql> select distinct math from exam_result;
+------+
| math |
+------+
| 98 |
| 78 |
| 84 |
| 85 |
| 73 |
| 65 |
+------+
二. where条件子句
比较运算符
运算符 | 说明 |
---|---|
>,>=,<,<= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL不安全,NULL=NULL结果是NULL |
<=> | 等于,NULL安全,NULL<=>结果是TRUE(1) |
!=,<> | 不等于 |
between a0 and a1 | 范围匹配,[a0,a1],如果a0<=value<=a1,返回TRUE(1) |
in (option,…) | 如果是option中的任意一个,返回TRUE(1) |
is null | 是NULL |
is not null | 不是NULL |
like | 模糊匹配。%表示任意个字符(包括0);_表示任意一个 |
逻辑运算符
运算符 | 说明 |
---|---|
and | 多个条件必须都TRUE,结果才TRUE(1) |
or | 任意一个位TRUE,结果为TRUE(1) |
not | 条件为TRUE,结果为false(0) |
实验:
查询英语不及格的同学及英语成绩
mysql> select name,english from exam_result where english<60;
+-----------+---------+
| name | english |
+-----------+---------+
| 唐三藏 | 56 |
| 刘玄德 | 45 |
| 宋公明 | 30 |
+-----------+---------+
查询语文成绩在[80,90]的同学及语文成绩
mysql> select name,chinese from exam_result where chinese between 80 and 90;
//或者
mysql> select name,chinese from exam_result where chinese >=80 and chinese <=90;
+-----------+---------+
| name | chinese |
+-----------+---------+
| 孙悟空 | 87 |
| 猪悟能 | 88 |
| 曹孟德 | 82 |
+-----------+---------+
查询数学成绩是58或者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);
+-----------+------+
| name | math |
+-----------+------+
| 唐三藏 | 98 |
| 猪悟能 | 98 |
+-----------+------+
查询姓孙的同学
%
:匹配任意多个(包括0个)任意字符
mysql> select name from exam_result where name like '孙%';
+-----------+
| name |
+-----------+
| 孙悟空 |
| 孙权 |
+-----------+
查询孙某同学
_
:匹配一个任意字符
mysql> select name from exam_result where name like '孙_';
+--------+
| name |
+--------+
| 孙权 |
+--------+
查询总分在200分以下的同学及总分
mysql> select name,chinese+math+english as total from exam_reesult
->where chinese+math+english<200;
+-----------+-------+
| name | total |
+-----------+-------+
| 刘玄德 | 185 |
| 宋公明 | 170 |
+-----------+-------+
where处不能使用别名
,因为where是筛选,先筛选再显示,所以where在别名前执行,并不知道别名是什么
查询语文成绩>80 并且不姓孙的同学
mysql> select name,chinese from exam_result where chinese>80 and name not like '孙%';
+-----------+---------+
| name | chinese |
+-----------+---------+
| 猪悟能 | 88 |
| 曹孟德 | 82 |
+-----------+---------+
查询孙某同学,否则要求总成绩>200 并且 语文成绩<数学成绩 并且 英语成绩>80
mysql> select name,chinese,math,english,chinese+math+english as total
->from exam_result where name like '孙_'
->or
->(chinese++math+english>200 and chinese<math and english>80);
+-----------+---------+------+---------+-------+
| name | chinese | math | english | total |
+-----------+---------+------+---------+-------+
| 猪悟能 | 88 | 98 | 90 | 276 |
| 孙权 | 70 | 73 | 78 | 221 |
+-----------+---------+------+---------+-------+
三. NULL的比较
NULL不参与运算
mysql> select NULL+1;
+--------+
| NULL+1 |
+--------+
| NULL |
+--------+
=
和<=>
的区别
NULL的=比较是不安全的,结果都是NULL
mysql> select NULL=NULL,NULL=1,NULL=0;
+-----------+--------+--------+
| NULL=NULL | NULL=1 | NULL=0 |
+-----------+--------+--------+
| NULL | NULL | NULL |
+-----------+--------+--------+
NULL的<=>比较是安全的,返回值为TRUE(1)或者FALSE(0)
mysql> select NULL<=>NULL,NULL<=>1,NULL<=>0;
+-------------+----------+----------+
| NULL<=>NULL | NULL<=>1 | NULL<=>0 |
+-------------+----------+----------+
| 1 | 0 | 0 |
+-------------+----------+----------+
结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。