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

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, 表结构如下:

表结构.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

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

笛卡尔积.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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 1. select * from emp; 2. select empno, ename, job from em...
    海纳百川_4d26阅读 1,878评论 0 4
  • 多表查询有如下几种: 合并结果集;UNION、UNION ALL 连接查询 内连接[INNER] JOINON 外...
    Michael_林阅读 3,437评论 0 6
  • 查询是数据的一个重要操作。用户发送查询请求,经编译软件变异成二进制文件供服务器查询,后返回查询结果集给用户,查询会...
    产品小正阅读 1,358评论 0 2
  • 目录 简介 在Android中存储数据有时会用到数据库,Android给我们提供了 一系列的API来操作数据库,非...
    慕涵盛华阅读 996评论 1 2
  • 曾经,也只是曾经, 一个,多么熟悉的字眼, 但总能穿透一切, 触碰那颗柔软的心, 这就是她的魅力所在。 曾经,多少...
    园艺之人阅读 237评论 0 1