MySQL 笔记

数据库概述

数据库是持久化数据的一种介质,可以理解成用来存储和管理数据的仓库
持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。持久化的大多数时候是将内存中的数据存储在数据库中,当然也可以存储在磁盘文件、XML数据文件中。

  • DB

    数据库( database ):存储数据的“仓库”。它保存了一系列有组织的数据。

  • DBMS

    数据库管理系统( Database Management System )。数据库是通过 DBMS 创
    建和操作的容器

  • SQL

    结构化查询语言( Structure Query Language ):专门用来与数据库通信的语
    言。

数据库的特点

  • 可将数据持久化到硬盘
  • 可存储大量数据
  • 方便检索
  • 保证数据的一致性、完整性
  • 安全,可共享
  • 通过组合分析,可以产生新数据

常见的数据产品

  • Oracle:甲骨文
  • DB2:IBM;
  • SQL Server:微软;
  • MySQL:甲骨文;

数据库存储数据的特点

  • 将数据放到中,再放到库中
  • 一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性
  • 表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。
  • 表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性”
  • 表中的数据是按行存储的,每一行类似于java中的“对象”
  • 表——类
  • 列,字段——属性
  • 行——对象

SQL

SQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中,例如:MySQL、Oracle、SQL Server等。

语法要求

  • SQL语句可以单行或多行书写,以分号结尾;
  • 可以用空格和缩进来来增强语句的可读性;
  • 关键字不区别大小写,建议使用大写;

分类

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
  • DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
  • DQL(Data Query Language):数据查询语言,用来查询记录(数据)。

DQL

DQL就是数据查询语言,`数据库执行DQL语句不会对数据进行改变`,而是让数据库发送结果集给客户端。

语法

SELECT
selection_list /*要查询的列名称*/
FROM
table_list /*要查询的表名称*/
WHERE
condition /*行条件*/
GROUP BY
grouping_columns /*对结果分组*/
HAVING
condition /*分组后的行条件*/
ORDER BY
sorting_columns /*对结果分组*/
LIMIT
offset_start, row_count /*结果限定*/

基础查询

1.查询表中的单个字段

SELECT last_name
FROMemployees ;

2.查询表中的多个字段

SELECT last_name,salary,email
FROMemployees ;
  1. 查询表中的所有字段
SELECT * FROMemployees ;
  1. 查询常量值
SELECT 100;
SELECT 'john';
  1. 查询表达式
SELECT 100%98;
  1. 查询函数
SELECT VERSION();
  1. 起别名 查询字段有重名的情况,使用别名可以加以区分开来
    使用AS
SELECT 100% 98 AS 结果;
SELECT last_name AS 姓,first_name AS 名 formatemployees ;

使用空格

SELECT last_name 姓,first_name 名
FROMemployees ;

使用别名出错时候,对别名加以引号

SELECT last_name 姓,first_name 名
FROMemployees ;
  1. 去重
    使用distinct
SELECT DISTINCT department_id
FROMemployees ;
  1. 加号的作用
    select 100+90; 若两个操作数都为数值型,则做加法运算
    select'123' + 90; 若其中一方为字符型,则试图将字符型数值转换成数值型

如果成功,则继续做加法运算
如果失败,则将字符型数值转换成0,进行运算
select null + 10 任何一方为null,则结果为null
案例:查询员工名和姓连接成一个字段,并显示为姓名

SELECT last_name + first_name AS 姓名
FROMemployees ;
  1. concat连接
SELECT CONCAT('a', 'b', 'c') AS 结果
FROMemployees ;
#-------------
SELECT CONCAT(last_name, first_name) AS 结果
FROMemployees ;
  1. 显示结构
DESC departments;

小练习题

  1. 下面语句是否可以执行成功
SELECT last_name,job_id,salary AS sal
FROMemployees ;
  1. 下面的语句是否可以执行成功
SELECT *
FROMemployees ;;
  1. 找出下面语句中的错误
