关闭

JDBC中常用的SQL总结02之SELECT语句用法详解

标签: MySQLSQLSELECT内连接外连接
299人阅读 评论(0) 收藏 举报
分类:

0. README

友情提示: 点开上面的加号, 即可查看本文的行文思路结构.
本篇文章主要总结SELECT语句的具体用法, 包含条件查询, 顺序查询, 分组查询, 结合聚集函数的查询, 多表查询.

一. 单表查询

与查询数据(select)相关的查询语句:

SHOW TABLES [FROM database_name]; -- 查看数据库中的所有表
SELECT * FROM table_name; -- 查看一个表中的所有记录数 (*代表表中所有的列名)

1. 条件查询

格式:
SELECT 列名 FROM 表名 [WHERE 条件表达式];

条件表达式中常用的符号
< > <= >= = <> (不等于)

WHERE子句中相关关键字的用法:
in(范围内取内容)
not in

示例:
(准备阶段)假设已存在一个数据库mydb, 里面已创建一个表mytable, 表结构如下:

表结构.png

表内已插入6条记录:

原始表中数据.png

-- in的用法
SELECT * FROM mytable WHERE id IN (1, 3, 4);
SELECT * FROM mytable WHERE id NOT IN (1, 3, 4);

执行结果:

结果1.png

结果2.png

like(模糊查询的关键字)
写法:
下划线和%区别:都是占位符, _只有一个字符, %可以有零个或多个字符.
%写法:
like ‘%李’; 结果: XXX李
like ‘李%’; 结果: 李XXX
like ‘%李%’; 结果: 只要有李就行

示例:

-- 查询username中含有'a'的元组(即一行)
SELECT * FROM mytable WHERE username LIKE '%a%';

执行结果:

结果.png

as
可以使用别名:使用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; 

执行结果:

结果.png

3. 分组查询

格式:
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

表emp中所有数据如下:

表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条记录.

笛卡尔积.png

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;

执行结果(两者相同):

内连接.png

3. 外连接

  • 左外连接(看左表,把左表所有的数据全部查询出来)
    前提条件:需要有外键的.
    语法: 使用关键字 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;
    执行结果:

右外连接.png

三. 总结

个人博客主页
到此, 所有的内容就总结完了! 当然, 还有部分有关查询的关键词, 如ALL, DISTINCT等等, 自己也可以去看看它们的用法.

最后, 非常欢迎各位小伙伴评论和指点我的文章, 如果您觉得写得还不太差劲或者对您有一丁点的帮助, 麻烦动个小手点个赞, 好人萌萌哒, 也很感谢您耐心认真地看完!

本文写于 2017/05/14 20:42

2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13120次
    • 积分:672
    • 等级:
    • 排名:千里之外
    • 原创:48篇
    • 转载:9篇
    • 译文:0篇
    • 评论:10条
    个人说明
    个人很喜欢的一句话, (摘自网络):
    时光荏苒,祝愿不要忘记曾经的初心

    本人现在是一名大二软件工程专业的学生, 每月会坚持更新, 本博客会总结, 整理, 分享个人学习的相关技术知识, 用来记录自己不断进步的历程, 当然内容会以Java为主线.

    虽然是技术博客, 但毕竟是人, 也有自己的情感, 所以, 有时也会分享一些有用的学习资源和一些学习经验和方法, 同时也会写一些其它方面上自己的感受和想法!

    或许我的博客不是写得非常好, 但每一篇文章绝对会用心写! 如果, 你发现有不足或者错误之处, 非常欢迎指出, 当然也欢迎各位小伙伴们来交流技术和学习感受.

    每天进步一点点, 共勉!
    博客专栏
    最新评论