MySql
前言
数据库的常见概念
- DB:数据库,存储数据的仓库
- DBMS:数据库管理系统,又称为数据库软件或者数据库产品,用于创建和管理数据库,常见的有MySQL、Oracle、SQL Server
- DBS:数据库系统,数据库系统是一个通称,包括数据库、数据库管理系统、数据库管理人员等,是最大的范畴
- SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言
数据库的常见分类
- 关系型数据库:MySQL、Oracle、DB2、SQL Server
- 非关系型数据库:
-
-
-
- 键值存储数据库:Redis、Memcached、MemcacheDB
- 列存储数据库:HBase、Cassandra
- 面向文档的数据库:MongDB、CouchDB
- 图形数据库:Neo4J
-
-
SQL语言的分类
- DQL:数据查询语言:select、from、where
- DML:数据操作语言:insert、update、delete
- DDL:数据定义语言:create、alter、drop、truncate (主要操作表结构)
- DCL:数据控制语言:grant(授权)、revoke(撤销权限)
- TCL:事务控制语言:commit、rollback
MySQL概述
MySQL的背景
MySQL的前身是属于MySQL AB,08年被SUN公司收购,09年SUN公司又被Oracle公司收购
MySQL的优点
- 成本低、开源免费
- 性能高、移植性好
- 体积小、便于安装
MySql 数据类型
varchar (最长255) 可变长度的字符串,比较智能,节省空间。会根据实际的数据长度动态分配空间。
? 优点:节省空间 ? 缺点:需要动态分配空间,速度慢。
char (最长255) 定长字符串,不管实际的数据长度是多少,分配固定长度的空间去存储数据。 使用不恰当的时候,可能会导致空间的浪费。
? 优点:不需要动态分配空间,速度快。 ? 缺点:使用不当可能会导致空间的浪费。
? varchar和char我们应该怎么选择? ? 性别字段你选什么?因为性别是固定长度的字符串,所以选择char。 ? 姓名字段你选什么?每一个人的名字长度不同,所以选择varchar。
int (最长11)
?数字中的整数型。等同于java的int。
bigint 数字中的长整型。等同于java中的long。
float 单精度浮点型数据
double 双精度浮点型数据
date 短日期类型
datetime 长日期类型
clob 字符大对象 最多可以存储4G的字符串。 比如:存储一篇文章,存储一个说明。 超过255个字符的都要采用CLOB字符大对象来存储。 Character Large OBject:CLOB
blob 二进制大对象 Binary Large OBject 专门用来存储图片、声音、视频等流媒体数据。 往BLOB类型的字段上插入数据的时候,例如插入一个图片、视频等, 你需要使用IO流才行。
MySql DQL语言
基础查询
/* 特点: 1.查询列表可以是字段、常量、函数、表达式 2.查询结果是一个虚拟表
3.SELECT 后面可以跟字段名,字面量 */ SELECT field1,field2,field3... FROM tablename;
# 查看表结构
desc tableName;
# 起别名 # 别名可以使用单引号、双引号引起来,当只有一个单词时,可以省略引号,当有多个单词且有空格或特殊符号时,不能省略,AS可以省略
# 在所的数据库中,所有的字符串统一用单引号,单引号是标准,双引号在Oracle数据库中用不了,但是在MySql中可以用 SELECT field1 AS 'alias' FROM tablename; # 字段去重 distinct 只能出现在所有字段的最前面, 有多个字段表示联合起来去重; SELECT DISTINCT field1 FROM tablename;
# 查询常量 SELECT 常量值; # 查询函数 SELECT 函数名(param); # 查询表达式 SELECT 100/20; # 数学运算 加 减 乘 除 都可以 SELECT 数值+数值 直接是运算; SELECT 字符+数值 首先将字符转换成数值类型(转换失败默认 0),在做运算 SELECT NULL+数值 值为null
条件查询
-
in 列表的值类型必须一致或兼容,in 列表中不支持通配符%和_
-
=、!= 不能用来判断null、而 <=>、is null 、 is not null可以用来判断null
-
<=> 也可以判断普通类型的数值
-
!= 和 <> 都是判断不等于的意思,但是MySQL推荐使用<>
/* where 关键字后面可以加 字段名 使用以下运算法: null 在数据库中不能使用等号衡量,因为他不是一个值,在数据库中代表什么也没有;
条件运算符:>、>=、<、<=、=、<=>、!=、<> 逻辑运算符:and、or、not (and 和 or 同时出现时 and 优先级比 or 高,若需要 or
先执行就加小括号,以后不确定优先级 可以加小括号) 模糊运算符: like:%任意多个字符、_任意单个字符,如果有特殊字符,需要使用escape转义 ,\ 转义 between and 必须遵循左小右大 in is null is not null */ SELECT * FROM employees WHERE id = 1; SELECT * FROM employees WHERE salary > 12000 #注意:!=和<>都是判断不等于的意思,但是MySQL推荐使用<> SELECT * FROM employees WHERE employee_id <> 100; SELECT * FROM employees WHERE employee_id != 100; #查询员工编号在100到120之间的员工信息 SELECT * FROM employees WHERE employee_id > 100 AND employee_id < 120; SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120; #查询员工编号不在100到120之间的员工信息 SELECT * FROM employees WHERE employee_id NOT BETWEEN 100 AND 120; #查询员工的工种编号是 100,120,140中的员工名和工种编 #in列表的值类型必须一致或兼容,in列表中不支持通配符%和_ SELECT employee_id,first_name,job_id FROM employees WHERE employee_id IN (100,120,130,140); #查询有奖金的员工名和奖金率 SELECT first_name FROM employees WHERE commission_pct IS NOT NULL;
排序查询
-
排序列表可以是单个字段、多个字段、别名、函数、表达式
-
asc代表升序,desc代表降序,如果不写,默认是asc
-
order by的位置一般放在查询语句的最后(除limit语句之外)
#按单个字段排序:查询员工信息,要求按工资降序 SELECT * FROM employees ORDER BY salary; #按多个字段查询:查询员工信息,要求先按工资降序,再按员工编号升 #多个字段,分隔 SELECT * FROM employees ORDER BY salary , DESC employee_id ASC;
# sal 在前,起主导,只有sal相等时,才会考虑执行 ename
SELECT ename,sal FROM emp ORDER BY sal ASC, ename ASC;
分页查询
select ename , sal fromemp order by sal desc limit 5; 取前5 limit 0,5;
mysql 当中limit在order by之后执行!!!!!!
每页显示3条记录
-
- 第1页:limit 0,3 [0 1 2]
- 第2页:limit 3,3 [3 4 5]
- 第3页:limit 6,3 [6 7 8]
每页显示pageSize条记录 第pageNo页:limit (pageNo - 1) * pageSize ,
数据处理函数
-
数据处理函数 又称 单行处理函数,特点:一个输入,对应1个输出;
-
和单行处理函数对应的是:多行处理函数,特点: 多个输入,对应1个输出;
# 单行处理函数 # lower 转换小写 SELECT LOWER(ename) AS ename FROM emp ; # upper 转换大写 SELECT UPPER(ename) AS ename FROM emp ; # substr(srcStr, startIndex, length) 取子串 起始索引从 1 开始 没有0 SELECT SUBSTR(ename,1,2) AS ename FROM emp ; SELECT ename FROM emp WHERE SUBSTR(ename,1,1) = 'A'; # concat 字符串拼接 # 首字母大写 SELECT CONCAT(UPPER(SUBSTR(ename,1,1)),TRIM(LOWER(SUBSTR(ename,2,LENGTH(ename) - 1)))) AS ename FROM emp; # length 取长度 # trim 去前后空格 # str_to_date 将字符串转换成日期 # data_format 格式化日期 # format 设置千分位,数字格式化 # round 四舍五入 SELECT ROUND(123.39) AS resutl FROM emp; SELECT ROUND(123.561,1) AS result FROM emp; # rand 生成随机数 SELECT RAND() FROM emp; # 100 以内的随机数 SELECT ROUND(RAND() * 100) FROM emp; # ifnull 可以将 null 转换成一个具体的值,空处理函数, null 值参与运算 值为 null SELECT ename,(sal * IFNULL(comm,0)) * 12 AS yearsal FROM emp; # case when then when then else end # 当员工的工作岗位是 MANAGER 的时候工资上调 10% , 当工作岗位是 SALESMAN 的时候,工资上调50%,其他正常; SELECT ename,job,( CASE job WHEN 'MANAAGER' THEN sal * 1.1 WHEN 'SALESMAN' THEN sal * 1.5 ELSE sal END ) newsal FROM emp; # 分组函数(多行处理函数) # 注意:分組函數使用時必須先進行分組,然後才能用,如沒有分組,整張表默認為一組; # 注意:分組函數會自動忽略 NULL 值,不許要提前對 null 處理; # 注意:分組函數 不能直接使用在 where 子句中; # count SELECT COUNT(comm) FROM emp; # sum SELECT SUM(comm) FROM emp; # max # min # avg # 可以合起來一起使用 SELECT COUNT(sal),SUM(sal),AVG(sal),MAX(sal),MIN(sal) FROM emp;
分组查询
- 这些关键字只能按照这个顺序:SELECT FROM WHERE GROPU BY HAVING ORDER BY;
- 执行顺序:FROM > WHERE > GRUOP BY > HAVING > SELECT > ORDER BY;
- 从某张表中查询数据,先经过 WHERE 条件筛选出有价值的数据,在对数据进行分组,分组之后可以使用 HAVING 继续筛选,SELECT 查询出来,最后排序;
- 能用 WHERE 和 HAVING, 优先选择WHERE,WHERE 完成不了的,在考虑 HAVING;
- GROUP BY 后面可以根据多个字段分组;
- SELECT 后面只能出现 分组函数 和 GROUP BY 后面出现的 字段;
# 找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,要求按照平均薪资降序排; SELECT job, AVG(sal) AS 'avgsal' FROM emp WHERE job <> 'MANAGER' GROUP BY job HAVING AVG(sal) > 1500; ORDER BY avgsal DESC;