SELECT employee_id,last_name,salary * 12 “ANNUAL SALARY”
FROMemployees ;
# ------------------
SELECT employee_id,last_name,salary * 12 "ANNUAL SALARY"
FROMemployees ;
  1. 显示表deparments的结构,并查询其中的全部数据
DESC departments;SECOND * FROM departments;
  1. 显示表employees中的全部job_id(不能重复)
SELECT DISTINCT job_id
FROMemployees ;
  1. 显示表employees的全部列,各个列直接用逗号连接,列头显示成OUT_PUT

null与其他任何数据拼接都为null

SELECT CONCAT('employes_id',',','first_name',',','last_name',',','email',',','phone_number',',','job_id',',',IFNULL(commission_pct, 0)) AS 'OUT_PUT'
FROMemployees ;

条件查询

语法:

select查询列表   3
from表名      2
where筛选条件;  1

分类:

  • 按条件表达式筛选

      条件运算符:> < =  !=  <>(不等于)
    
  • 按逻辑表达式筛选

      逻辑运算符: && || !  或者 and  or  not (推荐)
    
  • 模糊查询
    like

    • 一般和通配符搭配使用

    %

    • 任意多个字符

    _

    • 任意单个字符

    between and

    • 使用between and 可以提高语句的简介度
      包含临界值
      临界值不可用交换顺序

    in

    • 判断某字段属于in列表的某一项
      in列表的值类型必须一致或者兼容
      可以提高语句的简洁性

      等值号判断,不能使用通配符

    is null

    不能判断null值
    安全等于 (<=>)
    判断是否等于,等于返回true
    但是可读性比较差
    比较:最好用is null 可读性好,安全性高

一. 按条件表达式筛选

案例1: 查询工资> 12000的员工信息

SELECT * FROM employees WHERE salary > 12000;

案例2:查询部门编号不等于90号的员工名和部门编号

SELECT last_name, department_id FROM employees WHERE department_id <> 90;

二. 按逻辑表达式筛选
案例1:查询工资在10000到20000直接的员工名、工资以及奖金

SELECT last_name, salary, commission_pct FROM employees WHERE salary >= 10000 && salary <= 20000;

案例2:查询部门编号不是在90到110直接,或工资高于15000的员工信息

SELECT * FROM employees WHERE NOT(department_id >= 90 && department_id <= 110);

三、模糊查询
案例1: 查询员工名中包含字符a的员工信息

SELECT *
FROMemployees
WHERE last_name LIKE '%a%' ;

案例2: 查询员工名中第三个字符为e,第五个字符为a的员工信息

SELECT last_name
FROMemployees
WHERE last_name LIKE '__e_a%' ;

案例3: 查询员工名中第二个字符为_的员工名

SELECT last_name
FROMemployees
WHERE last_name LIKE '_\_%' ;SELECT last_name
FROMemployees
WHERE last_name LIKE '_$_%' ESCAPE '$' ;# escape 标识为转义字符

案例4: 查询员工编号在100到120 之间的员工信息

SELECT *
FROMemployees
WHERE employee_id BETWEEN 100 AND 120 ;

案例5: 查询员工的工种编号是IT_PROG、AD_VP、AD_PRES中的员工名和工种编号

SELECT last_name,job_id
FROMemployees
WHERE job_id IN ('IT_PROG', 'AD_VP', 'AD_PRES') ;

案例6: 查询没有奖金的员工名和奖金率

SELECT last_name,commission_pct
FROMemployees
WHERE commission_pct IS NULL ;

案例7: 查询有奖金的员工名和奖金率

SELECT last_name,commission_pct
FROMemployees
WHERE commission_pct IS NOT NULL ;

四、字段控制查询
去除重复记录(两行或两行以上记录中系列的上的数据都相同)

常见函数

  • 数学函数
