查找语句
1.最基础的查找, 全列查找, 直接将一个表中的所有行和列全部查找出来.
select * from 表名;
这里查找到的表是一个"临时表",我们之前所说的数据库中的表都是在硬盘上的,通过select查询的结果并不在硬盘上,而是在内存中,进行输出之后,数据也就随之释放了.
select操作不会影响到服务器硬盘上保存的数据.
危险操作, 生产环境保存数据量可能非常大, 如果此时执行这个操作,服务器会持续读取硬盘数据, 瞬间将硬盘的IO带占满, 而硬盘的读取速度是存在上限的, 同时MySQL服务器又会立刻返回响应数据, 由于返回的响应数据也非常多, 也会把网卡的带宽占满.
一旦服务器的硬盘和网络被占满, 可能会难以对其他客户端的请求做出响应.
2.指定列查询, 只查询自己关注的列
select 列名, 列名, 列名 from 表名; (列的顺序没有要求)
在使用这种方式查询时,客户端会显式地告诉数据库需要查询的是哪些列, 这样数据库就会有针对性地返回数据, 而不是将全部的数据都进行返回, 因此这种查询方式更为高效.
在实际开发中, 指定列查询更为通用, 它对数据库的负担相比于全列查询来说要小很多.
与全列查找相同, 通过select查询出的表格只是一个临时表, 随着打印的完成, 内存就释放了, 临时表的结果对数据库服务器的原始数据没有任何影响.
3.指定查询字段为表达式, 在查询过程中同时进行运算操作(列和列之间的运算)
例如,给每个学生的id +10:
注意, 这里通过select查询到的表格依然是一个临时表, 也就是说, 我们执行的id+10操作并没有影响到数据库中的原始数据, 数据库中的数据依然没有发生变化.
我们查询到的临时表中的数据类型不一定和原始数据表中的数据类型一致, 临时表中的运算结果会自动适应, 以保证我们的运算结果是正确的,
上述操作都是对一个或多个列来进行的, 也就是说, 当我们对指定的列进行操作时, 每一行的这一列都要执行这个操作, 行和行之间互不影响.
null值不能参与运算!
- 为查询字段指定别名, 也就是为临时表指定新的列名
select 列名的运算 as 新列名 from 表名; (as可以省略) - 上述例子中, 我们查询出id+10 并将其命名为 new_id.
- 针对查询结果去重
select distinct 列名 from 表名; - 上述例子去除了查询结果中重复的id.
也可以同时对多个列进行去重, 但此时需要这些列的值都相同.
对于上述例子, 在查询过程中, 如果发现有某一行与上面某一行的id, name, age, score都相同, 那么就去掉重复的这一行, 如果某两行不完全相同, 则不进行去重.6. 针对查询结果(临时表)进行排序, 不会影响数据库服务器上的原始数据
(asc表示升序,desc表示降序, 如果不写升序或降序,则默认为升序排序)
上述例子对查询结果针对 id 大小进行了升序排序.
在数据库的原始数据中可能存在null, 当我们在进行排序时,默认null值为最小值.我们也可以针对表达式或别名进行排序:
我们还可以通过order by 来指定多个列进行排序, 此时如果第一个列的值相同, 就根据第二个列的值进行排序, 以此类推.(这里的排序是有明确的优先级的, 如order by 后面的第一列的优先级高于第二列)
select 列名… from 表名 order by 列名…;
如果order by 后面所有列的值都相同, 那么这些查询结果的先后顺序时不可预期的.
7. select 中的条件查询
select 列名… from 表名 where 条件;
where后面跟的是查询条件, 查询结果中符合条件的会被保留, 不符合条件的会被去除.
查询条件中的比较运算符:
注意:比较运算符中的 = 表示比较相等, 而非赋值.
null = null 的结果仍为 null, 这个结果null会被视为假, 因此不能通过 = 来比较空值, 想要对空值进行比较, 就需要用到<=>.
<=> 的用法和 = 基本一致, 只是在比较空值时, null <=> null 的结果为真.
between … and … 与一般语言的区间不同, 这个区间左右都是封闭的.
like是对查询结果进行模糊匹配, like的具体用法我们在后面会讲到.逻辑运算符:
注意: where后面跟的不可以是别名, 如:
select id +10 as new_id from student where id + 10 = new_id;
这样的语句是错误的, 因为new_id 是 id+10 的别名.
Q:为什么where后面不可以跟别名呢?
A:服务器在执行select语句时, 会先执行where中的语句来进行筛选, 只有筛选结果为真时才会显示where之前的语句, 而别名只有在判断完成之后, 在需要表示的时候才会被生成, 因此如果在where后面使用别名, where会无法识别出来.
对于逻辑运算符, and 的优先级高于or, 如果一个表达式中同时有and和or, 需要先进行and运算, 再进行or运算, 如果需要打破优先级, 就需要加().