0. README
本篇文章主要总结SELECT语句的具体用法, 包含条件查询, 顺序查询, 分组查询, 结合聚集函数的查询, 多表查询.
本文行文思路结构
DQL(数据查询语言)
一. 单表查询
1. 条件查询
2. 顺序查询
3. 分组查询
4. 结合聚集函数的查询
二. 多表查询
1. 多表操作
2. 内连接
3. 外连接
三. 总结
一. 单表查询
与查询数据(select)相关的查询语句:
SHOW TABLES [FROM database_name]; -- 查看数据库中的所有表
SELECT * FROM table_name; -- 查看一个表中的所有记录数 (*代表表中所有的列名)
1. 条件查询
格式:
SELECT 列名 FROM 表名 [WHERE 条件表达式];
条件表达式中常用的符号
< > <= >= = <> (不等于)
WHERE子句中相关关键字的用法:
in(范围内取内容)
not in
示例:
(准备阶段)假设已存在一个数据库mydb, 里面已创建一个表mytable, 表结构如下:
表内已插入6条记录:
原始表中数据.png-- in的用法
SELECT * FROM mytable WHERE id IN (1, 3, 4);
SELECT * FROM mytable WHERE id NOT IN (1, 3, 4);
执行结果:
结果2.png
like(模糊查询的关键字)
写法:
下划线和%区别:都是占位符, _只有一个字符, %可以有零个或多个字符.
%写法:
like '%李'; 结果: XXX李
like '李%'; 结果: 李XXX
like '%李%'; 结果: 只要有李就行
示例:
-- 查询username中含有'a'的元组(即一行)
SELECT * FROM mytable WHERE username LIKE '%a%';
执行结果:
结果.pngas
可以使用别名:使用as设置别名, 并且as可以省略
示例:
-- as设置别名, 也可以省略, 两种情况得到同样的结果
SELECT id AS 'ID' FROM mytable;
SELECT id 'ID' FROM mytable;
执行结果:
结果.png其它重要关键字:
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;
执行结果:
结果.png3. 分组查询
格式:
SELECT * FROM 表名 [group by 列名 having 条件表达式];
4. 结合聚集函数的查询
count 获取数量
sum 求和
avg 求平均数
max 最大值
min 最小值
示例:
SELECT MAX(id) FROM mytable
GROUP BY password;
执行结果:
结果.png
完整的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;
执行结果:
结果.png二. 多表查询
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中所有数据如下:
表dept.png表dept中所有数据如下:
表emp.png外键约束
因为把研发部删除, 研发部下有人员, 该操作不合理。
所以, 引入外键约束, 作用是保证数据的完整性。
添加外键
语法:
ALTER TABLE 当前表名 ADD FOREIGN KEY 当前表名(dno) REFERENCES 关联的表(did);
给emp员工表添加外键:
ALTER TABLE emp ADD FOREIGN KEY emp(dno) REFERENCES dept(did);
查看emp表结构:
emp表结构.png在介绍内连接, 外连接之前, 有必要了解一下笛卡尔积:
举个例子:
表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条记录.
笛卡尔积.png2. 内连接
-
普通内连接
前提条件:需要有外键的.
提交关键字 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;
执行结果(两者相同):
内连接.png3. 外连接
-
左外连接(看左表,把左表所有的数据全部查询出来)
前提条件:需要有外键的.
语法: 使用关键字 left [outer] join ... on + 条件
SELECT * FROM dept LEFT OUTER JOIN emp ON dept.did = emp.dno;
执行结果:
左外连接.png -
右外连接(看右表,把右表所有的数据全部查询出来)
前提条件:需要有外键的。
语法: 使用关键字 right [outer] join ... on
SELECT * FROM dept RIGHT JOIN emp ON dept.did = emp.dno;
执行结果:
三. 总结
个人博客主页
到此, 所有的内容就总结完了! 当然, 还有部分有关查询的关键词, 如ALL, DISTINCT等等, 自己也可以去看看它们的用法.
最后, 非常欢迎各位小伙伴评论和指点我的文章, 如果您觉得写得还不太差劲或者对您有一丁点的帮助, 麻烦动个小手点个赞, 好人萌萌哒, 也很感谢您耐心认真地看完!
本文写于 2017/05/14 20:42
网友评论