名称 返回值
ABS(x) 返回x的绝对值
CEIL(x) 返回大于x的最小整数值
FLOOR(x) 返回大于x的最大整数值
MOD(x,y) 返回x/y的模
RAND(x) 返回0~1的随机值
ROUND(x,y) 返回参数x的四舍五入的有y位的小数的值
TRUNCATE(x,y) 返回数字x截断为y位小数的结果
SQRT(x) 返回x的平方根
POW(x,y) 返回x的y次方
  • 字符串函数
名称 返回值
CONCAT(S1,S2,…,Sn) 连接S1,S2,…,Sn为一个字符串
CONCAT(s, S1,S2,…,Sn) 同CONCAT(s1,s2,…)函数,但是每个字符串之间要加上s
CHAR_LENGTH(s) 返回字符串s的字符数
LENGTH(s) 返回字符串s的字节数,和字符集有关
INSERT(str, index , len, instr) 将字符串str从第index位置开始,len个字符长的子串替换为字符串instr
UPPER(s) 或 UCASE(s) 将字符串s的所有字母转成大写字母
LOWER(s) 或LCASE(s) 将字符串s的所有字母转成小写字母
LEFT(s,n) 返回字符串s最左边的n个字符
RIGHT(s,n) 返回字符串s最右边的n个字符
LPAD(str, len, pad) 用字符串pad对str最左边进行填充,直到str的长度为len个字符
RPAD(str ,len, pad) 用字符串pad对str最右边进行填充,直到str的长度为len个字符
LTRIM(s) 去掉字符串s左侧的空格
RTRIM(s) 去掉字符串s右侧的空格
TRIM(s) 去掉字符串s开始与结尾的空格
TRIM(【BOTH 】s1 FROM s) 去掉字符串s开始与结尾的s1
TRIM(【LEADING】s1 FROM s) 去掉字符串s开始处的s1
TRIM(【TRAILING】s1 FROM s) 去掉字符串s结尾处的s1
REPEAT(str, n) 返回str重复n次的结果
REPLACE(str, a, b) 用字符串b替换字符串str中所有出现的字符串a
STRCMP(s1,s2) 比较字符串s1,s2
SUBSTRING(s,index,len) 返回从字符串s的index位置其len个字符

· 日期时间类函数

名称 返回值
CURDATE() 或 CURRENT_DATE() 返回当前日期
CURTIME() 或 CURRENT_TIME() 返回当前时间
NOW()
SYSDATE()
CURRENT_TIMESTAMP()
LOCALTIME()
LOCALTIMESTAMP() 返回当前系统日期时间
YEAR(date)
MONTH(date)
DAY(date)
HOUR(time)
MINUTE(time)
SECOND(time) 返回具体的时间值
WEEK(date)
WEEKOFYEAR(date) 返回一年中的第几周
DAYOFWEEK() 返回周几,注意:周日是1,周一是2,。。。周六是7
WEEKDAY(date) 返回周几,注意,周1是0,周2是1,。。。周日是6
DAYNAME(date) 返回星期:MONDAY,TUESDAY…SUNDAY
MONTHNAME(date) 返回月份:January,。。。。。
DATEDIFF(date1,date2)
TIMEDIFF(time1, time2) 返回date1 - date2的日期间隔返回time1 - time2的时间间隔
DATE_ADD(datetime, INTERVALE expr type) 返回与给定日期时间相差INTERVAL时间段的日期时间
DATE_FORMAT(datetime ,fmt) 按照字符串fmt格式化日期datetime值
STR_TO_DATE(str, fmt) 按照字符串fmt对str进行解析,解析为一个日期
  • 分组聚合函数

聚合函数是用来做纵向运算的函数

- COUNT():统计指定列不为NULL的记录行数;
- MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
- MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
- SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
- AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

练习

  1. 查询员工工号为176的员工的姓名和部门号和年薪
SELECT last_name,department_id,salary
FROMemployees
WHERE employee_id = 176
;
  1. 查询工资大于12000的员工姓名和工资
