基本
单字段查询
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 |
|
非等值连接
和等值连接基本一致,条件非等而已,条件取一定关系
连接规则由等号以外的运算符组成。>,=,<,,>=,<=,<>,!=,between等
案例
自连接
类似等值连接,两表有同意字段可当一张表使用
案例
外连接
用于查询主表中有 从表中没有的记录
1 |
|
左外连接
以左边的表为主,查询的数据包括左边表所有的数据以及左右表有交集的数据
还有左表不符合条件的记录,并在右表相应列中填NULL。
left [outer]可省
右外连接
以右边的表为主,查询的数据包括右边表所有的数据以及左右表有交集的数据
还有右表不符合条件的记录,并在左表相应列中填NULL。
right [outer]可省
全连接
AUB
查询出所有单身狗,单身女,和cp组
full [outer]可省
或者 union 左右 达到全外连接
1 |
|
自连接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,成为表的自身连接,也就是所谓的自连接。
**自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。
**
实例
普通查询
1 |
|
显然没有先行课的被忽略掉了,因此我们可以用左关联结合自连接来查询,便于观察。
自查询
1 |
|
交叉连接
就是用99标准的语法实现的笛卡尔乘积
cross
1 |
|
Note
on 和 where条件的区别如下
- on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
- where条件是在临时表生成好后,再对临时表进行过滤的条件。
而 inner join(内连接)没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
等值连接列名相同
- 使用等值连接
- 使用using