0. README
友情提示: 点开上面的加号, 即可查看本文的行文思路结构.
本篇文章主要总结SELECT语句的具体用法, 包含条件查询, 顺序查询, 分组查询, 结合聚集函数的查询, 多表查询.
一. 单表查询
与查询数据(select)相关的查询语句:
SHOW TABLES [FROM database_name]; -- 查看数据库中的所有表
SELECT * FROM table_name; -- 查看一个表中的所有记录数 (*代表表中所有的列名)
1. 条件查询
格式:
SELECT 列名 FROM 表名 [WHERE 条件表达式];
条件表达式中常用的符号
< > <= >= = <> (不等于)
WHERE子句中相关关键字的用法:
in(范围内取内容)
not in
示例:
(准备阶段)假设已存在一个数据库mydb, 里面已创建一个表mytable, 表结构如下:
表内已插入6条记录:
-- in的用法
SELECT * FROM mytable WHERE id IN (1, 3, 4);
SELECT * FROM mytable WHERE id NOT IN (1, 3, 4);
执行结果:
like(模糊查询的关键字)
写法:
下划线和%区别:都是占位符, _只有一个字符, %可以有零个或多个字符.
%写法:
like ‘%李’; 结果: XXX李
like ‘李%’; 结果: 李XXX
like ‘%李%’; 结果: 只要有李就行
示例:
-- 查询username中含有'a'的元组(即一行)
SELECT * FROM mytable WHERE username LIKE '%a%';
执行结果:
as
可以使用别名:使用as设置别名, 并且as可以省略
示例:
-- as设置别名, 也可以省略, 两种情况得到同样的结果
SELECT id AS 'ID' FROM mytable;
SELECT id 'ID' FROM mytable;
执行结果:
其它重要关键字:
is null – 判断是否为null
and – 并且
or – 或者
not – 不成立
2. 顺序查询
- 排序, 使用order by, 升序为默认的(asc)/降序(desc)
- 同时出现select的语句最末尾
-- 按id升序排列信息, 两种情况得到同样的结果
SELECT * FROM mytable ORDER BY id;
SELECT * FROM mytable ORDER BY id ASC;
执行结果:
3. 分组查询
格式:
SELECT * FROM 表名 [group by 列名 having 条件表达式];
4. 结合聚集函数的查询
count 获取数量
sum 求和
avg 求平均数
max 最大值
min 最小值
示例:
SELECT MAX(id) FROM mytable
GROUP BY password;
执行结果:
完整的SELECT语句:
格式:
SELECT * FROM 表名 [WHERE 条件表达式]
[GROUP BY 列名 HAVING 条件表达式]
[ORDER BY ASC/DESC];
示例:
SELECT id, username, password, COUNT(*) FROM mytable
WHERE id > 1
GROUP BY password
HAVING password <> '111'
ORDER BY id;
执行结果:
二. 多表查询
1. 多表操作
- 首先重新提供数据, 有一个部门的表dept,还有一个员工表emp.
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(30)
);
CREATE TABLE emp(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20),
salary DOUBLE,
dno INT
);
INSERT INTO dept VALUES(NULL, '研发部');
INSERT INTO dept VALUES(NULL, '销售部');
INSERT INTO dept VALUES(NULL, '人事部');
INSERT INTO emp VALUES(NULL, '小王', 10000, 1);
INSERT INTO emp VALUES(NULL, '小李', 10000, 2);
INSERT INTO emp VALUES(NULL, '小凤', 10000, 3);
INSERT INTO emp VALUES(NULL, '东东', 800, NULL);
INSERT INTO emp VALUES(NULL, '波波', 1000, NULL);
之后, 表dept中所有数据如下:
表emp中所有数据如下:
外键约束
因为把研发部删除, 研发部下有人员, 该操作不合理。
所以, 引入外键约束, 作用是保证数据的完整性。
添加外键
语法:
ALTER TABLE 当前表名 ADD FOREIGN KEY 当前表名(dno) REFERENCES 关联的表(did);
给emp员工表添加外键:
ALTER TABLE emp ADD FOREIGN KEY emp(dno) REFERENCES dept(did);
查看emp表结构:
在介绍内连接, 外连接之前, 有必要了解一下笛卡尔积:
举个例子:
表A 表B
aid aname bid bname
a1 aa1 b1 bb1
a2 aa2 b2 bb2
b3 bb3
查询的语法
SELECT * FROM 表A, 表B;
返回的结果就是笛卡尔积, 表A中有两条记录, 表B中有三条记录, A和B的笛卡尔积中就有2*3=6条记录.
2. 内连接
普通内连接
前提条件:需要有外键的.
提交关键字 inner join … on + 条件
SELECT * FROM dept INNER JOIN emp ON dept.did = emp.dno;隐式内连接(用的是最多的)
可以不使用inner join … on关键字
SELECT * FROM dept,emp WHERE dept.did = emp.dno;
执行结果(两者相同):
3. 外连接
左外连接(看左表,把左表所有的数据全部查询出来)
前提条件:需要有外键的.
语法: 使用关键字 left [outer] join … on + 条件
SELECT * FROM dept LEFT OUTER JOIN emp ON dept.did = emp.dno;
执行结果:
右外连接(看右表,把右表所有的数据全部查询出来)
前提条件:需要有外键的。
语法: 使用关键字 right [outer] join … on
SELECT * FROM dept RIGHT JOIN emp ON dept.did = emp.dno;
执行结果:
三. 总结
个人博客主页
到此, 所有的内容就总结完了! 当然, 还有部分有关查询的关键词, 如ALL, DISTINCT等等, 自己也可以去看看它们的用法.
最后, 非常欢迎各位小伙伴评论和指点我的文章, 如果您觉得写得还不太差劲或者对您有一丁点的帮助, 麻烦动个小手点个赞, 好人萌萌哒, 也很感谢您耐心认真地看完!
本文写于 2017/05/14 20:42