SELECT last_name,salary
FROMemployees
WHERE salary > 12000 ;
  1. 选择工资不在5000到12000的员工的姓名和工资
SELECT last_name,salary
FROMemployees
WHERE NOT (salary >= 5000 AND salary <= 12000) ;

4,选择在20或50号部门工作的员工姓名和部门号

SELECT last_name,job_id,department_id
FROMemployees
WHERE department_id = 20 OR department_id = 50
  1. 选择公司中没有管理者的员工姓名以及job_id
SELECT last_name,job_id FROMemployees WHERE department_id IS NULL ;
  1. 选择公司中有奖金的员工姓名,工资和奖金级别
SELECT last_name,salary,commission_pct
FROMemployees
WHERE last_name IS NOT NULL AND salary != 0 AND commission_pct IS NOT NULL ;
  1. 选择员工姓名的第三个字母是a的员工姓名
SELECT last_name
FROMemployees
WHERE last_name LIKE '__a%' ;
  1. 选择按年薪降序的员工姓名、年薪
SELECT last_name,department_id,salary * 12 * (1 + IFNULL(commission_pct, 0)) 年薪
FROMemployees
ORDER BY 年薪 DESC ;
  1. 选择按月薪降序且月薪不在8000到17000的员工姓名、月薪
SELECT last_name,salary
FROMemployees
WHERE NOT (salary BETWEEN 8000 AND 17000)
ORDER BY salary DESC ;
  1. 选择邮箱中包含’e’的员工信息,并按邮箱长度降序,部门号升序
SELECT *
FROMemployees
WHERE email LIKE '%e%'
ORDER BY LENGTH(email) DESC,department_id ;
  1. 显示系统时间(日期+时间)
SELECT NOW();;
  1. 查询员工号,姓名,工资,以及工资提高20%的结果(new salary)
SELECT employee_id,salary,salary,salary * 1.2 newsalary
FROMemployees ;
  1. 将员工的姓名按首字母排序,并写出姓名的长度
SELECT last_name,LENGTH(last_name)
FROMemployees
ORDER BY SUBSTR(last_name, 1, 1) ;
  1. 做一个查询,产生下面的结果
    <last_name> earns monthly but wants *3
SELECT CONCAT(last_name,'earns',salary,'monthly but wants',salary * 3)
FROMemployees ;
  1. 查询最大工资,最小工资,平均工资,总工资
SELECT salary,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROMemployees ;
  1. 查询工龄最长与工龄最小的员工天数差
    DATEDIFF() 日期差
SELECT DATEDIFF(MAX(hiredate), MIN(hiredate))
FROMemployees ;
  1. 查询部门号为90的员工个数
SELECT COUNT(department_id = 90)
FROMemployees ;
  1. 查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT job_id,MAX(salary) mx_sal
FROMemployees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary) > 12000 ;
  1. 查询领导编号>105的每个领导收下的最低工资>5000的领导编号及最低工资
SELECT manager_id,MIN(salary)
FROMemployees
WHERE manager_id > 102
GROUP BY manager_id
HAVING MIN(salary) > 5000 ;

