MySQL查询进阶之多表查询
一、基本的select语句
1.查询常量
2.从表中查数据
SELECT 标识选择哪些列
FROM 标识从哪个表中选择
很明显,它的意思就是说,我们要从哪一张表中查询数据
比如说,我们要从员工表emp中查询所有数据,
当然了,如果我们只是想要查询部分数据,我们完全可以指定要查询的字段名字
MySQL中的SQL语句是不区分大小写的,因此SELECT和select的作用是相同的,但是,许多开发人员习惯将关键字大写、数据列和表名小写,读者也应该养成一个良好的编程习惯,这样写出来的代码更容易阅读和维护。注意:一般情况下,除非需要使用表中所有的字段数据,最好不要使用通配符‘*’。使用通配符虽然可以节省输入查询语句的时间,但是获取不需要的列数据通常会降低查询和所使用的应用程序的效率。通配符的优势是,当不知道所需要的列的名称时,可以通过它获取它们。
在开发的时候,我们最好不要使用*
来进行查询,你想想看,开发过程中,数据库中的数据是不是有很多,然后如果使用通配符一下子把所有记录查询出来,电脑可能就直接死机了。
3.使用列的别名查询
我们发现在进行数据查询的时候,有的时候字段名很长,我们写起来也不是很方便,我们就考虑能不能通过别名来查数据呢
方式一:列名和别名之间加上as关键字
方式二:列名和别名之间用空格隔开
注意:我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,请在SQL语句中使用一对``(着重号)引起来。
我们使用select语句来进行查询,那么查询的结果会影响到数据库中表的记录吗?
接下来我们来看一下
我们刚刚不是用来别名了吗,为什么表中没有改变呢,大家可能会有这样的疑惑,事实上,使用select语句查询出来的是一个临时的表。
你看看,我们用select查询出来的结果,是不是和表长得很像,上面是第一行都是字段,然后下面都是数据。就相当于是客户端新建了一张临时的表用来存放我们刚刚用select查询出来的数据,当它把查询结果显示出来给我们看以后,内存就释放了,当然不会影响硬盘中的数据,。
4.去重
使用关键字distinct
我们先来看看distinct用在单给字段上面的情况
接下来我们来看看对多个字段进行去重的情况
5.空值NULL参与运算
所有运算符或列值遇到null值,运算的结果都为null
先回顾一下表中数据
发现和null运算结果为null
6.过滤数据
使用where可以过滤数据,筛选出我们想要选的数据
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件
补充一下:desc可以显示表的结构
Field:表示字段名称。
Type:表示字段类型,这里 barcode、goodsname 是文本型的,price 是整数类型的。
Null:表示该列是否可以存储NULL值。
Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
Default:表示该列是否有默认值,如果有,那么值是多少。
Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。
二、 运算符
1.算术运算符
2.比较运算符
比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其他情况则返回NULL。
比较运算符经常被用来作为SELECT查询语句的条件来使用,返回符合条件的结果记录。
1.等号运算符
2.安全等于运算符
3.不等于运算符
空运算符(IS NULL或者ISNULL)判断一个值是否为NULL,如果为NULL则返回1,否则返回0。mysql> SELECT NULL IS NULL, ISNULL(NULL), ISNULL('a'), 1 IS NULL; +--------------+--------------+-------------+-----------+ | NULL IS NULL | ISNULL(NULL) | ISNULL('a') | 1 IS NULL | +--------------+--------------+-------------+-----------+ | 1 | 1 | 0 | 0 | +--------------+--------------+-------------+-----------+
BETWEEN运算符使用的格式通常为SELECT D FROM TABLE WHERE C BETWEEN A AND B,此时,当C大于或等于A,并且C小于或等于B时,结果为1,否则结果为0。
IN运算符
IN运算符用于判断给定的值是否是IN列表中的一个值,如果是则返回1,否则返回0。如果给定的值为NULL,或者IN列表中存在NULL,则结果为NULL。
LIKE运算符主要用来匹配字符串,通常用于模糊匹配,如果满足条件则返回1,否则返回0。如果给定的值或者匹配条件为NULL,则返回结果为NULL。
LIKE运算符通常使用如下通配符: “%”:匹配0个或多个字符。 “_”:只能匹配一个字符。
3.逻辑运算符
逻辑非
逻辑与
逻辑或
OR可以和AND一起使用,但是在使用时要注意两者的优先级,由于AND的优先级高于OR,因此先对AND两边的操作数进行操作,再与OR中的操作数结合。
逻辑异或运算符
4.位运算符
位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。
MySQL支持的位运算符如下:
1.按位与运算符
按位与(&)运算符将给定值对应的二进制数逐位进行逻辑与运算。当给定值对应的二进制位的数值都为1时,则该位返回1,否则返回0。
mysql> SELECT 1 & 10, 20 & 30;
+--------+---------+
| 1 & 10 | 20 & 30 |
+--------+---------+
| 0 | 20 |
+--------+---------+
1 row in set (0.00 sec)
1的二进制数为0001,10的二进制数为1010,所以1 & 10的结果为0000,对应的十进制数为0。20的二进制数为10100,30的二进制数为11110,所以20 & 30的结果为10100,对应的十进制数为20。
2. 按位或运算符
按位或(|)运算符将给定的值对应的二进制数逐位进行逻辑或运算。当给定值对应的二进制位的数值有一个或两个为1时,则该位返回1,否则返回0。
mysql> SELECT 1 | 10, 20 | 30;
+--------+---------+
| 1 | 10 | 20 | 30 |
+--------+---------+
| 11 | 30 |
+--------+---------+
1 row in set (0.00 sec)
1的二进制数为0001,10的二进制数为1010,所以1 | 10的结果为1011,对应的十进制数为11。20的二进制数为10100,30的二进制数为11110,所以20 | 30的结果为11110,对应的十进制数为30。
3. 按位异或运算符
按位异或(^)运算符将给定的值对应的二进制数逐位进行逻辑异或运算。当给定值对应的二进制位的数值不同时,则该位返回1,否则返回0。
mysql> SELECT 1 ^ 10, 20 ^ 30;
+--------+---------+
| 1 ^ 10 | 20 ^ 30 |
+--------+---------+
| 11 | 10 |
+--------+---------+
1 row in set (0.00 sec)
1的二进制数为0001,10的二进制数为1010,所以1 ^ 10的结果为1011,对应的十进制数为11。20的二进制数为10100,30的二进制数为11110,所以20 ^ 30的结果为01010,对应的十进制数为10。
再举例:
mysql> SELECT 12 & 5, 12 | 5,12 ^ 5 FROM DUAL;
+--------+--------+--------+
| 12 & 5 | 12 | 5 | 12 ^ 5 |
+--------+--------+--------+
| 4 | 13 | 9 |
+--------+--------+--------+
1 row in set (0.00 sec)
可能这样还是很懵,可以看看这张图理解一下,位运算会先把数字转换成二进制,然后逐位进行运算
4. 按位取反运算符
按位取反(~)运算符将给定的值的二进制数逐位进行取反操作,即将1变为0,将0变为1。
mysql> SELECT 10 & ~1;
+---------+
| 10 & ~1 |
+---------+
| 10 |
+---------+
1 row in set (0.00 sec)
由于按位取反(~)运算符的优先级高于按位与(&)运算符的优先级,所以10 & ~1,首先,对数字1进行按位取反操作,结果除了最低位为0,其他位都为1,然后与10进行按位与操作,结果为10。
5. 按位右移运算符
按位右移(>>)运算符将给定的值的二进制数的所有位右移指定的位数。右移指定的位数后,右边低位的数值被移出并丢弃,左边高位空出的位置用0补齐。
mysql> SELECT 1 >> 2, 4 >> 2;
+--------+--------+
| 1 >> 2 | 4 >> 2 |
+--------+--------+
| 0 | 1 |
+--------+--------+
1 row in set (0.00 sec)
6. 按位左移运算符
按位左移(<<)运算符将给定的值的二进制数的所有位左移指定的位数。左移指定的位数后,左边高位的数值被移出并丢弃,右边低位空出的位置用0补齐。
按位左移和上面的右移是一样道理,这里就不说了。
mysql> SELECT 1 << 2, 4 << 2;
+--------+--------+
| 1 << 2 | 4 << 2 |
+--------+--------+
| 4 | 16 |
+--------+--------+
1 row in set (0.00 sec)
三、 排序和分页
1.排序
使用order by进行排序
ASC(ascend): 升序
DESC(descend):降序
-
如果没有使用排序操作,默认情况下查询返回的数据是按照我们添加的顺序显示。
-
如果在ORDER BY后没有显示的指明排序顺序,则默认为升序排列。
-
可以使用列的别名进行排序。
-
列的别名只能ORDER BY中使用,不能在WHERE 当中使用来进行筛选。
-
ORDER BY的字段不一定是要查询的字段。
-
强调格式:WHERE 需要声明在FROM后,ORDER BY之前。
可以使用不在SELECT列表中的列排序。 在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
2.分页
使用LIMIT进行分页
什么是分页呢,我们来看一下下面的图片,其实分页很常见的
我们在浏览器输入要查找的数据,浏览器就会返回一些数据给我们,当我们点击下一页,或者是指定也是页数的时候,它就会跳转到相应页面。
那么我们为什么要进行分页呢,理由其实很简单
假如现在,我们想要查找一些信息,然后浏览器把所有的信息都返回给我们,那这样的话,服务器的压力就会很大,因为数据很庞大,而且对于用户来说,我们可能在前面几条信息就已经得到了我们想要的答案,那我们就不会浪费时间继续往下看。那么后面的那些数据是不是就浪费掉了呢?而且这样也很影响效率,速度很慢,而且你想想把所有数据返回,网站相应速度就会很慢的,用户等了好久也等不到网站的响应,那用户可能就等不下去了,这样长久以往,这个网站就会失去很多的用户。
再来举个例子:以我们在淘宝买东西为例,我们想买东西,我们点击下一页,才返回一些物品信息给我们,我们如果没有点击下一页,就没有必要返回物品信息给我们了。
格式:LIMIT [位置偏移量,] 行数
第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);第二个参数“行数”指示返回的记录条数。
--前10条记录:
SELECT * FROM 表名 LIMIT 0,10;
或者
SELECT * FROM 表名 LIMIT 10;
--第11至20条记录:
SELECT * FROM 表名 LIMIT 10,10;
--第21至30条记录:
SELECT * FROM 表名 LIMIT 20,10;
MySQL 8.0中可以使用“LIMIT 3 OFFSET 4”,意思是获取从第5条记录开始后面的3条记录,和“LIMIT 4,3;”返回的结果相同。
- 分页显式公式 :(当前页数-1)*每页条数,每页条数
SELECT * FROM table LIMIT(PageNo - 1)*PageSize,PageSize;
- 注意:LIMIT 子句必须放在整个SELECT语句的最后!
使用 LIMIT 的好处
约束返回结果的数量可以
减少数据表的网络传输量
,也可以提升查询效率
。如果我们知道返回结果只有 1 条,就可以使用LIMIT 1
,告诉 SELECT 语句只需要返回一条记录即可。这样的好处就是 SELECT不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。
下一篇我会更新数据库的高级查询,比如多表查询,子查询等,数据库的CRUD语句中,最重要的就是select语句了,希望对大家有帮助
- 点赞
- 收藏
- 关注作者
评论(0)