分析网站建设,商业计划书模板,修改wordpress菜单,做网站asp用什么软件目录
1、查询操作(Retrieve)
1.1 全列查询
1.2 指定列查询
1.3 查询字段为表达式
1.4 别名
1.5 去重#xff1a;DISTINCT
1.6 排序#xff1a;ORDER BY
1.7 条件查询#xff1a;WHERE
1.8 分页查询 1、查询操作(Retrieve)
查询操作算的上是 SQL 中最复杂的操作了… 目录
1、查询操作(Retrieve)
1.1 全列查询
1.2 指定列查询
1.3 查询字段为表达式
1.4 别名
1.5 去重DISTINCT
1.6 排序ORDER BY
1.7 条件查询WHERE
1.8 分页查询 1、查询操作(Retrieve)
查询操作算的上是 SQL 中最复杂的操作了这里我们以基础的为主要。
1.1 全列查询
查询表里的所有的列是我们初学阶段比较常见的一个操作
-- select * from 表名;
select * from student;
--------------------
| id | name | sex |
--------------------
| 1 | 张三 | 男 |
| 2 | 小美 | 女 |
| 3 | 赵六 | 男 |
| 4 | 李四 | NULL |
--------------------
-- 4 rows in set (0.00 sec)
通过 select * from 表名; 的方式来查询* 表示为通配符代表了所有的列无论表中是啥样的里面有几列啥名字都没关系都可以用 * 来表示所有。
对于我们学习阶段来说这个操作还好但是在公司里特别是生产环境上可不能随便执行 select * 这样的操作进行这个操作就相当于我们的 MySQL 服务端给服务器发送了一条指令服务器给我们返回对应指令查询到的结果如果数据量非常大以 TB 为单位的话此处的查询操作就会遍历所有的数据把数据从服务器硬盘上读出来通过网卡进行发送回客户端。在数据量特别大的时候就会把硬盘 IO 吃满或者网络带宽也吃满了此时外面其他的用户想要访问这个服务器因为这个查询操作把带宽或IO吃满了就可能出现无法正常使用的情况
1.2 指定列查询
这个查询不用按照表中列的顺序来查询只要表中包含该列即可
select name, id from student;
--------------
| name | id |
--------------
| 张三 | 1 |
| 小美 | 2 |
| 赵六 | 3 |
| 李四 | 4 |
--------------
-- 4 rows in set (0.00 sec)
这里其实也就是把 * 改成了我们想要查询的指定列每个列中间用英文的逗号来隔开
1.3 查询字段为表达式
这里我们为了更好的演示接下来的操作我们重新创建一张表包含更合理的字段
drop table student;
create table student (id int,name varchar(10), sex varchar(1), java float(5, 2),python float(5, 2));
insert into student value(1, 张三, 男, 88.2, 87.9),(2, 李四, 男, 92.5, 78.2),(3, 小美, 女, 80.9, 68.6),(4, 小花, 男, 97.0, 71.3);我们先来看一下新创造出的这张表中全部的数据
select * from student;
-----------------------------------
| id | name | sex | java | python |
-----------------------------------
| 1 | 张三 | 男 | 88.20 | 87.90 |
| 2 | 李四 | 男 | 92.50 | 78.20 |
| 3 | 小美 | 女 | 80.90 | 68.60 |
| 4 | 小花 | 男 | 97.00 | 71.30 |
-----------------------------------
-- 4 rows in set (0.00 sec)
这里可以发现各位同学的 java 考试分数都很不错啊为了防止他们骄傲Java 老师决定不给他们公开真实的分数而是给每位同学展示 java 扣 10 分后的结果于是可这样写 SQL
select id, name, sex, java - 10 from student;
-------------------------------
| id | name | sex | java - 10 |
-------------------------------
| 1 | 张三 | 男 | 78.20 |
| 2 | 李四 | 男 | 82.50 |
| 3 | 小美 | 女 | 70.90 |
| 4 | 小花 | 男 | 87.00 |
-------------------------------
-- 4 rows in set (0.00 sec)
这里我们要注意的是select 只是查询并不会修改原来表中的数据而查询的结果是一个 临时表这个查询出来的表是不会写到硬盘里面去的。
注意select 只是查询并不会修改原来的数据
如果现在是班主任想统计一下每个同学的总分也就是 javapython 的分数当然也是可以的SQL 可以这样去写
select id, name, sex, java python from student;
-----------------------------------
| id | name | sex | java python |
-----------------------------------
| 1 | 张三 | 男 | 176.10 |
| 2 | 李四 | 男 | 170.70 |
| 3 | 小美 | 女 | 149.50 |
| 4 | 小花 | 男 | 168.30 |
-----------------------------------
-- 4 rows in set (0.00 sec)
而这些表达式查询呢只能针对每一行对应的列进行运算是无法做到行于行之间的运算的比如我要求 java 考试分数的总和这个我们到后面进阶篇会讲解。
上述的表达式查询可能有不少小伙伴发现了给每个同学的 java 分数减少 10 分这一列的列名居然是 java - 10那这一下子不就露馅了吗都知道老师给自己扣了 10 分这可不行啊于是我们可以给字段起一个别名
1.4 别名
为查询中的指定列指定别名返回的结果集中以别名作为该列的名称例如还是每位同学 java 扣 10 分
select id, name, sex, java - 10 as java from student;
---------------------------
| id | name | sex | java |
---------------------------
| 1 | 张三 | 男 | 78.20 |
| 2 | 李四 | 男 | 82.50 |
| 3 | 小美 | 女 | 70.90 |
| 4 | 小花 | 男 | 87.00 |
---------------------------
-- 4 rows in set (0.00 sec)
这样就万无一失了我们通过 as 来指定该列的别名其实这个 as 可以省略掉中间用空格隔开就行但建议还是带上 as 这样 SQL 的可读性就更高了
1.5 去重DISTINCT
这里为了看到效果我们来插入两条数据
insert into student value(5, 李四, 男, null, null),(6, 小花, 女, null, null);先不去重来查询下 name 这一列
select name from student;
--------
| name |
--------
| 张三 |
| 李四 |
| 小美 |
| 小花 |
| 李四 |
| 小花 |
--------
-- 6 rows in set (0.00 sec)
通过查询结果能发现小李和小花重复出现了一次如何去掉一列中重复出现的数据呢
select distinct name from student;
--------
| name |
--------
| 张三 |
| 李四 |
| 小美 |
| 小花 |
--------
-- 4 rows in set (0.00 sec)
注意这里的 distinct 是要给哪列去重就加在哪列的前面即可中间用空格隔开 当然也能指定多列但是就要满足指定列都相同才算重复
1.6 排序ORDER BY
比如现在我们有个需求需要按照总成绩从高到低排序这里就可以使用 order by 了
select id, name, sex, java python as 总分 from student order by 总分;
----------------------------
| id | name | sex | 总分 |
----------------------------
| 5 | 李四 | 男 | NULL |
| 6 | 小花 | 女 | NULL |
| 3 | 小美 | 女 | 149.50 |
| 4 | 小花 | 男 | 168.30 |
| 2 | 李四 | 男 | 170.70 |
| 1 | 张三 | 男 | 176.10 |
----------------------------
-- 6 rows in set (0.00 sec)
order by 后面的总分指的是对总分这一列排序默认是升序当然 order by 总分也能换成 order by java python 也是可以的
注意在 SQL 中 NULL 和 任何值计算都是 NULL而且 NULL 是最小的值
既然默认是升序那么我们也可以降序排序只需要在后面加上 desc 就可以了这里的 desc 和查看表结构的 desc 不同一个是 describe一个是 descend
select id, name, sex, java python as 总分 from student order by 总分 desc;
----------------------------
| id | name | sex | 总分 |
----------------------------
| 1 | 张三 | 男 | 176.10 |
| 2 | 李四 | 男 | 170.70 |
| 4 | 小花 | 男 | 168.30 |
| 3 | 小美 | 女 | 149.50 |
| 5 | 李四 | 男 | NULL |
| 6 | 小花 | 女 | NULL |
----------------------------
-- 6 rows in set (0.00 sec)
那么实际中会不会有这样一种情况先是按照 java 分数从低到高排序如果 java 分数一样就按照 python 从高到低排序呢当然是有的这种我们称为指定多个列排序
select id, name, sex, java, python from student order by java asc, python desc;
-----------------------------------
| id | name | sex | java | python |
-----------------------------------
| 5 | 李四 | 男 | NULL | NULL |
| 6 | 小花 | 女 | NULL | NULL |
| 3 | 小美 | 女 | 80.90 | 68.60 |
| 1 | 张三 | 男 | 88.20 | 87.90 |
| 2 | 李四 | 男 | 92.50 | 78.20 |
| 4 | 小花 | 男 | 97.00 | 71.30 |
-----------------------------------
-- 6 rows in set (0.00 sec)
升序(默认)asc降序desc升序是可以不写这个 asc加上也无妨
1.7 条件查询WHERE
在了解条件查询之前我们需要先了解 MySQL 中的一些运算符
比较运算符
运算符说明大于大于等于小于小于等于等于NULL不安全例如 NULL NULL 的结果是 NULL等于NULL安全例如 NULL NULL 的结果是 TRUE(1)!不等于(第一种用的偏多)BETWEEN a0 AND a1范围匹配[a0a1] 如果 a0 value a1 返回 TRUE(1)IN (option...)如果是 option 中的任意一个返回 TRUE(1)IS NULL是 NULLIS NOT NULL不是 NULLLIKE模糊匹配% 表示任意多个(包括 0 个) 任意字符_ 表示任意一个字符
逻辑运算符
运算符说明AND多个条件必须为 TRUE(1)结果才是 TRUE(1)OR任意一个条件为 TRUE(1)结果为 TRUE(1) NOT 条件为 TRUE(1)结果为 FALSE(0)
注意WHERE 条件可以使用表达式但不能使用别名。AND 优先级高于 OR 使用时需要用 () 包裹优先执行的部分。 通过 where 指定一个 条件 把查询到的每一行都带入到条件中看为真还是为假把满足条件的即为真的保留作为临时表的结果条件不满足即为假则舍弃 ● 查询 java 成绩大于 90 分的同学
select name, java from student where java 90;
● 查询总成绩大于 160 分的同学
select name, java python as 总分 from student where java python 160;
● 查询 java 成绩大于 90 或者 python 成绩大于 70 的同学
select name, java, python from student where java 90 or python 70; ● 查询 python 成绩在 [8090] 的同学
select name, python from student where python between 80 and 90;
select name, python from student where python 80 and python 90;
-- 上述两种写法都可以
● 查询 java 成绩是 90分83分72分的同学
select name, java from student where java in (90, 83, 72);
select name, java from student where java 90 or java 83 or java 72;
-- 上述两种写法都可以
● 查询姓 张 的同学
select name from student where name like 张%;
● 查询名字为三个字中间一个字为 小 的
select name from student where name like _小_;
● 查询没有 java 成绩的同学
select name from student where java null;
-- 注意 null 值比较用 不能用
1.8 分页查询
上述说到 select * 是一个很危险的操作那么 MySQL 引入了一个分页查询限制了每次查询显示的最多为多少条数据比如我们现在只查询俩条数据
select * from student limit 2;
搭配 offset 就可以指定从第几条开始进行筛选了offset 默认从 0 开始。
select * from student limit 2 offset 0;
select * from student limit 2 offset 2;
select * from student limit 2 offset 4;
数据的起始下标为 0与数组下标有点类似。 下期预告【MySQL】表的基本约束