更新于:

查无此人

基本

单字段查询

SELECT first_name FROM user;

多字段查询

SELECT first_name,gender,class_id... FROM user;

全字段查询

不可定义顺序 且性能不友好

SELECT * FROM user;

条件

条件运算符

< > = != <>(官方推荐的不等于) >= <=

SELECT name_id FROM user WHERE age>=18; 年龄大于等于18

SELECT name_id FROM user WHERE age<>18; 年龄不等于18

逻辑运算符

&& || ! and or not

SELECT name_id FROM user WHERE (age>=18 AND age<=65) OR salary>=20000; 年龄18-65,或者工资大于2w

模糊条件

  • like : 模糊匹配 %任意字符可零 _单个字符
  • between and : 查询区间范围 包含区间值
  • in : 查询等于列表的值 不支持模糊匹配
  • <=> : 安全等于
  • is null : 不能判断 age=null 只能 age IS NULL 或者 age <=> null
  • is not null

SELECT name_id FROM user WHERE full_name LIKE '_柒%'; 全名第二个字是柒,其它随意

SELECT name_id FROM user WHERE age BETWEEN 18 AND 65; 年龄18-65

SELECT name_id FROM user WHERE age IN (18,20,22); 年龄18,20,22

排序

order by 字段(可使用别名) DESC|ASC

DESC 降序

ASC 升序(默认可不写)

单个排序

SELECT *,salary(IFNULL(salary,0)) AS 年薪 FROM user WHERE age >= 18 ORDER BY 年薪 DESC;

多个排序

SELECT *,salary(IFNULL(salary,0)) AS 年薪 FROM user WHERE age >= 18 ORDER BY 年薪 DESC,age ASC;

连接查询

sql-92 标准: 仅支持内连接

sql-99 标准: 内连接+外连接(左外,右外,全外)+交叉连接

  • 内连接 A∩B
  • 左外连接 A∩B∪A A为主表
  • 右外连接 A∩B∪B B为主表
  • 全外连接 A∪B

内连接

等值连接

两张表意义一样的字段,以此建立等值连接

  • 两张表的交集
  • n表等值连接至少需要n-1个连接条件
  • n表顺序没有要求
  • 一般需要取别名

等值

简单使用

例: 查询用户对应的全部订单号
SELECT custom_name,buy_id FORM customs,buys WHERE customs.buy_id = buys.id

表取别名

  • 提高语句简洁度

  • 区分多个重名字段

  • 如果取别名则不可使用源表名

案例

例: 查询每个街道对应的区市省

1
2
3
4
5
SELECT p.name 省,ci.name 市,co.name 县,t.name 街道
FROM town t,country co,city ci,province p
WHERE t.country_id = co.country_id
AND co.city_id = ci.city_id
AND ci.province_id = p.province_id LIMIT 20;

image-20220915012218116

image-20220917173224113

image-20220917174310923
image-20220917174350065

非等值连接

和等值连接基本一致,条件非等而已,条件取一定关系

连接规则由等号以外的运算符组成。>,=,<,,>=,<=,<>,!=,between等

案例

image-20220917110058189

image-20220917110139950

自连接

类似等值连接,两表有同意字段可当一张表使用

案例

image-20220917110803764

image-20220917174956812

image-20220917110829339

外连接

用于查询主表中有 从表中没有的记录

1
2
3
4
5
6
7
8
9
select 查询列表 
from 表1 别名
[连接类型]
join 表2 别名
on 连接条件
[where筛选条件]
[group by. 分组]
[having筛选条件]
[order by排序列表]

左外连接

以左边的表为主,查询的数据包括左边表所有的数据以及左右表有交集的数据

还有左表不符合条件的记录,并在右表相应列中填NULL。

left [outer]可省

image-20220917235023941

右外连接

以右边的表为主,查询的数据包括右边表所有的数据以及左右表有交集的数据

还有右表不符合条件的记录,并在左表相应列中填NULL。

right [outer]可省

image-20220917235042346

全连接

AUB

查询出所有单身狗,单身女,和cp组

full [outer]可省

或者 union 左右 达到全外连接

1
2
(SELECT * FROM user1 t1) UNION (SELECT * FROM user1_copy t2); -- 注:union会对相同的结果进行去重
(SELECT * FROM user1 t1) UNION ALL (SELECT * FROM user1_copy t2); -- 注:union all则查询的是两边全部的数据,不会对数据进行去重

自连接

连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,成为表的自身连接,也就是所谓的自连接。

**自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。
**

实例

image-20220917235628971

普通查询

1
2
3
SELECT a.*,b.name
FROM SUBJECT a , SUBJECT b
WHERE a.`pno`=b.`cno`;

image-20220917235859586

显然没有先行课的被忽略掉了,因此我们可以用左关联结合自连接来查询,便于观察。

自查询

1
2
3
SELECT a.*,b.name
FROM SUBJECT a LEFT JOIN SUBJECT b
ON a.`pno`=b.`cno`;

image-20220918000033802

交叉连接

就是用99标准的语法实现的笛卡尔乘积

cross

1
2
3
4
SELECT b.* ,bo.*
FROM beauty b
CROSS JOIN boys bo
ON bo.id=b.boyfriend_id;

Note

on 和 where条件的区别如下

  1. on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
  2. where条件是在临时表生成好后,再对临时表进行过滤的条件。

而 inner join(内连接)没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

等值连接列名相同

  • 使用等值连接
    image-20220918004830918
  • 使用using
    image-20220918004846289

本站由 钟意 使用 Stellar 1.25.0 主题创建。
又拍云 提供CDN加速/云存储服务
vercel 提供托管服务
湘ICP备2023019799号-1
总访问 次 | 本页访问