MySQL笔记 4月记
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 ;
- 查询表中的所有字段
SELECT * FROMemployees ;
- 查询常量值
SELECT 100;
SELECT 'john';
- 查询表达式
SELECT 100%98;
- 查询函数
SELECT VERSION();
- 起别名 查询字段有重名的情况,使用别名可以加以区分开来
使用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 ;
- 去重
使用distinct
SELECT DISTINCT department_id
FROMemployees ;
- 加号的作用
select 100+90;
若两个操作数都为数值型,则做加法运算
select'123' + 90;
若其中一方为字符型,则试图将字符型数值转换成数值型
如果成功,则继续做加法运算
如果失败,则将字符型数值转换成0,进行运算
select null + 10 任何一方为null,则结果为null
案例:查询员工名和姓连接成一个字段,并显示为姓名
SELECT last_name + first_name AS 姓名
FROMemployees ;
- concat连接
SELECT CONCAT('a', 'b', 'c') AS 结果
FROMemployees ;
#-------------
SELECT CONCAT(last_name, first_name) AS 结果
FROMemployees ;
- 显示结构
DESC departments;
小练习题
- 下面语句是否可以执行成功
SELECT last_name,job_id,salary AS sal
FROMemployees ;
- 下面的语句是否可以执行成功
SELECT *
FROMemployees ;;
- 找出下面语句中的错误
SELECT employee_id,last_name,salary * 12 “ANNUAL SALARY”
FROMemployees ;
# ------------------
SELECT employee_id,last_name,salary * 12 "ANNUAL SALARY"
FROMemployees ;
- 显示表deparments的结构,并查询其中的全部数据
DESC departments;SECOND * FROM departments;
- 显示表employees中的全部job_id(不能重复)
SELECT DISTINCT job_id
FROMemployees ;
- 显示表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;
练习
- 查询员工工号为176的员工的姓名和部门号和年薪
SELECT last_name,department_id,salary
FROMemployees
WHERE employee_id = 176
;
- 查询工资大于12000的员工姓名和工资
SELECT last_name,salary
FROMemployees
WHERE salary > 12000 ;
- 选择工资不在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
- 选择公司中没有管理者的员工姓名以及job_id
SELECT last_name,job_id FROMemployees WHERE department_id IS NULL ;
- 选择公司中有奖金的员工姓名,工资和奖金级别
SELECT last_name,salary,commission_pct
FROMemployees
WHERE last_name IS NOT NULL AND salary != 0 AND commission_pct IS NOT NULL ;
- 选择员工姓名的第三个字母是a的员工姓名
SELECT last_name
FROMemployees
WHERE last_name LIKE '__a%' ;
- 选择按年薪降序的员工姓名、年薪
SELECT last_name,department_id,salary * 12 * (1 + IFNULL(commission_pct, 0)) 年薪
FROMemployees
ORDER BY 年薪 DESC ;
- 选择按月薪降序且月薪不在8000到17000的员工姓名、月薪
SELECT last_name,salary
FROMemployees
WHERE NOT (salary BETWEEN 8000 AND 17000)
ORDER BY salary DESC ;
- 选择邮箱中包含’e’的员工信息,并按邮箱长度降序,部门号升序
SELECT *
FROMemployees
WHERE email LIKE '%e%'
ORDER BY LENGTH(email) DESC,department_id ;
- 显示系统时间(日期+时间)
SELECT NOW();;
- 查询员工号,姓名,工资,以及工资提高20%的结果(new salary)
SELECT employee_id,salary,salary,salary * 1.2 newsalary
FROMemployees ;
- 将员工的姓名按首字母排序,并写出姓名的长度
SELECT last_name,LENGTH(last_name)
FROMemployees
ORDER BY SUBSTR(last_name, 1, 1) ;
- 做一个查询,产生下面的结果
<last_name> earns monthly but wants *3
SELECT CONCAT(last_name,'earns',salary,'monthly but wants',salary * 3)
FROMemployees ;
- 查询最大工资,最小工资,平均工资,总工资
SELECT salary,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROMemployees ;
- 查询工龄最长与工龄最小的员工天数差
DATEDIFF() 日期差
SELECT DATEDIFF(MAX(hiredate), MIN(hiredate))
FROMemployees ;
- 查询部门号为90的员工个数
SELECT COUNT(department_id = 90)
FROMemployees ;
- 查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT job_id,MAX(salary) mx_sal
FROMemployees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary) > 12000 ;
- 查询领导编号>105的每个领导收下的最低工资>5000的领导编号及最低工资
SELECT manager_id,MIN(salary)
FROMemployees
WHERE manager_id > 102
GROUP BY manager_id
HAVING MIN(salary) > 5000 ;
MySQL笔记 4月记相关推荐
- 涂抹mysql笔记-mysql复制特性
涂抹mysql笔记-mysql复制特性 mysql复制特性:既可以实现整个服务(all databases)级别的复制,也可以只复制某个数据库或某个数据库中的某个指定的表对象.即可以实现A复制到B(主 ...
- MySQL 笔记6 -- 函数与事务
MySQL 笔记6 – 函数与事务 MySQL 系列笔记是笔者学习.实践MySQL数据库的笔记 课程链接: MySQL 数据库基础入门教程 参考文档: MySQL 官方文档 SQL 教程 一.内置函数 ...
- 2021.09.27 MySQL笔记
2021.09.27 MySQL笔记 文章目录 2021.09.27 MySQL笔记 一.展示当前存在的所有数据库 二.使用(选中)一个数据库 三.创建一个数据表 四.查询并展示该数据库内的所有数据表 ...
- MySql 笔记(五)InnoDB引擎页分裂与页合并的原理
MySql 笔记(五)InnoDB引擎页分裂与页合并的原理 一.文件表(File-Table)结构 二.根,分支与叶子 三.页的内部原理 四.页合并的原理 五.页分裂的原理 六.主键的使用 七.总结 ...
- MySQL笔记常见函数
MySQL笔记常见函数 一.单行函数: 1.upper():转换成大写 2.lower(): 转换成小写 3.substr(): 截取子串 1.截取从指定索引处开始后面所有字符 select subs ...
- mysql事务手写笔记_兴奋了!阿里技术官手写“MySQL笔记”,传授你年薪百万级干货...
前言 MySQL重要吗?重要!为什么重要?因为它在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展.阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的.My ...
- 我的简书两月记:数据可视化
一.前言 "你无法衡量的东西,你也无法管理." 这是<精益数据分析>里提到的管理学大师彼得·德鲁克的一句话.我很认同. 很多人来简书写作,或长或久,可能无法准确量化自己 ...
- 涂抹mysql 完整_涂抹mysql笔记-管理mysql服务
$ /mysql/scripts/mysql_install_db --datadir=/mysql/data --basedir=/mysql support-files/mysql.server脚 ...
- 阿里工程师总结的《MySQL 笔记高清 PDF 》 开放下载
下面是阿里工程师整理的MySQL笔记,高清PDF版,涉及到mysql的方方面面,内容质量特别高,文末有获取方式. 获取方式,扫码发送:102
最新文章
- 建立CentOS 6.9 的Yum本地源
- Jquery中获取表单的值并提交
- 02_clickhouse安装,卸载,启动/关闭服务,交互式命令(数据库创建,数据导入,查询),批模式数据导入,MySQL接口操作ClickHouse,DBeaver可视化工具安装与使用(学习笔记)
- C++std命名空间和头文件详解
- 软考网络工程师学习笔记2-数据通信基础
- 研究解决CLOB字段IO问题的方法
- Unique Email Addresses
- TP5路由知识简单个人汇总
- 性能监视器 Performance Monitor-对SQLSERVER进行性能监控
- VMware虚拟机安装win10卡顿优化
- idea运行web项目光标乱跳
- 数字地图制作原则细节
- 二手书籍交易网站毕业设计,二手书籍买卖平台毕设,二手书籍交易市场平台设计与实现毕业设计论文分析
- java制作闪星星_Silverlight之我见——制作星星闪烁动画
- bom翻译中文_电器BOM表中英文对照
- 六、注册页功能制作《仿淘票票系统前后端完全制作(除支付外)》
- ftp 上传 工具,三款特别好用的ftp 上传 工具
- Chatgpt这么智能,以后会不会取代掉人类?
- 2022年HarmonyOS/OpenHarmony生态观察
- Java操作poi添加页眉页脚:字体_颜色_大小
热门文章
- RSA 2010年信息安全大会六大热点预测
- Ajax.Net之数据类型
- linux服务端修改EDT为东八区,EDT开发环境配置
- java发送jsp表格邮件_JSP 发送邮件
- php word 图片无法显示,Word文档不显示图片解决方法
- tperformancegraph_列车运行实绩图,train performance graph,音标,读音,翻译,英文例句,英语词典...
- 数据库设计的三大范式[学习笔记]
- 超详细 | 接口自动化测试总结与分享入门篇
- MATLAB 读取 各类文件
- (1 24) 3 java代码_《Java语言程序设计》测试题及参考答案(第1部分)