上一篇文章记录了我安装Navicat,后将Navicat与MySQL连接起来,建立学生信息数据库、熟悉Navicat对表的常用操作的大致过程,并且回顾了一些SQL中常用的变量类型,SQL增改删查四大功能里增、改、删、语句的基础结构。这一篇文章里,我将记录我学习简单查询语句的过程。


目录

  1. 查询语句语法格式
  2. SQL语句运行顺序
  3. 如何为查询结果取名字
  4. 如何为查询结果去重
  5. 如何写注释
  6. 运算符(多条件查询)
  7. 模糊查询

附:一点查询优化心得


一、查询语句语法格式

select 列名1,列名2,...列名n(如需呈现所有记录直接用'*'代替列名)→找什么

from table1,table2,...table n→在哪些表找

where 条件;→在什么范围找




sql语句isnull会破坏索引么 sql 字段isnull_sql like 多个值


最基础的查询语句

tips:SQL语句中符号要用英文,句末以;结束,且SQL语句不区分关键字的大小写,但是用户存进数据库的值就会区分哦。

二、SQL执行顺序

②select *

①from 表名

③where 条件;

三、如何给查询结果取名字

为了让结果更清晰、易于理解,我们可以给查询结果的列取别名。别名不会影响字段在原表中的名字。

语法格式:

select 列名1 as 别名1,列名2..

from 表名

where 条件;


sql语句isnull会破坏索引么 sql 字段isnull_sql like 多个值_02

给查询结果取名字


四、如何为查询结果去重

如果想通过成绩表知道有哪些学生选修了课程,要是仅用select 学号 from score;就会将每一行的学生学号显示出来,于是我们还是不知道到底有哪些学生选了课。

怎么办?

把重复的内容去掉。

用什么?

distinct

distinct有什么用?

将之后的所有列组合在一起,只取满足查询条件的、不相同的列的组合做结果。

怎么用?

放紧接着select 后面的位置,放别的地方会报错。


sql语句isnull会破坏索引么 sql 字段isnull_sql语句isnull会破坏索引么_03

放错了位置是会报错的

sql语句isnull会破坏索引么 sql 字段isnull_sql like多个值_04

distinct要放在select之后,第一个列名之前

五、如何写注释

为了和自己的遗忘作斗争,也为了让别人更方便地看懂自己的代码,我们往往需要靠在难懂的或是精彩的位置做注释。

MySQL注释的形式有两种:①-- 注释→两个'--'后有一个空格!

②/*注释*/

六、运算符


sql语句isnull会破坏索引么 sql 字段isnull_sql语句isnull会破坏索引么_05


注意事项:

①可以用()让括号内的部分被提前运算

②字符串的比较是从左到右一位一位做比较,比照标准是字典顺序。于是尽管从数值上10>2,但是按位比较的话,'10'<'2'。

③空值是无法做计算的,判断是否为空用 IS NULL/IS NOT NULL进行。其中NULL不需要用单引号引起来。


sql语句isnull会破坏索引么 sql 字段isnull_sql like多个值_06

使用多个运算符进行查询

sql语句isnull会破坏索引么 sql 字段isnull_sql isnull怎么没用_07

使用between and查询姓名首字母在A-D之间的学生

但是有趣的是,本来预期被查出来的David并没有被查询出来。

我往后挪了一个字母:


sql语句isnull会破坏索引么 sql 字段isnull_sql语句isnull会破坏索引么_08

这下找出来了

sql语句isnull会破坏索引么 sql 字段isnull_sql语句isnull会破坏索引么_09

把and左边的值设为M,这次不用前移就可以找到

sql语句isnull会破坏索引么 sql 字段isnull_sql isnull怎么没用_10

即使换成小写也可以匹配到,这是为什么?

这一轮操作下来我发现Navicat和workbench的操作还是有些许不一样的,在这里记一下目前发现的不同之处,以免搞混:

①workbench中insert语句可以有多行values,但是Navicat只能有一行。

②workbench中insert语句(列1,列2...)有时可以省去,但是Navicat什么时候都不行。

七、模糊查询

LIKE:常和之后的两个符号一同出现,表示做模糊查询。

%:代替0个到任意多个字符

例如:查询姓李的学生的所有信息

select * from student

where 姓名 like ‘李%‘;

查询名字里包含李的学生的所有信息

select * from student

where 姓名 like ‘%李%‘;

_:仅代替一个字符

例如:查询姓李而且名字长度是两个字的学生信息

select * from student

where 姓名 like ‘李_‘;

附录:查询优化小指南

1.在where子句中,比较运算符的左侧慎用计算表达式

原因:在左侧有函数时,会导致数据库引擎扫描全表,然后再逐行比较,相比起直接比较就多了一次扫描全表的开销。

例如:查询原价+1之后价格超过20的商品

select 商品名 from 商品 where 价格+1>20;

优化:select 商品名 from 商品 where 价格>20-1;

2.在用连续的数值做约束条件时,用between...and..比用in/not in好

原因:in/not in也会导致全表搜索。这个情况适用于整数类型哦!因为如果列的数据类型是有含有小数点的数据,而不是整数的话,还是用in/not in稳妥。

例如:查找价格是8元或者9元的产品,但是表里的价格有8.2,8.5,8.7...这个时候用between 8 and 9 就会带来一串额外的烦恼了,所以这种时候还是用in/not in吧!

3.慎用or,宁可用union将多个查询语句的结果求并集,避免由or引起的全表搜索。

4.善用limit