MySQL笔记 4月记相关推荐

  1. 涂抹mysql笔记-mysql复制特性

    涂抹mysql笔记-mysql复制特性 mysql复制特性:既可以实现整个服务(all databases)级别的复制,也可以只复制某个数据库或某个数据库中的某个指定的表对象.即可以实现A复制到B(主 ...

  2. MySQL 笔记6 -- 函数与事务

    MySQL 笔记6 – 函数与事务 MySQL 系列笔记是笔者学习.实践MySQL数据库的笔记 课程链接: MySQL 数据库基础入门教程 参考文档: MySQL 官方文档 SQL 教程 一.内置函数 ...

  3. 2021.09.27 MySQL笔记

    2021.09.27 MySQL笔记 文章目录 2021.09.27 MySQL笔记 一.展示当前存在的所有数据库 二.使用(选中)一个数据库 三.创建一个数据表 四.查询并展示该数据库内的所有数据表 ...

  4. MySql 笔记(五)InnoDB引擎页分裂与页合并的原理

    MySql 笔记(五)InnoDB引擎页分裂与页合并的原理 一.文件表(File-Table)结构 二.根,分支与叶子 三.页的内部原理 四.页合并的原理 五.页分裂的原理 六.主键的使用 七.总结 ...

  5. MySQL笔记常见函数

    MySQL笔记常见函数 一.单行函数: 1.upper():转换成大写 2.lower(): 转换成小写 3.substr(): 截取子串 1.截取从指定索引处开始后面所有字符 select subs ...

  6. mysql事务手写笔记_兴奋了!阿里技术官手写“MySQL笔记”,传授你年薪百万级干货...

    前言 MySQL重要吗?重要!为什么重要?因为它在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展.阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的.My ...

  7. 我的简书两月记:数据可视化

    一.前言 "你无法衡量的东西,你也无法管理." 这是<精益数据分析>里提到的管理学大师彼得·德鲁克的一句话.我很认同. 很多人来简书写作,或长或久,可能无法准确量化自己 ...

  8. 涂抹mysql 完整_涂抹mysql笔记-管理mysql服务

    $ /mysql/scripts/mysql_install_db --datadir=/mysql/data --basedir=/mysql support-files/mysql.server脚 ...

  9. 阿里工程师总结的《MySQL 笔记高清 PDF 》 开放下载

    下面是阿里工程师整理的MySQL笔记,高清PDF版,涉及到mysql的方方面面,内容质量特别高,文末有获取方式. 获取方式,扫码发送:102

最新文章

  1. 建立CentOS 6.9 的Yum本地源
  2. Jquery中获取表单的值并提交
  3. 02_clickhouse安装,卸载,启动/关闭服务,交互式命令(数据库创建,数据导入,查询),批模式数据导入,MySQL接口操作ClickHouse,DBeaver可视化工具安装与使用(学习笔记)
  4. C++std命名空间和头文件详解
  5. 软考网络工程师学习笔记2-数据通信基础
  6. 研究解决CLOB字段IO问题的方法
  7. Unique Email Addresses
  8. TP5路由知识简单个人汇总
  9. 性能监视器 Performance Monitor-对SQLSERVER进行性能监控
  10. VMware虚拟机安装win10卡顿优化
  11. idea运行web项目光标乱跳
  12. 数字地图制作原则细节
  13. 二手书籍交易网站毕业设计,二手书籍买卖平台毕设,二手书籍交易市场平台设计与实现毕业设计论文分析
  14. java制作闪星星_Silverlight之我见——制作星星闪烁动画
  15. bom翻译中文_电器BOM表中英文对照
  16. 六、注册页功能制作《仿淘票票系统前后端完全制作(除支付外)》
  17. ftp 上传 工具,三款特别好用的ftp 上传 工具
  18. Chatgpt这么智能,以后会不会取代掉人类?
  19. 2022年HarmonyOS/OpenHarmony生态观察
  20. Java操作poi添加页眉页脚:字体_颜色_大小

热门文章

  1. RSA 2010年信息安全大会六大热点预测
  2. Ajax.Net之数据类型
  3. linux服务端修改EDT为东八区,EDT开发环境配置
  4. java发送jsp表格邮件_JSP 发送邮件
  5. php word 图片无法显示,Word文档不显示图片解决方法
  6. tperformancegraph_列车运行实绩图,train performance graph,音标,读音,翻译,英文例句,英语词典...
  7. 数据库设计的三大范式[学习笔记]
  8. 超详细 | 接口自动化测试总结与分享入门篇
  9. MATLAB 读取 各类文件
  10. (1 24) 3 java代码_《Java语言程序设计》测试题及参考答案(第1部分)