MySql


前言

数据库的常见概念

  1. DB:数据库,存储数据的仓库
  2. DBMS:数据库管理系统,又称为数据库软件或者数据库产品,用于创建和管理数据库,常见的有MySQL、Oracle、SQL Server
  3. DBS:数据库系统,数据库系统是一个通称,包括数据库、数据库管理系统、数据库管理人员等,是最大的范畴
  4. SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言

数据库的常见分类

  1. 关系型数据库:MySQL、Oracle、DB2、SQL Server
  2. 非关系型数据库:
        • 键值存储数据库: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的优点

  1. 成本低、开源免费
  2. 性能高、移植性好
  3. 体积小、便于安装

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 当中limitorder 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;