7 .数据库-查-单表查询
因为查询有很多分支 所以分 单表查询 和 多表查询:
- 简单查询
1.1 SELECT语句
在MySQl中查询语句 最基本就是SELECT语句了,可以用不用的条件来查询表中的数据,SELECT语句的语法格式如下:
SELECT [ DISTINCT ] *|字段名1,字段名1,字段名1,…
FROM 表名
[ WHERE 条件表达式1 ]
[GROUP BY 字段名 [ HAVBING 条件表达式2 ] ]
[ORDER BY 字段名 [ ASC | DESC ] ]
[LIMIT [OFFSET] 记录数 ]
从上面的格式可以知道 这查询也是个比较卡手的东西啊!!所以分支出来讲.
我们先讲解SELECT语句的部分意思都是什么啊 这对于我们记忆很好:
1. SELECT [ DISTINCT ] *|字段名1,字段名1,字段名1,…
表示查询指定的字段,星号(*)表示表中全部字段,任选其一! DISTINCT是可选的,代表取出结果集中重复的数据。
- FROM 表名 表示冲指定的表中查询数据
- WHERE 条件表达式1 WHERE是可选参数,用于指定查询条件
- GROUP BY 字段名 [ HAVBING 条件表达式2 ] GROUP BY是可选的 表示按照指定字段进行分组,HAVBING 也是可选的 用于对分组后的结果进行过滤。
- ORDER BY 字段名 [ ASC | DESC ] 也是可选的 用于按照指定的字段进行排序,排序方法是ASC 或 DESC 控制,ASC是升序 DESC是降序 ,不指定的话默认ASC 升序
- LIMIT [OFFSET] 记录数 是可选的 用于限制查询结果的数量,下标从0开始.
SELECT语句还蛮复杂的,接下来我们一点点拆开来讲:
1.2查询所有字段
两种方式 : 一种傻乎乎把全部字段打出来查询 一种直接用通配符*号查:
首先tb_bihu表中有这么多记录:
id |
name |
sex |
age |
1 |
hgy |
1 |
18 |
2 |
hjy |
0 |
19 |
3 |
zhangsan |
1 |
20 |
4 |
shabi |
1 |
22 |
5 |
wolong |
1 |
20 |
6 |
fengchu |
0 |
20 |
7 |
xiaohong |
0 |
10 |
8 |
bihu |
1 |
18 |
9 |
hanhan |
0 |
19 |
10 |
hanpi |
1 |
20 |
1) 傻呼呼打的方式:
SELECT id,name,sex,age FROM tb_bihu;
2)直接*号查询:
SELECT * FROM tb_bihu;
1.3 查询指定的字段数据
语法:
SELECT 字段1,字段2,字段3,… FROM 表名;
例: 查询 名字 对应的 性别:
SELECT name,sex FROM tb_bihu;
2.按照条件查询
2.1带关系运算符的查询
SELECT语句中 最常见就是用WHERE子句来查询条件对数据的过滤了,语法格式:
SELECT 字段名1,字段名2,…
FROM 表名
WHERE 条件表达式
上面中 WHERE条件表达式中用的到运算符:
= 等于
<> 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于
这是部分的啊 还有很多其他的呢
例:查询tb_bihu 表中 id为4的name 和 age 字段数据:
SELECT name,age FROM tb_bihu WHERE id = 4;
2.2带IN 关键字的查询
用于 WHERE表达式中:
IN关键字判断某个字段是否在指定集合中 如果字段在集合中 则满足条件,这个字段所在的记录也会被查询出来:
语法:
SELECT … WHERE 字段名 [ NOT ] IN (元素1,元素2,…)
其中:元素1 和 元素2 代表的是 集合中的元素 如果字段名 在集合中 那么条件WHERE为真
例:查询tb_bihu表中 age 为 17、18、19 岁的人:
SELECT * FROM tb_bihu WHERE age IN (17,18,19);
那么可选关键字 NOT 是代表 可以查询字段不在集合汇总的全部记录数据:
例:查询tb_bihu表中 age 不为 17、18、19 岁的人:
SELECT * FROM tb_bihu WHERE age NOT IN (17,18,19);
即除了 17 、 18 、 19 岁的人 其他都打印出来了。 即:带 NOT关键字的是相反的.
2.3 带BETWEEN AND 关键字的查询
BETWEEN AND 关键字用于判断某个字段的值书都在指定的范围之内,如果在的话 就满足,在范围内的数据都会被查询出来,如果不在的话 就不会被查询出来。
语法格式:
SELECT … WHERE 字段名 [ NOT ] BETWEEN 值1 AND 值2
值1代表范围条件的起始值,值2代表范围条件的结束值,NOT是可选的,意思是查询不在这个范围内的所有记录(反之)。 但是要注意 值1 大于 值2 的话 是会查询不到记录的!
例: 查询id 从2 – 5 之间的记录条件:
SELECT * FROM tb_bihu WHERE id BETWEEN 2 AND 5;
2 hjy 0 19
3 zhangsan 1 20
4 shabi 1 22
5 wolong 1 20
如果你写个带NOT的:
SELECT * FROM tb_bihu WHERE id NOT BETWEEN 2 AND 5;
其他自己测试。
2.4 空值查询
在数据表中,某些列的值可能为空值 (NULL) ,空值不是0 啊 也不是空字符串啊!
在MYSQl中 用 IS NULL 关键字来判断字段的值是否为空值,语法格式:
SELECT … WHERE 字段名 IS [NOT] NULL
NOT是可选的 带上 NOT的话 那么判断的就是不是空值的字段
例:查询tb_bihu这个表中 字段sex 的值 为NULL的记录:
SELECT * FROM tb_bihu WHERE sex IS NULL;
那么不是查询 sex 字段不为空的记录:
SELECT * FROM tb_bihu WHERE sex IS NOT NULL;
记住 这个 NOT 要放 IS 和 NULL 的中间 记住即可!
2.5 带DISTINCT关键字的查询
很多表中存在某些字段重复的值,那么过滤掉这些值,只显示一条,我们可以这样:
语法格式:
SELECT DISTINCT 字段名 FROM 表名;
例: 在tb_bihu这个表中查询 sex 性别 值 ,但 查询结果不重复:
SELECT DISTINCT sex FROM tb_bihu ;
不仅如此 我们还可以查询多个字段不重复 甚至可以 全部(*):
注意: 这里多个字段不重复是指 多个字段都一样时才只会显示一个!
例: 在tb_bihu这个表中查询 sex 和 age 的值 ,但 查询结果不重复:
SELECT DISTINCT sex, age FROM tb_bihu;
2.6 带LIKE关键字的查询(配合 通配符)
使用关键字 = 号 可以判断两个字符串是否相等 但有时候要对字符串进行模糊查询,那么LIKE关键字就上场了,LIKE关键字能判断两个字符串是否相匹配,语法格式如下:
SELECT … WHERE 字段名 [ NOT ] LIKE ‘匹配字符串’;
其中:
NOT 是可选的 表示寻找那些 字段的值 不喝 匹配字符串一致的 记录.
例: 在tb_bihu表的 age 年龄 为 20岁的全部人记录:
SELECT * FROM tb_bihu WHERE age LIKE '20';
例: 在tb_bihu表的 age 年龄 不为 20岁的全部人记录:
SELECT * FROM tb_bihu WHERE age NOT LIKE '20';
所以 LIKE不仅用于 字符串 也可以其他的类型 但是还是用于字符串比较合适!!
通配符 LIKE 搭配 通配符查询:
1) 百分号 % 通配符
匹配任意长度的字符串、包括空字符串(长度0)。 例如: “c%” 会匹配出 c c1 cc 反正就是c开头
例:在tb_bihu表的 name 名字 以 h开头的全部记录:
SELECT * FROM tb_bihu WHERE name LIKE 'h%';
例2:在tb_bihu表的 name 名字 以 h开头 以y 结尾 的全部记录:
SELECT * FROM tb_bihu WHERE name LIKE 'h%y';
例3:在tb_bihu表的 name 名字 包含 y 的全部记录:
SELECT * FROM tb_bihu WHERE name LIKE '%y%';
2) 下划线 _ 通配符
下划线通配符 和 百分号通配符不同,下划线通配符只匹配单个字符,要匹配多个字符要多个下划线,而且下划线通配符一定存在一个字符。
例: 查询tb_bihu表中name字段,以h开头y结尾 但是之间一定只有一个字符的记录:
SELECT * FROM tb_bihu WHERE name LIKE 'h_y';
多学一招:
因为通配符 % 和 _ 是字符 , 如果在查询中要用的到百分号 或 下划线 ,那么我们用转义字符: \% 和 \_ 进行转义即可。
例如: 查询tb_bihu这个表中 name字段带有%号的记录:
SELECT * FROM tb_bihu WHERE name LIKE '%\%%';
其他自己测试即可。
2.7 带 AND 关键字的多条件查询语句
在查询数据时 为了让查询更准确,这里添加了多条件查询 ,那就是AND关键字了:
他可以连接两个及以上条件的联合查询,只有都满足的结果才能被返回。
语法格式:
SELECT … WHERE 条件表达式1 AND 条件表达式2 [… AND 条件表达式n ];
冲上面的语法可知: 有很多个条件表达式 每个条件表达式用AND分隔开。
例:查询tb_bihu表中 id 小于5 且 是男孩子的记录:
SELECT * FROM tb_bihu WHERE id < 5 AND sex = 1;
这里的1值得是男孩子 0 指的是女孩子。
例2:查询tb_bihu表中 id 是 1,2,4,6之一且性别是女且名字是以h开头y结尾的记录:
SELECT * FROM tb_bihu WHERE id IN (1,2,4,6) AND sex = 0 AND name LIKE 'h%y';
2.8 带OR关键字的多条件查询
OR 一样可以用于多条件查询 但是和AND不一样,OR 是 满足其中一条就被查询出来:
语法格式:
SELECT … WHERE 条件表达式1 OR条件表达式2 [… OR条件表达式n ];
例: 查询tb_bihu这个表中,年龄小于20岁 或 是性别是男的人:
SELECT * FROM tb_bihu WHERE age < 20 OR sex = 1;
多学一招:
OR 和 AND 关键字可以在一起用,但是有个优先级的问题需要解决:
AND 的优先级明显是比 OR 高的! 所以两者在一起用的时候 ,会先运行算 AND ,再运算OR表达式。
例:在yb_bihu表中查询 性别女或者性别为男且年龄为19岁的人:
SELECT * FROM tb_bihu WHERE sex = 0 OR sex = 1 AND age = 19;
所以呢 他查询的结果是:
- 性别是女的
- 性别是男的且年龄是19的!