数据库应用
- 1.1 概念
- 1.1.1 什么是数据库
- 1.1.2 关系型和非关系型
- 1.1.3 关系型数据库
- 1.2 Mysql数据库
- 1.2.1 MySQL数据存放在哪里?
- 1.2.2 MySQL服务端
- 1.2.3 MySQL客户端1:DOS窗口
- 1.2.4 MySQL客户端2:可视化工具
- 1.3 数据库的结构
- 1.3.1 数据库结构
- 1.4 SQL语句
- 1.4.1 定义
- 1.4.2 分类
- 1.5 数据库常用操作
- 1.5.1 建库
- 1.5.2 删库
- 1.5.3 查看所有数据库
- 1.6 表的常用操作
- 1.6.1 表设计
- 1.6.2 创建表
- 1.6.3 修改表
- 1.6.4 删除表
- 1.6.5 查看所有表
- 1.6.6 查看表结构/设计表
- 1.7 表记录的常用操作
- 1.7.1 插入记录
- 1.7.2 查询记录
- 1.7.3 修改记录
- 1.7.4 删除记录
- 1.7.5 排序
- 1.7.6 记录总数
- 1.8 数据类型
- 1.8.1 命名规则
- 1.8.2 字符
- 1.8.3 数字
- 1.8.4 日期
- 1.8.5 图片
- 1.9 字段约束
- 1.9.1 主键约束
- 1.9.2 非空约束
- 1.9.3 唯一约束
- 1.10 准备数据
- 1.10.1 部门表 dept
- 1.10.2 员工表 emp
- 1.11 基础函数
- 1.11.1 lower
- 1.11.2 upper
- 1.11.3 length
- 1.11.4 substr
- 1.11.5 concat
- 1.11.6 replace
- 1.11.7 ifnull
- 1.11.8 round & ceil & floor
- 1.11.9 uuid
- 1.11.10 now
- 1.11.11 year & month & day
- 1.11.12 转义字符
- 1.12 条件查询
- 1.12.1 distinct
- 1.12.2 where
- 1.12.3 like
- 1.12.4 null
- 1.12.5 between and
- 1.12.6 limit
- 1.12.7 order by
- 1.13 统计案例
- 1.13.1 入职统计
- 1.13.2 年薪统计
- 1.14 聚合 aggregation
- 1.14.1 count
- 1.14.2 max / min
- 1.14.3 sum / avg
- 1.15 分组 group
- 1.15.1 group by
- 1.15.2 having
- 1.16 小结
- 1.16.1 char和varchar有什么区别?
- 1.16.2 datetime和timestamp有什么区别?
- 1.16.3 中文乱码
- 1.16.4 注释
- 1.16.5 主键、外键、唯一索引的区别?
- 1.16.6 drop、delete和truncate之间的区别?
- 1.17 事务 transaction
- 1.1.1 什么是事务
- 1.17.1 事务4个特性ACID
- 1.17.2 隔离级别
- 1.17.3 查询mysql的隔离级别
- 1.17.4 事务处理
- 1.17.5 提交 commit
- 1.17.6 回滚 rollback
- 1.18 表关联 association
- 1.18.1 概念
- 1.19 考试系统mysql版
- 1.19.1 表设计
- 1.19.2 创建数据库
- 1.19.3 创建表
- 1.19.4 生成建表SQL
- 1.19.5 插入测试数据
- 1.20 表强化:6约束 constraints
- 1.20.1 非空约束 not null
- 1.20.2 唯一约束 unique
- 1.20.3 主键约束 primary key
- 1.20.4 外键约束 forgrein key
- 1.20.5 默认约束 default
- 1.20.6 检查约束 check
- 1.21 多表联查 join
- 1.21.1 笛卡尔积 Cartesian product
- 1.21.2 三种连接 join
- 1.21.3 案例:列出research部门下的所有员工的信息
- 1.21.4 案例:怎么用内链接 INNER JOIN 实现上面的需求?
- 1.21.5 案例:列出tony的扩展信息
- 1.21.6 inner join、left join、right join的区别?
- 1.22 索引 index
- 1.22.1 定义
- 1.22.2 分类
- 1.22.3 创建索引
- 1.22.4 索引扫描类型
- 1.22.6 为何索引快?
- 1.22.7 小结
- 1.23 SQL面试题
- 1.23.1 查询所有记录
- 1.23.2 只查询指定列
- 1.23.3 查询id为100的记录
- 1.23.4 模糊查询记录
- 1.23.5 查询之间范围之间的所有记录
- 1.23.6 查询满足两个条件的记录
- 1.23.7 查询用户住址
- 1.23.8 查询19岁人的名字
- 1.23.9 按age升序查询记录
- 1.23.10 以name升序、age降序查询记录
- 1.23.11 查询总人数
- 1.23.12 查询各个城市的人数
- 1.23.13 查询至少有2人的地址
- 1.23.14 查询记录中最年长和最年轻
- 1.23.15 查询大于平均年龄的记录
- 1.23.16 查询年龄最大的用户信息
- 1.23.17 查询各部门的最高薪
- 1.23.18 查询各科的平均工资
- 1.23.19 查询id是100或200的记录
- 1.23.20 查询存在部门的员工信息
- 1.23.21 查询没划分部门的员工信息
- 1.23.22 查询同名的员工记录
- 1.23.23 全部学生按出生年月排行
- 1.23.24 每个班上最小年龄的学员
- 1.23.25 查询学生的姓名和年龄
- 1.23.26 查询男教师及其所上的课程
- 1.23.27 查询每个老师教的课程
- 1.23.28 查询女老师的信息
- 1.23.29 查询得分前3名的学员信息
- 1.23.30 查询课程是“计算机导论”的,得分前3名的学员信息
- 1.23.31 课程号“3-105”的倒数最后3名学员排行
- 1.24 SQL的执行顺序
- 1.24.1 SQL语句
- 1.25 考试系统oracle版
- 1.25.1 PD创建Oracle模型
- 1.25.2 表设计
- 1.26 Oracle数据库
- 1.26.1 安装
- 1.26.2 Oracle10g EX
- 1.26.3 配置本地服务
- 1.26.4 链接错误
- 1.27 创建数据库
- 1.27.1 注意事项
- 1.27.2 密码安全
- 1.27.3 创建用户
- 1.28 PL/SQL客户端操作
- 1.28.1 常见错误
- 1.28.2 选择自己的内容
- 1.28.3 常用对象
- 1.28.4 SQL窗口
- 1.29 准备数据
- 1.30 SQL差异
- 1.30.1 概念
- 1.30.2 日期
- 1.30.3 性别
- 1.30.4 decode()
- 1.30.5 casewhen
- 1.30.6 第一条
- 1.31 独特技术
- 1.31.1 过气技术
- 1.31.2 虚表 dual
- 1.31.3 序列 sequence
- 1.31.4 授权视图
- 1.31.5 视图 view
- 1.31.6 触发器 trigger
- 1.31.7 存储过程 procedure
- 1.32 分页
- 1.32.1 rownum伪列
- 1.32.2 分页SQL
- 1.33 存储过程实现分页
- 1.33.1 创建包同时创建游标
- 1.33.2 创建分页存储过程
- 1.33.3 测试
- 1.33.4 预习TestJDBC.java
- 1.34 JDBC
- 1.34.1 概念
- 1.34.2 idea 创建项目导驱动包
- 1.34.3 Statement 语句
- 1.34.4 PreparedStatement 语句
- 1.35 Git版本控制
- 1.35.1 开发难题
- 1.35.2 主流的版本控制产品
- 1.35.3 介绍
- 1.35.4 组成结构图
- 1.35.5 命令速查
- 1.35.6 常用命令
- 1.36 码云配置环境
- 1.36.1 注册账号
- 1.36.2 登录
- 1.36.3 安装GIT
- 1.36.4 设置字体
- 1.36.5 查询git
- 1.36.6 配置身份信息
- 1.36.7 查看配置信息
- 1.37 码云创建仓库
- 1.37.1 创建远程仓库
- 1.37.2 创建本地仓库
- 1.38 每日任务
- 1.38.1 新文件
- 1.38.2 推送
- 1.38.3 拉取
- 1.39 常见错误
- 1.39.1 Authentication failed for
- 1.39.2 To the same ref
- 1.40 SQL表准备
- 1.40.1 mysql-db库
- 1.40.2 student表
- 1.40.3 tb_dept表
- 1.40.4 tb_user表
- 1.41 基础SQL优化
- 1.41.1 查询SQL尽量不要使用select *,而是具体字段
- 1.41.2 避免在where子句中使用or来连接条件
- 1.41.3 使用varchar代替char
- 1.41.4 尽量使用数值替代字符串类型
- 1.41.5 查询尽量避免返回大量数据
- 1.41.6 使用explain分析你SQL执行计划
- 1.41.7 是否使用了索引及其扫描类型
- 1.41.8 创建name字段的索引
- 1.41.9 优化like语句
- 1.41.10 字符串怪现象
- 1.41.11 索引不宜太多,一般5个以内
- 1.41.12 索引不适合建在有大量重复数据的字段上
- 1.41.13 where限定查询的数据
- 1.41.14 避免在索引列上使用内置函数
- 1.41.16 避免在where子句中使用!=或<>操作符
- 1.41.17 去重distinct过滤字段要少
- 1.41.18 where中使用默认值代替null
- 1.42 高级SQL优化
- 1.42.1 批量插入性能提升
- 1.42.2 批量删除优化
- 1.42.3 伪删除设计
- 1.42.4 提高group by语句的效率
- 1.42.5 复合索引最左特性
- 1.42.6 排序字段创建索引
- 1.42.7 删除冗余和重复的索引
- 1.42.8 不要有超过5个以上的表连接
- 1.42.9 inner join 、left join、right join,优先使用inner join
- 1.42.10 in子查询的优化
1.1 概念
1.1.1 什么是数据库
简而言之,就是存储数据,管理数据的仓库。
常见的数据库分为:
- 关系型数据库, Oracle、MySQL、SQLServer、Access
- 非关系型数据库, MongoDB、Redis、Solr、ElasticSearch、Hive、HBase
1.1.2 关系型和非关系型
早期发展的数据库建立在数据的紧密关系基础之上(如:父子关系、师生关系),我们称其为关系型数据库,也称为传统数据库;现今数据库建立在数据的松散关系基础之上(如:中国人和美国人、中国人和印度人、视频、音频),我们称其为非关系型数据库nosql(not only sql)。业界总在争论nosql能否干掉传统数据库,很多初学者也有这个困惑。以我来看,两者没有矛盾,它们各有特点,根据业务情况互补才是真谛。但总的来说原来关系型数据库一统天下的格局早被打破,领土不断被蚕食,规模一再的缩小,虽然无法全面被替代,但却早已风光不在,沦落到一偶之地,Oracle的衰落就是最好的证明,早期只要是全球大企业无一例外都是部署Oracle,但现在都在去Oracle化,阿里就已经全面排斥Oracle。
既然干不掉,很多传统项目的还是围绕关系型数据库的居多,所以我们先来学习关系型数据库,目前最流行的关系型数据库是MySQL。
1.1.3 关系型数据库
关系型数据库有特定的组织方式,其以行和列的形式存储数据,以便于用户理解。关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据集合。
1.2 Mysql数据库
1) mysql服务端,它来处理具体数据维护,保存磁盘
2) mysql客户端,CRUD新增,修改,删除,查询
1.2.1 MySQL数据存放在哪里?
在MySQL的配置文件my.ini中会进行默认配置
1.2.2 MySQL服务端
mysql-5.5.27-winx64.msi
Mysql数据库默认的编码是latin1等价于iso-8859-1,修改为utf-8
注意:配置完,mysql开始执行,最后一步出错有时仍可以使用,使用SQLyog工具测试,如不行,再执行安装程序,选择remove,删除,然后重新安装。同时注意必须是管理员权限。
1.2.3 MySQL客户端1:DOS窗口
mysql -uroot -proot语法:mysql.exe执行文件代表参数-u 用户名,紧接着写的-p 密码,紧接着写的
1.2.4 MySQL客户端2:可视化工具
1.3 数据库的结构
1.3.1 数据库结构
1.4 SQL语句
1.4.1 定义
结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ “S-Q-L”),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
SQL 是1986年10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着,国际标准化组织(ISO)颁布了SQL正式国际标准。
1.4.2 分类
- DML(Data Manipulation Language)数据操纵语言
如:insert,delete,update,select(插入、删除、修改、检索)简称CRUD操新增Create、查询Retrieve、修改Update、删除Delete
- DDL(Data Definition Language)数据库定义语言
如:create table之类
- DCL(Data Control Language)数据库控制语言
如:grant、deny、revoke等,只有管理员才有相应的权限
- 数据查询语言(DQL:Data Query Language):
注意:SQL不区分大小写
1.5 数据库常用操作
1.5.1 建库
- 创建数据库,数据库名称:cbg2011
create database cbg2011 DEFAULT CHARACTER SET utf8;
1.5.2 删库
- 删除名称是cbg2011的数据库
drop database cbg2011;
1.5.3 查看所有数据库
- 查看所有数据库
show databases;
1.6 表的常用操作
使用数据库:use cbg2011;
1.6.1 表设计
门店表:tb_door
订单详情表:tb_order_detail
1.6.2 创建表
- 创建tb_door表,有id,door_name,tel字段
create table tb_door(id int primary key auto_increment,door_name varchar(100),tel varchar(50));
1.6.3 修改表
- 添加列
alter table tb_door add column see NUMERIC(7,2)
1.6.4 删除表
- 删除名称是tb_door的表
drop table tb_door;
1.6.5 查看所有表
- 查看所有表
show tables;
1.6.6 查看表结构/设计表
- 查看tb_door表结构
desc tb_door;
1.7 表记录的常用操作
1.7.1 插入记录
- 向tb_door表中插入2条记录
insert into tb_door values(null,’永和大王1店’,666);
insert into tb_door values(null,’ 永和大王2店’,888);
1.7.2 查询记录
- 查询tb_door表中的所有记录
SELECT * FROM tb_door;
1.7.3 修改记录
修改tb_door表中id为1的记录
update tb_door set tel=555 where id=1;
1.7.4 删除记录
- 删除tb_door表中id为2的数据
Delete from tb_door where id=2;
1.7.5 排序
- 将tb_door表记录按照tel排序
Select * from tb_door order by tel desc;
1.7.6 记录总数
- 查询tb_door表中的总记录数
Select count(*) from tb_door;
1.8 数据类型
1.8.1 命名规则
-
字段名必须以字母开头,尽量不要使用拼音
-
长度不能超过30个字符(不同数据库,不同版本会有不同)
-
不能使用SQL的保留字,如where,order,group
-
只能使用如下字符az、AZ、0~9、$ 等
-
Oracle习惯全大写:USER_NAME,mysql习惯全小写:user_name
-
多个单词用下划线隔开,而非java语言的驼峰规则
1.8.2 字符
-
char长度固定,不足使用空格填充,最多容纳2000个字符,char(11)存储abc,占11位。查询速度极快但浪费空间
-
varchar变长字符串,最多容纳4000个字符,varchar(11)存储abc,只占3位。查询稍慢,但节省空间。Oracle为varchar2
-
大文本: 大量文字(不推荐使用,尽量使用varchar替代)
以utf8编码计算的话,一个汉字在u8下占3个字节
注:不同数据库版本长度限制可能会有不同
1.8.3 数字
-
tinyint,int整数类型
-
float,double小数类型
-
numberic(5,2) decimal(5,2)—也可以表示小数,表示总共5位,其中可以有两位小数
-
decimal和numeric表示精确的整数数字
1.8.4 日期
-
date 包含年月日
-
time时分秒
-
datetime包含年月日和时分秒
-
timestamp时间戳,不是日期,而是从1970年1月1日到指定日期的毫秒数
1.8.5 图片
- blob 二进制数据,可以存放图片、声音,容量4g。早期有这样的设计。但其缺点非常明显,数据库庞大,备份缓慢,这些内容去备份多份价值不大。同时数据库迁移时过大,迁移时间过久。所以目前主流都不会直接存储这样的数据,而只存储其访问路径,文件则存放在磁盘上。
1.9 字段约束
1.9.1 主键约束
主键约束:如果为一个列添加了主键约束,那么这个列就是主键,主键的特点是唯一且不能为空。通常情况下,每张表都会有主键。
添加主键约束,例如将id设置为主键:
主键自增策略:当主键为数值类型时,为了方便维护,可以设置主键自增策略(auto_increment),设置了主键自增策略后,数据库会在表中保存一个AUTO_INCREMENT变量值,初始值为1,当需要id值,不需要我们指定值,由数据库负责从AUTO_INCREMENT获取一个id值,作为主键值插入到表中。而且每次用完AUTO_INCREMENT值,都会自增1. AUTO_INCREMENT=1
create table abc(id int primary key auto_increment);insert into abc values(null);insert into abc values(null);insert into abc values(null);select * from abc;
1.9.2 非空约束
非空约束:如果为一个列添加了非空约束,那么这个列的值就不能为空,但可以重复。
添加非空约束,例如为password添加非空约束:
create table user(id int primary key auto_increment,password varchar(50) not null
);
show tables;
insert into user values(null,null);//不符合非空约束
insert into user values(null,'123');//OK
1.9.3 唯一约束
唯一约束:如果为一个列添加了唯一约束,那么这个列的值就必须是唯一的(即不能重复),但可以为空。
添加唯一约束,例如为username添加唯一约束及非空约束:
create table test(id int primary key auto_increment,username varchar(50) unique--唯一约束
);
show tables;
insert into test values(null,'lisi');
insert into test values(null,'lisi');--username的值要唯一,重复会报错的
select * from test;
1.10 准备数据
1.10.1 部门表 dept
字段名称 | 数据类型 | 是否为空 | 备注 |
---|---|---|---|
deptno | int | 部门编号,PK主键 | |
ldname | varchar(20) | Y | 部门名称 |
loc | varchar(13) | Y | 部门所在地点 |
CREATE TABLE dept(deptno int primary key auto_increment NOT NULL,dname VARCHAR(20),loc VARCHAR(13)
);
INSERT INTO dept VALUES(1,'accounting','一区');
INSERT INTO dept VALUES(2,'research','二区');
INSERT INTO dept VALUES(3,'operations','二区');
1.10.2 员工表 emp
字段名称 | 数据类型 | 是否为空 | 备注 |
---|---|---|---|
empno | int | 员工编号,PK主键 | |
ename | varchar(10) | Y | 员工名称 |
job | varchar(10) | Y | 职位 |
mgr | int | Y | 上级编号 |
hiredate | datetime | Y | 月工资 |
sal | double | Y | 奖金 |
comm | NUMERIC(8,2) | Y | 奖金 |
deptno | int | Y | 所属部门 FK外键 |
Mysql:
CREATE TABLE emp(empno int primary key auto_increment NOT NULL,ename VARCHAR(10),job VARCHAR(10),mgr int,hiredate DATE,sal double,comm NUMERIC(7,2),deptno int
);
INSERT INTO emp VALUES(100,'jack','副总',NULL,'2002-05-03',90000,NULL,1);
INSERT INTO emp VALUES(200,'tony','总监',100,'2015-02-02',10000,2000,2);
INSERT INTO emp VALUES(300,'hana','经理',200,'2017-02-02',8000,1000,2);
INSERT INTO emp VALUES(400,'leo','员工',300,'2019-02-22',3000,200.12,2);
INSERT INTO emp VALUES(500,'liu','员工',300,'2019-03-19',3500,200.58,2);
1.11 基础函数
1.11.1 lower
SELECT 'ABC',LOWER('ABC') from dept; --数据转小写
1.11.2 upper
select upper(dname) from dept --数据转大写
1.11.3 length
select length(dname) from dept --数据的长度
1.11.4 substr
SELECT dname,SUBSTR(dname,1,3) FROM dept; --截取[1,3]
1.11.5 concat
select dname,concat(dname,'123') X from dept --拼接数据
1.11.6 replace
select dname,replace(dname,'a','666') X from dept --把a字符替换成666
1.11.7 ifnull
select ifnull(comm,10) comm from dept2 #判断,如果comm是null,用10替换
1.11.8 round & ceil & floor
round四舍五入,ceil向上取整,floor向下取整
--直接四舍五入取整select comm,round(comm) from emp--四舍五入并保留一位小数select comm,round(comm,1) from emp--ceil向上取整,floor向下取整select comm,ceil(comm) ,floor(comm) from emp
1.11.9 uuid
SELECT UUID()返回uuid:a08528ca-741c-11ea-a9a1-005056c00001
1.11.10 now
select now() -- 年与日 时分秒select curdate() --年与日select curtime() --时分秒
1.11.11 year & month & day
--hour()时 minute()分 second()秒select now(),hour(now()),minute(now()),second(now()) from emp ;--year()年 month()月 day()日select now(),year(now()),month(now()),day(now()) from emp ;
1.11.12 转义字符
’作为sql语句符号,内容中出现单撇就会乱套,进行转义即可
select 'ab'cd' -- 单引号是一个SQL语句的特殊字符select 'ab\'cd' --数据中有单引号时,用一个\转义变成普通字符
1.12 条件查询
1.12.1 distinct
使用distinct关键字,去除重复的记录行
SELECT loc FROM dept;SELECT DISTINCT loc FROM dept;
1.12.2 where
注意:where中不能使用列别名!!
select * from emp
select * from emp where 1=1 --类似没条件
select * from emp where 1=0 --条件不成立
select * from emp where empno=100 --唯一条件
select * from emp where ename='tony' and deptno=2 --相当于两个条件的&关系
select * from emp where ename='tony' or deptno=1 --相当于两个条件的|关系
select name, sal from emp where sal=1400 or sal=1600 or sal=1800;
-- 或
select name, sal from emp where sal in(1400,1600,1800);
select name, sal from emp where sal not in(1400,1600,1800);
1.12.3 like
通配符%代表0到n个字符,通配符下划线_代表1个字符
select * from emp where ename like 'l%' --以l开头的select * from emp where ename like '%a' --以a结束的select * from emp where ename like '%a%' --中间包含a的select * from emp where ename like 'l__' --l后面有两个字符的 _代表一个字符位置
1.12.4 null
select * from emp where mgr is null --过滤字段值为空的select * from emp where mgr is not null --过滤字段值不为空的
1.12.5 between and
SELECT * FROM empselect * from emp where sal>3000 and sal<10000select * from emp where sal>=3000 and sal<=10000--等效select * from emp where sal between 3000 and 10000--等效
1.12.6 limit
分数最高的记录:按分数排序后,limit n,返回前n条。Oracle做的很笨,实现繁琐,后期有介绍,而mysql做的很棒,语法简洁高效。在mysql中,通过limit进行分页查询:
select * from emp limit 2 --列出前两条
select * from emp limit 1,2 --从第二条开始,展示2条记录
select * from emp limit 0,3 --从第一条开始,展示3条记录--前三条
1.12.7 order by
SELECT * FROM emp order by sal #默认升序SELECT * FROM emp order by sal desc #降序
1.13 统计案例
1.13.1 入职统计
#2015年以前入职的老员工
SELECT * FROM emp WHERE DATE_FORMAT(hiredate,'%Y-%m-%d')<'2015-01-01';
SELECT * FROM emp WHERE YEAR(hiredate)<2015#2019年以后签约的员工,日期进行格式转换后方便比较
SELECT * FROM emp WHERE YEAR(DATE_FORMAT(hiredate,'%Y-%m-%d'))>=2019;#2015年到2019年入职的员工
SELECT * FROM empWHERE
STR_TO_DATE(hiredate,'%Y-%m-%d')>='2015-01-01'AND
STR_TO_DATE(hiredate,'%Y-%m-%d')<='2019-12-31'
1.13.2 年薪统计
公司福利不错13薪,年底双薪,统计员工的年薪=sal13+comm13
SELECT empno,ename,job,sal*13+comm*13 FROM emp;SELECT empno,ename,job,sal*13+comm*13 as 年薪 FROM emp;--用as给列起个别名SELECT empno,ename,job,sal*13+comm*13 年薪 FROM emp; --as也可以省略select ename, sal+comm from empselect ename, sal , comm, sal+ifnull(comm,0) from emp--用0替换掉null
1.14 聚合 aggregation
根据一列统计结果
1.14.1 count
s
elect count(*) from emp --底层优化了select count(1) from emp --效果和*一样select count(comm) from emp --慢,只统计非NULL的
1.14.2 max / min
select max(sal) from emp --求字段的最大值
select max(sal) sal,max(comm) comm from emp select min(sal) min from emp --获取最小值
select min(sal) min,max(sal) max from emp --最小值最大值
SELECT ename,MAX(sal) FROM emp group by ename --分组
1.14.3 sum / avg
平均值
select count(*) from emp --总记录数select sum(sal) from emp --求和select avg(sal) from emp --平均数
1.15 分组 group
用于对查询的结果进行分组统计
group by表示分组, having 子句类似where过滤返回的结果
1.15.1 group by
#每个部门每个岗位的最高薪资和平均薪资,结果中的非聚合列必须出现在分组中,否则业务意义不对
SELECT deptno,MAX(sal),AVG(sal) FROM emp
GROUP BY deptno #按照deptno分组 SELECT job,MAX(sal),AVG(sal) FROM emp
GROUP BY job #按照job分组SELECT deptno,job,MAX(sal),AVG(sal) FROM emp
GROUP BY deptno,job #deptno和job都满足的
1.15.2 having
#平均工资小于8000的部门
select deptno, AVG(sal) from emp
group by deptno #按部门分组
having AVG(sal) <8000 #查询条件,类似where,但是group by只能配合having#deptno出现的次数
SELECT deptno,COUNT(deptno) FROM emp
GROUP BY deptno #按deptno分组
HAVING COUNT(deptno)>1 #次数多的
1.16 小结
1.16.1 char和varchar有什么区别?
- char为定长字符串,char(n),n最大为255
- varchar为不定长字符串,varchar(n),n最大长度为65535
- char(10)和varchar(10)存储abc,那它们有什么差别呢?
- char保存10个字符,abc三个,其它会用空格补齐;而varchar只用abc三个位置。
1.16.2 datetime和timestamp有什么区别?
-
数据库字段提供对日期类型的支持,是所有数据类型中最麻烦的一个,慢慢使用就会体会出来。
-
date 是 年与日
-
time是 时分秒
-
datetime年月日时分秒,存储和显示是一样的
-
timestamp时间戳,存储的不是个日期,而是从1970年1月1日到指定日期的毫秒数
1.16.3 中文乱码
如果在dos命令下执行insert插入中文数据,数据又乱码,那现在sqlYog客户端执行下面命令:
set names utf8;set names gbk;
设置客户端字符集和服务器端相同。如果不知道它到底用的什么