============================================================
一、数据库概述
数据库(DataBase,DB):
指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的
数据集合
。(文件系统)
数据库管理系统(DataBase Management System,DBMS):
指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统
访问数据库中的数据。(软件)
数据库软件应该为
数据库管理系统
,数据库是通过数据库管理系统创建和操作的。
数据库:存储、维护和管理数据的集合。
DB与DBMS的关系图如下;
常见数据库管理系统:
Oracle:目前比较成功的关系型数据库管理系统。运行稳定、功能齐全、性能超群、技术领先。主要应用在大型的企业数据库领域。
DB2:IBM的产品。(大笨象数据库:伸缩性比较强,大小企业均适用)
SQL Server:Microsoft的产品。软件界面友好、易学易用,在操作性和交互性方面独树一帜。(收费软件)
PostgreSQL:加州大学伯克利分校以教学目的开发的数据库系统,支持关系和面向对象的数据库,属于*数据库管理系统。
MySQL:免费的数据库系统。被广泛用于中小型应用系统。体积小、速度快、总体拥有成本低、开放源代码。2008年被SUN收购,2009年SUN被Oracle收购。(短小精悍)
============================================================
二、数据库的安装与配置
*
安装
*
参照图解
*
一路下一步
*
配置
*
参照图解
*
到
选择字符集
时停(选UTF-8)
* 配置环境变量
* 若安装的时候没有选择把mysql设置到环境变量path中,则需要手动配置环境变量
* MySQL默认安装在C:\Program Files下。
1)新建 MYSQL_HOME 变量,并配置:C:\Program Files\MySQL\MySQL Server 8.0
2)编辑 Path 系统变量,将 %MYSQL_HOME%\bin 添加到path变量后
*
登录Mysql
*
mysql -u 用户名 -p 回车后输入密码
例如:
mysql -u root -p abc
* 或者 mysql -h 127.0.0.1 -u root -p
或者 mysql
-h localhost -u root -p
*
卸载
1.
停止mysql服务 net stop mysql 启动mysql服务 net start mysql
2.添加删除程序中卸载mysql
3.
找到mysql安装目录下的 my.ini文件中 datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/" 手动删除ProgramData目录下的Mysql文件夹(注意:ProgramData是隐藏文件)
*
修改密码
*
修改mysql root用户密码
1)
停止mysql服务 在cmd运行输入services.msc 停止mysql服务
或者 cmd --> net stop mysql
2)
在cmd下 输入 mysqld
--skip-grant-tables
启动服务器 光标不动 (不要关闭该窗口)
3)
新打开cmd 输入mysql -u root -p 不需要密码进入
use mysql;
update user set password=password('abc') WHERE User='root';
4)
关闭两个cmd窗口,并在任务管理器结束 mysqld 进程
5)
在服务管理页面 重启mysql 服务
密码修改完成。
数据库中一行(一条)记录与对象之间的关系图:
列:字段
行:一条记录(一个实体或一个对象)
Java
代码访问数据库,就会把数据一行一行的取出来,放在一个一个Java对象里面去,再把Java对象放在一个集合里面去,再去遍历集合。
public class User{
private int id;
private String name;
private int age;
}
============================================================
三、SQL概述
SQL
:Structure Query Language。(结构化查询语言)
SQL
被美国国家标准局(
ANSI
)确定为关系型数据库语言的
美国标准
,后来被国际化标准组织(
ISO
)采纳为关系数据库语言的
国际标准
。
各数据库厂商都支持ISO的SQL标准。(普通话)
各数据库厂商在标准的基础上做了自己的扩展。(方言)
语言的发展流程:机器语言 --> 汇编语言 --> 高级语言 --> 数据库编程语言 --> 语音识别 --> 脑电波
============================================================
四、SQL的分类
DDL
(
Data Definition Language
)
:数据定义语言,用来
定义数据库对象
:库、表、列等;对对象进行操作。
重要
常用关键字:CREATE
、ALTER、DROP
(create创建、alter修改、drop删除)
DML
(Data Manipulation Language):数据操作语言,用来操作数据库表中的记录(数据);十分重要
常用关键字:INSERT
、UPDATE、DELETE
(insert插入、update更新、delete删除)
insert into
表名(列名1,列名2,
...) values(
值1,值2,
…);
update
表名 set
列名1=值,列名2=值,
… where
列名=值;
delete fro
m
表名 where
列名=值;
DCL
(
Data Control Language
)
:数据控制语言,用来
定义访问权限和安全级别
;
本课程不涉及
DQL
(
Data
Query
Languag
e
)
:数据
查询
语言,用来查询记录(数据)。超级
重要
SELECT
(
select
xxx
from
xxx
where
xxx
group by
xxx
having
xxx
order by
xxx
limit
xxx
)
where
使用到的关键字
:
= != <> < > >= <=
in
、
between
xxx
and
xxx、
is
full
、is
not full
、and、or、not
通配符: _
、%
例如:like
‘%
张
%’ like ‘
张_
’ like ‘
张%
’
注意:sql语句以
;
结尾
-----------------------------------------------------------------------------
4.1 DDL:操作数据库、表、列等
常用关键字:CREATE、ALTER、DROP(create创建、alter修改、drop删除)(字体蓝色加粗表示关键字)
4.1.1操作数据库
创建:
创建一个名称为mydb1的数据库
create database
mydb1;
创建一个使用gbk字符集的mydb2数据库
create database
mydb2
character set
gbk;
创建一个使用gbk字符集,并带校对规则的mydb3数据库
create database
mydb3
character set
gbk
collate
gbk_chinese_ci;
查看:
查看当前数据库服务器中的所有数据库
show databases
;
查看前面创建的mydb2数据库的定义信息
show create database
mydb2;
列出可用的字符集
show character set
;
修改:
把服务器中的数据库mydb2的字符集修改为utf8
alter database
mydb2
character set
utf8;
删除:
删除前面创建的mydb3数据库
drop database
mydb3
;
其他:
查看当前使用的数据库
select
database()
;
切换数据库
use
mydb2;
4.1.2操作数据表、列
语法:
create table
表名(
字段1 字段类型,
字段2 字段类型,
......
字段n 字段类型
);
常用数据类型:
int
:整型
double
:浮点型,例如:double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
char
:固定长度字符串类型; char(10)
'abc '
不常用,但效率高
varchar
:可变长度字符串类型;varchar(10)
'abc'
常用这个
text
:字符串类型;大数据量类型。
blob
:字节类型;
适合存:图片、音频、视频等
date
:日期类型,格式为:yyyy-MM-dd
time
:时间类型,格式为:hh:mm:ss
timestamp
:时间戳类型 yyyy-MM-dd hh:mm:ss
会自动赋值
datetime:
日期时间类型 yyyy-MM-dd hh:mm:ss
查看当前数据库中的所有表
show
tables
;
查看表的字段信息
desc
表名;
例如:
desc emp
;
在上面员工表的基本上增加一个名称为image的列
alter table
emp
add
image blob; add 增加
column
列,可以不用写,默认就是列(
注意:
查看表的时候是以行的形式展现的
)
修改员工表的job列,使其长度为60
alter table
emp
modify
job varchar(60);
modify 修改
删除员工表中的image列,一次只能删一列
alter table
emp
drop
image;
将表名改为user
rename table
emp to user;
查看表格的创建细节
show create table
user;
show create table
user
\G
查看并格式化
修改表的字符集为gbk
alter table
user
character set
gbk;
列名name修改为username
alter table
user
change
name username varchar(100);
删除表
drop table
user;
-----------------------------------------------------------------------------
4.2 DML:操作数据库表中的记录(数据)(重要)
查询表中的所有数据
select
*
from
表名;
DML
是对
表中的数据
进行增、删、改的操作。不要与DDL混淆了。
小知识:
在mysql中,字符串类型和日期类型都要用单引号括起来。'tom' 和 '2015-09-04'
空值:null
4.2.1
插入操作
语法:
INSERT INTO
表名(列名1,列名2,...)
VALUES
(列值1,列值2,...);
注意:
列名与列值的类型、个数、顺序要一一对应。
可以把列名当做java中的形参,把列值当做实参。
值不要超出列定义的长度。
如果插入空值,请使用null。
插入的日期和字符一样,都使用单引号括起来。
练习:
create table
emp(
id int,
name varchar(100),
gender varchar(10),
birthday date,
salary float(10,2),
entry_date date,
resume text
);
分别插入:
INSERT INTO
emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES
(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');
INSERT INTO
emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES
(2,'lisi','male','1995-5-10',10000,'2015-5-5','good boy');
INSERT INTO
emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES
(3,'wangwu','male','1995-5-10',10000,'2015-5-5','good boy');
批量插入:
INSERT INTO
emp
VALUES
(4,'zs','m','2015-09-01',10000,'2015-09-01',NULL),
(5,'li','m','2015-09-01',10000,'2015-09-01',NULL),
(6,'ww','m','2015-09-01',10000,'2015-09-01',NULL);
4.2.2 修改(更新)操作
语法:UPDATE 表名 SET 列名1=列值1,列名2=列值2,...... WHERE 列名=值;
练习:
将所有员工薪水修改为5000元
UPDATE emp SET salary=5000;
将姓名为'zs'的员工薪水修改为3000元
UPDATE emp SET salary=3000 WHERE name=’ zhangsan’;
将姓名为'lisi'的员工薪水修改为4000元,gender改为female
UPDATE emp SET salary=4000,gender='female' WHERE name='lisi';
将性别为'male'的薪水在原有基础上增加1000元
UPDATE emp SET salary=salary+1000 WHERE gender='male';
4.2.3 删除操作
语法 :
DELETE FROM
表名
WHERE
列名=值;
练习 :
删除表中名称为'zs'的记录
DELETE FROM
emp
WHERE
name=‘zs’;
删除表中所有记录
DELETE FROM
emp;
使用truncate删除表中记录
TRUNCATE TABLE
emp;
DELETE
删除表中的数据,表结构还在;删除后的数据可以找回。(根据日志文件可以恢复数据)
TRUNCATE
删除是把表直接DROP掉,然后再创建一个同样的新表。
删除的数据不能找回。执行速度比DELETE快。
-----------------------------------------------------------------------------
4.3 DQL操作:查询记录
DQL
数据查询语言(重要)
数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
查询返回的结果集是一张虚拟表。
查询关键字:
SELECT
语法:
SELECT
列名
FROM
表名;
WHERE
-->
GROUP BY
-->
HAVING
-->
ORDER BY
语法:
SELECT
selection_list /*
要查询的列名称*/
FROM table_list /*
要查询的表名称*/
WHERE condition /*
行条件*/
GROUP BY
grouping_columns
/*
对结果分组*/
HAVING condition /*
分组后的行条件*/
ORDER BY sorting_columns /*
对结果分组*/
LIMIT
offset_start, row_count
/*
结果限定*/
-
学生表:stu
字段名称
|
字段类型
|
说明
|
sid
|
char(6)
|
学生学号
|
sname
|
varchar(50)
|
学生姓名
|
age
|
int
|
学生年龄
|
gender
|
varchar(50)
|
学生性别
|
CREATE TABLE stu (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50)
);
|
||
INSERT INTO
stu
VALUES
('S_1001', 'liuYi', 35, 'male');
INSERT INTO
stu
VALUES
('S_1002', 'chenEr', 15, 'female');
INSERT INTO
stu
VALUES
('S_1003', 'zhangSan', 95, 'male');
INSERT INTO
stu
VALUES
('S_1004', 'liSi', 65, 'female');
INSERT INTO
stu
VALUES
('S_1005', 'wangWu', 55, 'male');
INSERT INTO
stu
VALUES
('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO
stu
VALUES
('S_1007', 'sunQi', 25, 'male');
INSERT INTO
stu
VALUES
('S_1008', 'zhouBa', 45, 'female');
INSERT INTO
stu
VALUES
('S_1009', 'wuJiu', 85, 'male');
INSERT INTO
stu
VALUES
('S_1010', 'zhengShi', 5, 'female');
INSERT INTO
stu
VALUES
('S_1011', 'xxx', NULL, NULL);
|
-
雇员表:emp
字段名称
|
字段类型
|
说明
|
empno
|
int
|
员工编号
|
ename
|
varchar(50)
|
员工姓名
|
job
|
varchar(50)
|
员工工作
|
mgr
|
int
|
领导编号
|
hiredate
|
date
|
入职日期
|
sal
|
decimal(7,2)
|
月薪
|
comm
|
decimal(7,2)
|
奖金
|
deptno
|
int
|
部分编号
|
CREATE TABLE emp (
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm decimal(7,2),
deptno INT
);
|
INSERT INTO
emp
VALUES
(7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, NULL, 20);
INSERT INTO emp VALUES(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
INSERT INTO emp VALUES(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
INSERT INTO emp VALUES(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, NULL,20);
INSERT INTO emp VALUES(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400,30);
INSERT INTO emp VALUES(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, NULL,30);
INSERT INTO emp VALUES(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, NULL,10);
INSERT INTO emp VALUES(7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, NULL,20);
INSERT INTO emp VALUES(7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL,10);
INSERT INTO emp VALUES(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0,30);
INSERT INTO emp VALUES(7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, NULL, 20);
INSERT INTO emp VALUES(7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, NULL, 30);
INSERT INTO emp VALUES(7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, NULL, 20);
INSERT INTO emp VALUES(7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, NULL,10);
|
-
部分表:dept
字段名称
|
字段类型
|
说明
|
deptno
|
int
|
部分编码
|
dname
|
varchar(50)
|
部分名称
|
loc
|
varchar(50)
|
部分所在地点
|
CREATE TABLE dept(
deptno INT,
dname varchar(14),
loc varchar(13)
);
|
INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept VALUES(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept VALUES(30, 'SALES', 'CHICAGO');
INSERT INTO dept VALUES(40, 'OPERATIONS', 'BOSTON');
|
1 基础查询
1.1 查询所有列
SELECT
*
FROM
stu;
1.2 查询指定列
SELECT
sid, sname, age
FROM
stu;
2 条件查询
2.1 条件查询介绍
条件查询就是在查询时给出
WHERE
子句,在
WHERE
子句中可以使用如下运算符及关键字:
=
、
!=
、<>、
<
、<=、>、>=
BETWEEN
...
AND
;
IN
(
set
)
;
NOT IN
(set);
可以有多个值,用逗号隔开
IS NULL
、IS NOT NULL
AND;
OR;
NOT
;
2.2 查询性别为女,并且年龄50的记录
SELECT
*
FROM
stu
WHERE
gender='female'
AND
age=50;
2.3 查询学号为S_1001,或者姓名为liSi的记录
SELECT
*
FROM
stu
WHERE
sid ='S_1001'
OR
sname='liSi';
2.4 查询学号为S_1001,S_1002,S_1003的记录
SELECT
*
FROM
stu
WHERE
sid
IN
(
'S_1001','S_1002','S_1003'
)
;
2.5 查询学号不是S_1001,S_1002,S_1003的记录
SELECT
*
FROM
stu
WHERE
sid
NOT IN
(
'S_1001','S_1002','S_1003'
)
;
2.6 查询年龄为null的记录
SELECT
*
FROM
stu
WHERE
age
IS NULL
;
2.7 查询年龄在20到40之间的学生记录
SELECT
*
FROM
stu
WHERE
age>=20
AND
age<=40;
SELECT
*
FROM
stu
WHERE
age
BETWEEN
20
AND
40;
2.8 查询性别非男的学生记录
SELECT
*
FROM
stu
WHERE
gender!='male';
SELECT
*
FROM
stu
WHERE
gender<>'male';
SELECT
*
FROM
stu
WHERE
NOT
gender='male';
2.9 查询姓名不为null的学生记录
SELECT
*
FROM
stu
WHERE
sname
IS NOT NULL
;
SELECT
*
FROM
stu
WHERE
NOT
sname
IS NULL
;
3 模糊查询
当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字LIKE。
通配符:
_:
任意一个字符
%:
任意0~n个字符
例如: '
%
张%' 小张、张、张三、小张三、小小张、小小张三丰
'
张_' 张三、张四
'
张%' 张、张三、张三丰、张三小丰
3.1 查询姓名由5个字母构成的学生记录
SELECT
*
FROM
stu
WHERE
sname
LIKE
'_____';
模糊查询必须使用LIKE关键字。其中 “_”匹配任意一个字母,5个“_”表示5个任意字母。
3.2 查询姓名由5个字母构成,并且第5个字母为
“
i
”
的学生记录
SELECT
*
FROM
stu
WHERE
sname
LIKE
'____i';
3.3 查询姓名以
“
z
”
开头的学生记录
SELECT
*
FROM
stu
WHERE
sname
LIKE
'z%';
其中“%”匹配0~n个任何字母。
3.4 查询姓名中第2个字母为
“
i
”
的学生记录
SELECT
*
FROM
stu
WHERE
sname
LIKE
'_i%';
3.5 查询姓名中包含
“
a
”
字母的学生记录
SELECT
*
FROM
stu
WHERE
sname
LIKE
'%a%';
4 字段控制查询
4.1 去除重复记录
去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如emp表中sal字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用
DISTINCT
SELECT DISTINCT
sal
FROM
emp;
SELECT DISTINCT
sal,mgr
FROM
emp;
4.2 查看雇员的月薪与佣金之和
因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有一个字段不是数值类型,那么会出错。
SELECT
*,sal+comm
FROM
emp;
comm
列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面使用了把
NULL转换成数值0的函数
IFNULL
:
SELECT *,sal+IFNULL(comm,0) FROM emp;
4.3 给列名添加别名
在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total,
SELECT
*,sal+
IFNULL
(
comm,0
)
AS
total
FROM
emp;
给列起别名时,是可以省略AS关键字的。
SELECT
*,sal+
IFNULL
(
comm,0
)
total
FROM
emp;
SELECT
sname
姓名,
gender
性别
FROM stu; (AS
均可以省略,
空格
就相当于
AS
)
5 排序
order by
列名
asc
(默认升序,可以不用写) 、
desc
(降序)
5.1 查询所有学生记录,按年龄升序排序
SELECT
*
FROM
stu
ORDER BY
sage
ASC
;
SELECT
*
FROM
stu
ORDER BY
sage;
5.2 查询所有学生记录,按年龄降序排序
SELECT
*
FROM
stu
ORDER BY
age
DESC
;
5.3 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
SELECT
*
FROM
emp
ORDER BY
sal
DESC
,empno
ASC
;
6 聚合函数查询
sum avg max min count
聚合函数是用来做纵向运算的函数:
COUNT():
统计指定列中不为NULL的记录行数;
MAX():
计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序(即字典顺序)运算;
MIN():
计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序(即字典顺序)运算;
SUM():
计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():
计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
6.1 COUNT()
当需要
纵向统计
时可以使用
COUNT()
。
查询emp表中记录数并改名
SELECT
COUNT
(
*
)
AS
cnt
FROM
emp;
特别注意:
COUNT(*)
计数所有列也即计数所有行
查询emp表中有佣金的人数并改名:
SELECT
COUNT
(
comm
)
cnt
FROM
emp;
注意,因为
count()
函数中给出的是comm列,那么只统计comm列非NULL的行数。
查询emp表中月薪大于2500的人数(既有月薪且满足某一条件的人数)
SELECT
COUNT
(
*
)
FROM
emp
WHERE
sal > 2500;
查询月薪与佣金之和大于2500元的人数
SELECT
COUNT
(
*
)
AS
cnt
FROM
emp
WHERE
(sal+
IFNULL
(
comm,0
)
) > 2500;
查询有佣金的人数,和有领导的人数
SELECT
COUNT
(
comm
)
,
COUNT
(
mgr
)
FROM
emp;
查询有佣金的人数且有领导的人数
SELECT
COUNT(
*
)
FROM
emp
WHERE
comm
IS NOT NULL AND
mgr
IS NOT NULL
;
6.2
SUM()
和
AVG()
当需要
纵向求和
时使用
sum()
函数。
查询所有雇员月薪和
SELECT
SUM(
sal
)
FROM
emp;
查询所有雇员月薪和,和所有雇员佣金和
SELECT
SUM(
sal
)
,
SUM(
comm
)
FROM
emp;
查询所有雇员(月薪+佣金)的和
SELECT
SUM(
sal+
IFNULL(
comm,0
)
)
FROM
emp;
SELECT
SUM(
sal
)+ SUM(
comm
)
FROM
emp;
统计所有员工平均工资
SELECT
AVG(
sal
)
FROM
emp;
6.3
MAX()
和
MIN()
查询最高工资和最低工资
SELECT
MAX(
sal
)
,
MIN(
sal
)
FROM
emp;
7 分组查询
排序语法:select
xxx
from
xxx
where
xxx
order by
xxx
当需要分组查询时需要使用
GROUP BY
子句,例如查询每个部门的工资和,这说明要使用部门来分组。
注:凡和聚合函数同时出现的列名,一定要写在group by 之后。
例如:查询stu中female与male的人数:
SELECT
COUNT(
*
)
FROM
stu
WHERE
gender
IS NOT NULL
GROUP BY
gender;
7.1 分组查询
查询 每个部门的部门编号和每个部门的 工资和:
SELECT
deptno
,
SUM(
sal
)
FROM
emp
GROUP BY
deptno;
凡和聚合函数同时出现的列名,一定要写在group by 之后。
查询 每个部门的部门编号以及每个部门的 人数:
SELECT
deptno,
COUNT(
*
)
FROM
emp
GROUP B
Y
deptno;
凡和聚合函数同时出现的列名,一定要写在group by 之后。
查询 每个部门的部门编号以及每个部门工资大于1500的 人数:
SELECT
deptno,
COUNT(
*
)
FROM
emp
WHERE
sal>1500
GROUP BY
deptno;
7.2
HAVING
子句
查询 工资总和大于9000的部门 编号以及工资和:
SELECT
deptno,
SUM(
sal
)
FROM
emp
GROUP BY
deptno
HAVING
SUM(
sal
)
>9000;
查询 工资大于1500,工资总和大于6000的部门 编号以及工资和,按工资总和降序排序
SELECT
deptno,
SUM(
sal
)
FROM
emp
WHERE
sal>1500
GROUP BY
deptno
HAVING
SUM(
sal
)
>6000
ORDER BY
sum(sal)
DESC
;
注:having与where的区别:
1
、having是对
分组后
的数据进行过滤。
where
是对
分组前
的数据进行过滤。
2
、having后面可以使用聚合函数(统计函数)。
where
后面不可以使用聚合函数(即使用基本数据)。
3、having是对分组后数据的约束。
where
是对
分组前
记录的条件,如果某行记录没有满足
where
子句的条件,那么这行记录不会参加分组。
8 LIMIT 方言
LIMIT
用来限定查询结果的起始行,以及总行数。即后面要学的
分页技术
。
8.1 查询5行记录,起始行从0开始,即从第一行开始
SELECT
*
FROM
emp
LIMIT
0, 5;
注意:起始行从0开始,即第一行开始!5表示要查询5行。
8.2 查询10行记录,起始行从3开始,即从第4行开始
SELECT
*
FROM
emp
LIMIT
3, 10;
8.3 分页查询
如果一页记录为10条,希望查看第3页记录应该怎么查呢?
-
第一页记录起始行为0,一共查询10行;
-
第二页记录起始行为10,一共查询10行;
-
第三页记录起始行为20,一共查询10行;
分页的思路:
SELECT
*
FROM
emp
LIMIT
0, 3; 第一页:从第1行开始,读3行
SELECT
*
FROM
emp
LIMIT
3
, 3; 第二页:从第4行开始,读3行
SELECT
*
FROM
emp
LIMIT
6
, 3; 第三页:从第7行开始,读3行
SELECT
*
FROM
emp
LIMIT
9
, 3; 第四页:从第10行开始,读3行
例如:
int currentPage = 1; // 当前页
int pageSize = 3; // 每页的条数
若当前页为1,则
LIMIT
0, 3; (0-1)*3=0
若当前页为2,则 LIMIT 3, 3; (2-1)*3=3
若当前页为3,则
LIMIT
6
, 3; (3-1)*3=6
若当前页为4,则 LIMIT 9, 3; (4-1)*3=9
......
所以:若当前页为currentPage,则 LIMIT (currentPage-1)*pageSize, pageSize;
......
8.3 查询代码的书写顺序和执行顺序
查询语句书写顺序:
select – from - where - group by - having - order by - limit
查询语句执行顺序:
from - where - group by - having - select - order by - limit
(MySQL中演示不了,Oracle中可以演示)