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

来源:互联网 发布:淘宝多个客服怎么设置 编辑:程序博客网 时间:2024/06/09 18:18

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 mytableGROUP BY password;

执行结果:

结果.png

完整的SELECT语句:
格式:
SELECT * FROM 表名 [WHERE 条件表达式]
[GROUP BY 列名 HAVING 条件表达式]
[ORDER BY ASC/DESC];

示例:

SELECT id, username, password, COUNT(*) FROM mytable WHERE id > 1GROUP BY passwordHAVING 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
原创粉丝点击