day04_MySQL学习笔记_01

时间:2021-11-03 15:45:48

============================================================

一、数据库概述

数据库(DataBase,DB): 指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的 数据集合 。(文件系统)
 
数据库管理系统(DataBase Management System,DBMS): 指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统 访问数据库中的数据。(软件)
 
数据库软件应该为 数据库管理系统 ,数据库是通过数据库管理系统创建和操作的。
 
数据库:存储、维护和管理数据的集合。
 
DB与DBMS的关系图如下;
day04_MySQL学习笔记_01
 
常见数据库管理系统:
    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 服务
                             密码修改完成。
    数据库中一行(一条)记录与对象之间的关系图:
    day04_MySQL学习笔记_01
    
    列:字段
    行:一条记录(一个实体或一个对象)
        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 andornot
    通配符: _ 、%      例如:like ‘% %’     like ‘ 张_ ’        like ‘ 张%
注意:sql语句以 ; 结尾

  -----------------------------------------------------------------------------

4.1 DDL:操作数据库、表、列等

常用关键字:CREATE、ALTER、DROPcreate创建、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 之后。
                                          day04_MySQL学习笔记_01
 
    例如:查询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 子句的条件,那么这行记录不会参加分组。
               
                         day04_MySQL学习笔记_01
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中可以演示)

============================================================