MySQL学习笔记

MySQl学习笔记

文章目录


在这里插入图片描述

在这里插入图片描述

第一章_初步认识

1概念

  • DB(Datebase) 数据库
  • DBMS(Database Management System) 数据库管理系统->软件
  • SQL(Structured Query Language)

在这里插入图片描述

2RDBMS与 非RDBMS(Relational,Document)

RDBMS

实质:二元关系,以行Row,列Column 形式存储

优势:方便在一个表以及多个表之间做非常复杂的数据查询

  • 行式数据库(Row based) 产品:Oracle(甲骨文),MySQL,SQL Server

非RDBMS(了解)

不需要完整的RDBMS,性能更高,成本更低

eg:排行榜,定时器

  • 键值型数据库 Key—Value
  • 文档型数据库 文件格式:XML JSON
  • 搜索引擎数据库 爬取大量信息 核心原理:“倒排索引” -->淘宝 京东
  • 列式数据库(Column based) 大量降低系统的I/O(消耗的内存) 产品:HBase
  • 图形数据库

3表,记录,字段

在这里插入图片描述

3-1表的关系

  • 四种:一对一关联、一对多关联、多对多关联、自我引用

4命令

在这里插入图片描述

#启动
	net start MySQL80
#关闭
	net stop MySQL80
#登录
	mysql -u root -p
	\n***
#端口号 
	-P
#主机名
	-h localhost/IP地址
#查询版本
	未登录
    	c:\>mysql -v
		c:\>mysql --version
	登录mysql	
		mysql> select version();

第二章_数据导入

  1. sourse 文件的全部路径名(命令行)

    mysql> source 路径.sql

  2. 图形化界面的工具直接导入

    sqlyog – 工具 – 执行SQL脚本 – 选中

第三章_MySQL基本的SELECT语句

1.SQL的分类

  • DDL:数据定义语言(Date Definition Language)

    CREATE		创建
    ALTER		添加列
    RENAME		重命名
    DROP		删除(结构+s)
    TRUNCATE	清空(数据)
    
  • DML:数据操作语言(Data Mainpulation Language)

    INSERT		添加记录
    DELETE		清空(数据)
    UPDATE		修改
    SELECT		查询(重中之重)
    
  • DCL:数据控制语言 (Data Control Language)

    COMMIT		提交数据
    ROLLBACK	撤销
    SAVEPOINT	保存点
    GRANT		获得相关权限
    REVOKE		撤回相关权限   
    

2.SQL语言的规则和规范

2-1基本规则

  • 每条命令以;或\ g 或 \G 结束

    • 执行单条命令时,可以不加 ;
    • 执行多条命令时,;只起分割作用,多条命令的最后一条命令也可以不加;
    • \g和\G表的横竖不同(不可在SQLyog中执行)
  • 关键字不能分开写/分行

  • 标点符号

    • (),“”,’‘,成对出现(#字符串,日期时间类型的变量需要使用一对 ’ ‘ 表示)

    • 英文

    • 列的别名,尽量使用双引号,不建议忽略as

2-2SQL大小写规范

  • Windows对大小写不敏感
  • Linux对大小写敏感
    • 数据库名,表名,表的别名,变量名是区分的
    • 关键字,函数名,列名(或字段名),列的别名(字段的别名)不区分

总结:全部注意大小写

  1. 数据库名,表名,表别名,字段名,字段别名 小写

  2. SQL关键字,函数名,绑定变量 大写

2-3注释

#单行注释(可以没用空格)
-- 单行注释(加空格)
/*
	多行注释
*/

2-4命名规则(第十章详细讲解)

  • 数据库、表名不得超过30个字符,变量名限制为29个

  • 必须只能包含A-Z,a-z,0-9,_共63个字符

  • 数据库名、表名、字段名等对象名中间不要包含空格

  • 同一个MysQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名

  • 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在sQL语句中使用 · (着重号)引起来

  • 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了

2-5数据的导入指令

-- 命令行
-- 登录myqsl,使用source导入
mysql> source d:\mysqldb.sql
--SQLyog
工具--执行脚本

3.基本的Select语句

3.1SELECT 字段1,字段2,…… FROM 表名**

SELECT 1+1,8*9;
SELECT 1+1,8*9 FROM DUAL;
-- #DUAL:伪表

SELECT * FROM employees;
-- # *:表中的所有的行列

SELECT first_name,last_name 
FROM employees;
-- 特定查询,逗号隔开

3.2列的别名

  1. 直接紧跟

  2. AS

  3. 双引号

    SELECT employee_id emp_id,last_name AS lname,department_id ”部 门“
    FROM employees;
    

3.3去除重复行

SELECT department_id
FROM employees;

#去重
SELECT DISTINCT department_id
FROM employees;

3.4空值参与运算

空值:NULL

  • NULL不等同于0,‘’
  • NULL参与运算 —> 结果为0
  • 可以烤炉运用 IFNULL

3-5着重号

`
  • 字段,表名与关键字重复时使用

3-5查询常数

SELECT 查询还可以对常数进行查询。对的,就是在 SELECT 查询结果中增加一列固定的常数列。这列的 取值是我们指定的,而不是从数据表中动态取出的。

SELECT 'asd',123,employee_id,first_name
FROM employees;
-- 其中'asd',123为常数

4.显示表结构

DESCRIBE 'table'
DESC ''
-- 显示表中字段的详细信息

5.过滤数据

  • 别名不能使用WHERE
SELECT * 
FROM employees
WHERE department_id = 90;

SELECT *
FROM employees
WHERE last_name = 'King';

-- 字符串一定要用''
-- 注意区分大小写!!!

第四章 运算符

1.算数运算符

1-1 ‘+ -’

  • 存在“隐式转换”:转换数值,不成功的话则看作0

  • ‘+’只表示 加法运算符,此时,会将字符串转换为数值(CONCAT())

  • 只要存在NULL,结果均为NULL

    SELECT 100 + '1'
    FROM DUAL;
    -- 结果:101
    
    SELECT 100 + 'a'
    FROM DUAL
    -- 结果 100
    
    SELECT 100 + NULL
    FROM DUAL
    -- 结果 NULL
    
    SELECR 'a'+'a' -- 转换失败,均为0
    FROM DUAL
    -- 结果 0
    

和浮点数进行运算,结果为浮点数

1-2‘* /’

  • ‘/’ 结果保留小数位

  • ‘DIV’ 不保留小数位

  • 分母不为0 否则为NULL

2.比较运算符

2-1 ‘=’

  • 存在“隐式转换”
  • 若俩边均为字符串,则根据ANSI进行比较
  • 只要存在NULL,结果均为NULL
SELECT 1='a',0='a'
FROM DUAL
-- 结果 0,1

SELECT 'a'='a','a'='b'
FROM DUAL
-- 结果:1,2

SELECT 'a'=NUll,NULL = NULL
FROM DUAL
-- 结果:NULL
-- 表示不存在

2-2’<=>'安全等于

  • 和’='用法相同
  • 不同:如果两边的值有任意一个为NULL, 或两边都为NULL,则结果为NULL。
  • NULL<=>NULL
SELECT NULL<=>NULL
-- 结果:1
-- 查询表中为NULL的数据

2-3’<> ,!= ,> ,< ,>= ,<=’

  • 用法大同小异
  • 与NULL参与运算,结果为NULL

2-4非符号类型的运算符

ISNULL IS NOT NULL ISNULL()**
SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NUll;

SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;

SELECT last_name,salary,commission_pct
FROM employees
WHERE  ISNULL(commission_pct);

SELECT last_name,salary,commission_pct
FROM employees
WHERE NOT commission_pct<=>NUll;
LEAST() GREATEST()
select LEAST(1,135,165,3.21,68541),GREATEST(1,135,165,3.21,68541)
between…(条件1)and…(条件2)
  • 下界小于上界
  • 包含边界
SELECT salary
FROM employees
WHERE salary BETWEEN 500 AND 3000

SELECT salary
FROM employees
WHERE salary NOT BETWEEN 500 AND 3000

in not in
SELECT employee_id, salary
FROM employees
WHERE salary  IN (3000,1000,6000 )

SELECT employee_id, salary
FROM employees
WHERE salary = 3000 OR salary= 1000 OR salary = 6000

like:模糊查询
  • “%”:匹配0个或多个字符。

  • “_”:只能匹配一个字符。

  • 查询单个

SELECT last_name
FROM employees
WHERE last_name LIKE '%a%'
-- 含a

SELECT last_name
FROM employees
WHERE last_name LIKE 'a%'
-- a开头

SELECT last_name
FROM employees
WHERE last_name LIKE 'a%'
-- a结尾
  • 查询多个 重点:容易忽视第二种情况
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%' AND last_name LIKE '%e%'

-- z
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%'
  • 精准查询第几个
SELECT last_name
FROM employees
WHERE last_name LIKE '_a%' 
-- 查询第二个是'a'
  • 转义字符的运用
SELECT last_name
FROM employees
WHERE last_name LIKE '_\_a%'
-- 查询第二个字符就是'_'

SELECT last_name
FROM employees
WHERE last_name LIKE '_&_a%' ESCAPE '&'
正则表达式 REGEXP
  • ‘^t’ 以t开头
  • ‘s$’ 以s结尾
  • ‘[amo]’ 含有a或m或o
  • ’t.o’ t与o之间字符不确定
SELECT 'Thomas' REGEXP '^t', 'Thomas'REGEXP 's$', 'Thomas' REGEXP '[amo]','Thomas'REGEXP 't.o'
FROM DUAL;

SELECT last_name,email,department_id
FROM employees
WHERE email REGEXP '[e]'

3.逻辑运算符

  • 或 OR ||
  • 且 AND && AND的优先级好于OR
  • 非 NOT !
  • 异或 XOR
SELECT last_name,email,salary,department_id
FROM employees
WHERE NOT commission_pct  Is NOT NULL;
-- 双重否定

4.位运算符(Bit)

  • & 按位与(位AND)

  • | 按位或(位OR)

  • ^ 按位异或(位XOR)

  • ~ 按位取反

  • << 按位左移

  • ‘>>’ 按位右移

  • 二进制下进行运算

SELECT 6 & 10
FROM DUAL;

6&10

00000110
00001010

00000010

第五章_排序和分页

1.排序

1.1排序语句

  • 升序:ASE(ascend)

  • 降序:DESC(descend)

SELECT last_name,salary
FROM employees
ORDER BY salary DESC

1-2排序规则

  • 如果没有使用排序操作,默认情况下是根据添加时间顺序排序显示的
  • 默认升序
  • 可以使用别名进行排序
  • 排序字母,按照先后顺序进行排列
SELECT last_name,salary*12 AS year_salary
FROM employees
ORDER BY year_salary

1-3WHERE声明在前,ORDER BY声明在后

SELECT last_name,salary
FROM employees
WHERE salary>10000
ORDER BY salary 

1-4.二级排序

SELECT last_name,salary,department_id
FROM employees
ORDER BY department_id ASC,salary DESC;
-- 先根据deparment_id 升序排列,department_id相同时再按照salary降序排列

2.分页

2_1简单排序

  • LIMIT
  • LIMIT = (pageSize-1)* pageNo
SELECT employee_id,last_name
FROM employees
LIMIT 40,20
-- 偏移量(pageNO),显示条数(pageSize)
-- LIMIT = (pageSize-1)* pageNO

2-2WHERE …ORDER BY …LIMIT声明顺序

  • LIMIT排最后
SELECT last_name,salary
FROM employees
WHERE salary>10000
ORDER BY salary DESC
LIMIT 0,10

2-3查询指定条数

  • 查找31,32条数据
SELECT employee_id,last_name,salary
FROM employees
WHERE salary IS NOT NULL
ORDER BY   employee_id
LIMIT 30,2
-- 第一条为0
-- 过滤掉多少数据就是偏移量

2-4LIMIT…OFFSET…

  • 8.0新特性
  • 偏移量和显示条数顺序不同
SELECT employee_id,last_name,salary
FROM employees
WHERE salary IS NOT NULL
ORDER BY   employee_id
LIMIT 2 OFFSET 30

拓展:2-5Oracle排序

  • rownum

第六章 多表查询

1.笛卡尔错误产生

  • 省略多个表的连接条件(或关联条件)
  • 连接条件(或关联条件)无效
  • 所有表中的所有行互相连接

2.多表查询

2-1连接条件

  • department_name 在表 'departmrnts’中
  • employee_id 在表 'employees’中
SELECT employee_id,department_name
FROM employees,departments
-- 连接条件
WHERE employees.`department_id`=departments.`department_id`

2-2查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表

  • 多表查询中,每个字段都指明其所在的表
SELECT employees.employee_id,departments.department_name,departments.department_id
FROM employees,departments
WHERE employees.`department_id`=departments.`department_id`

2-3使用别名增加可读性

  • 如果起了别名,在SELECT或WHERE中必须使用别名
SELECT emp.employee_id,dep.department_name,dep.department_id
FROM employees AS emp,departments AS dep
WHERE emp.`department_id`=dep.`department_id`  
-- 内在逻辑 先会执行FROM语句,使用别名覆盖原名

2-4三表连接

  • 注意加AND
  • n个表连接需要(n-1)个连接条件
SELECT employees.`last_name`,departments.`location_id`,locations.`city`
FROM employees,departments,locations
WHERE employees.`department_id`=departments.`department_id`
AND departments.`location_id`=locations.`location_id`

3多表查询的分类

角度1:等值连接 VS 非等值连接

角度2:自连接 VS 非自连接

角度3:内连接 VS 外连接

3.1等值连接 VS 非等值连接
-- 非等值连接
SELECT t1.`last_name`,t2.`grade_level`
FROM employees t1,job_grades t2
-- WHERE t1.`salary` BETWEEN t2.`lowest_sal`AND t2.`highest_sal`
WHERE t1.`salary`>=t2.`lowest_sal`AND t1.`salary`<t2.`highest_sal`

3.2自连接 VS 非自连接

-- 自连接
SELECT t1.employee_id AS '喽喽',t1.last_name,t2.employee_id AS ‘BOSS’,t2.last_name
FROM employees AS t1,employees AS t2
WHERE t1.`manager_id`=t2.`employee_id`

3-3内连接 VS 外连接

  • 内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

  • 外连接: 两个表在连接过程中除了返回满足连接条件的行以外 还返回左(或右)表中不满足条件的 行

    这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。

3-3-1外连接的分类

  • 左外连接: 两个表在连接过程中除了返回满足连接条件的行以外 还返回 左表 中不满足条件的 行
  • 右外连接: 两个表在连接过程中除了返回满足连接条件的行以外 还返回 右表 中不满足条件的 行

第六章 SQL99实现多表查询

1,SQL99不支持该语法实现外连接

SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.`department_id`= d.`department_id`(+)
-- SQL92语法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-apkhNhZL-1650074101085)(C:\Users\79816\AppData\Roaming\Typora\typora-user-images\image-20220227123558464.png)]

2.SQL99实现内连接

  • JOIN
  • INNER JOIN
  • CROSS JOIN
SELECT e.employee_id,last_name,department_name
FROM employees e 
JOIN departments d ON e.`department_id`=d.`department_id`

SELECT e.employee_id,last_name,department_name
FROM employees e 
INNER JOIN departments d ON e.`department_id`=d.`department_id`

SELECT e.employee_id,last_name,department_name
FROM employees e 
CROSS JOIN departments d ON e.`department_id`=d.`department_id`

3.SQL99实现外连接

  • 逻辑性更强

  • 分清左表右表(JOIN后为右表)

  • LEFT——查询所有左表

  • RIGHT——查询所有右表

    SELECT e.employee_id,last_name,department_name
    FROM employees e 
    LEFT OUTER JOIN departments d ON e.`department_id`=d.`department_id`
    -- 查询所有员工对于的部门(有的员工可能没有部门)
    -- OUTER可以省略
    
    SELECT e.employee_id,last_name,department_name
    FROM employees e 
    RIGHT JOIN departments d ON e.`department_id`=d.`department_id`
    -- 查询所有部门(有的部门可能没有人)
    
    SELECT last_name,department_name,city
    FROM employees 
    	JOIN departments ON employees.`department_id`=departments.`department_id`
    		JOIN locations ON departments.`location_id`=locations.`location_id`
    -- 嵌套		
    

4.满外连接

SELECT e.employee_id,last_name,department_name
FROM employees e 
FULL OUTER JOIN departments d ON e.`department_id`=d.`department_id`
-- MySQL不支持 Orcale支持

5.MySQL实现满外连接 UNION和UNION ALL的使用

  • 执行UNION ALL语句所需要的资源比UIION语句少,尽量使用UNION ALL提高查询效率

  • UNION:会执行去重

  • UNION ALL:不会执行去重

在这里插入图片描述

-- 中表:内连接
SELECT t1.`last_name`,t1.`department_id`
FROM employees t1
join departments t2 on t1.`department_id`=t2.`department_id`

-- 左上:左外连接
SELECT t1.`last_name`,t1.`department_id`
FROM employees t1
LEFT JOIN departments t2 on t1.`department_id`=t2.`department_id`

-- 右上:右外连接
SELECT t1.`last_name`,t1.`department_id`
FROM employees t1
RIGHT JOIN departments t2 ON t1.`department_id`=t2.`department_id`

-- 左中:左上基础去除中间
SELECT t1.`last_name`,t1.`department_id`
FROM employees t1
LEFT JOIN departments t2 ON t1.`department_id`=t2.`department_id`
WHERE t2.`department_id`is NULL

-- 右中:右上基础去除中间
SELECT t1.`last_name`,t1.`department_id`,t2.`department_id`
FROM employees t1
RIGHT JOIN departments t2 ON t1.`department_id`=t2.`department_id`

-- 左下图:满外连接
-- 1左上图加右中图
SELECT t1.`employee_id`,t1.`last_name`
FROM employees t1
LEFT JOIN departments t2 ON t1.`department_id`= t2.`department_id`
UNION ALL
SELECT t1.`employee_id`,t1.`last_name`
FROM employees t1
RIGHT JOIN departments t2 ON t1.`department_id`= t2.`department_id`
WHERE t1.department_id IS NULL;

-- 2左中图加右上图
SELECT employee_id,last_name,t1.`department_id`
FROM employees t1
LEFT JOIN departments t2 on t1.`department_id`=t2.`department_id`
WHERE t1.`department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,t1.`department_id`
FROM employees t1
RIGHT JOIN departments t2 ON t1.`department_id`=t2.`department_id`

-- 右下图
-- 左中加右中
SELECT t1.`last_name`,t1.`department_id`
FROM employees t1
LEFT JOIN departments t2 ON t1.`department_id`=t2.`department_id`
WHERE t2.`department_id`is NULL
UNION ALL
SELECT t1.`last_name`,t1.`department_id`
FROM employees t1
RIGHT JOIN departments t2 ON t1.`department_id`=t2.`department_id`
WHERE  t1.`department_id` IS NULL

SQL99语法新特性

1.自然连接

  • 自动查询俩张表中所有相等的字段,然后进行等值连接
  • 缺点:不够灵活
SELECT t1.`employee_id`,t1.`last_name`	
FROM employees t1
JOIN departments t2 ON t1.`department_id`= t2.`department_id`
AND t1.`manager_id`=t2.`manager_id`

SELECT last_name,department_name
FROM employees 
NATURAL JOIN departments

2.USING

  • 查找俩表中表名相同的情况
  • 不能用于自连接
-- 原本写法
SELECT t1.`employee_id`,t1.`last_name`	
FROM employees t1
JOIN departments t2 ON t1.`department_id`= t2.`department_id`
AND t1.`manager_id`=t2.`manager_id`

-- USING
SELECT t1.`employee_id`,t1.`last_name`	
FROM employees t1
JOIN departments t2 USING(department_id,manager_id)

3.习题易错

  • 俩次都需要加LEFT
SELECT last_name , department_name , d.location_id , city
FROM employees e
LEFT OUTER JOIN departments d ON e.`department_id` = d.`department_id`
LEFT OUTER JOIN locations l ON d.`location_id` = l.`location_id`
WHERE commission_pct IS NOT NULL;

第七章_单行函数

  • 就受参数返回一个结果
  • 只对一 行进行交换
  • 每行返回一个结果
  • 可以嵌套
  • 参数可以是一列或者一个值

1.数值函数

1.1数值函数

ABS(x)					返回X的绝对值
SIGN(x)					返回X的符号。正数返回1,负数返回-1,0返回0
PI()					返回圆周率的值

CEIL(X),CEILING(x)		 返回大于或者等于某个值的最小整数
FLOOR(x)				返回小于或者等于某个值的最大整数

LEAST(e1,e2,e3..)		 返回列表中的最小值
GREATESRT(e1,e2,e3..)	 返回列表中的最小值

MOD(x,y)				返回x除以y后的余数

RAND()					返回0~1的随机值(不止整数)
RAND(x)					返回0~1的随机值,其中x的值用作种子值,相同的x值会产生相同的随机数

ROUND(x)				返回一个对x的值进行四舍五入后,最接近于x的整数
ROUND(X,y)				返回一个对x的值进行四舍五入后最接近x的值,并保留到小数点后面Y位(y可以为负数)
TRUNCATE(x,y)			返回数字x截断为y位小数的结果
SQRT(X)				    返回x的平方根。当x的值为负数时,返回NULL

1.2角度与弧度互换函数

RADIANS(x)		角度转换为弧度,x为角度值
DEGREES(x)		弧度转换为角度

1.3三角函数

SIN(x)		返回x的正弦值,其中,参数x为弧度制
ASIN(x)		返回x的反正弦,即获取正弦为x的值。如果x的值不在-1~1之间,返回NULL
COS(x)		返回x的余弦值,其中,参数x为弧度制
ACOS(X)		返回x的反余弦值,即获取余弦为x的值。如果x的值不在~1—1之间,返回NULL
TAN(x)		返回x的正切值,其中,参数x为弧度制
ATAN(x)		返回x的反正切值,即返回正切值为x的值
ATAN2(m,n)	返回俩个参数的反正切值
COT(x)		返回x的余切值,其中,x为弧度制

1.4指数和对数

pow(x,y),power(X,Y)		返回x的y次方
EXP,(x)				   返回e的x次方,e=2.718
LN(X),LOG(x)		    返回以e为底的x的对数,x<=0时,返回NULL
LOG10(X)			    返回以10为底的X的对数,x<=0时,返回NULL
LOG2(X)					返回以2为底的X的对数,x<=0时,返回NULL

1.5进制转换

BIN(x)			返回x的二进制编码
HEX(X)			返回x的十六进制编码
OCT(x)			返回x的八进制编码
CONV(x,f1,f2)	 返回f1进制数变成f2进制数

2.字符串函数

ASCII(s)				返回字符串s中的第一个字符的ASCll码值
CHAR_LENGTH(S)			 返回字符串s的字符数。与CHARACTER_LENGTH(s)相同
LENGTH(s)				 返回字符串s的字节数,和字节集有关
CONCAT(s1.s2...sn)	 	  连接s1,s2...sn为一个字符串
CONCAT_WS(x,s1,s2...sn)	   同CONCAT()函数,但每个字符之间会加上x
INSERT(str,idx,len,replacestr)	将字符串str从第idx位置开始,len个字符长的子串替换为字符串replacestr(字符串索引从1开始)
REPLACE(str,a,b)		将字符串b替换字符串str中所有出现的字符串a

UPPER(s)或UCASE(s)		将字符串s的所有字母转成大写
LOWER(s)或LCASE(s)		转小写

LEFT(str,n)				返回字符串str最左边的n个字符
RIGHT(str,n)			返回字符串str最右边的n个字符

-- 左右填充对齐
LPAD(str,len,pad)		用字符串pad对str最左边进行填充,直到str的长度为len个字符
RPAD(str,len,pad)		用字符串pad对str最右边进行填充,直到str的长度为len个字符

LTRIM(s)				去掉字符串s左侧的空格
RTEIM(s)				去掉字符串s右侧的空格
TRIM(s)					去掉字符串开始与结尾的空格
TRIM(s1 FROM s)			去掉字符串s开始与结尾的s1
TRIM(LEADING s1 FROM s)	 去掉字符串s开始处的s1
TRIM(TRAILING s1 FROM s) 去掉字符串s结尾处的s1

REPEAT(str,n)			返回str重复n次的结果
SPACE(n)				返回n个空格

STRCMP(s1,s2)			比较字符串s1,s2的ASCII码值的大小

SUBSTR(s,index,len)		返回从字符串s的index位置起len个字符,作用与SUBSTRING(s,n,len),MID(s,n,len)相同
LOCATE(substr,str)		返回字符串substr在字符串str中首次出现的位置,作用
					   与POSITION(substr IN str),INSTR(str,sunstr)相同。未找到,返回0
ELT(m,s1,s2,...,sn)		返回指定位置的字符串,如果m=1,则返回s1,如果m=2,则返回s2,如果m=n,则返回sn
FIELD(s,s1,s2,...,sn)	返回字符串s在字符串列表第一次出现的位置
FIND_IN_SET(s1,s2)		返回字符串s1在字符串s2中出现的位置,其中,字符串s2是一个以逗号分隔的字符串
REBERSE(s)				返回s反转后的字符串

NULLIF(value1,value2)	比较俩个字符串,如果value1与value2相等,则返回NULL,否则返回value1
SELECT CHAR_LENGTH('我们'),LENGTH('我们')
-- 结果为2,6,一个返回字符个数,一个返回字符集个数

SELECT last_name ,salary
FROM employees
WHERE LOWER(last_name)='king';
-- 查询last_name全部小写变成king的项

3.日期和时间函数(重点 3-1 3-6 3-7)

3.1获取时间,日期

CURDATE(),CURRENT_DATE()										 返回当前日期,包含年月日
CURTIME(),CURRENT_TIME()										 返回当前时间,只包含时分秒
NOW()/SYSDATE()/CURRENT_TIMRSTAMP()/LOCALTIME()/LOCALTIMESTAMP()	 返回当前系统日期和时间
UTC_DATE()						   								返回UTC(世界标准时间)日期
UTC_TIME()						   								返回UTC时间

3.2日期与时间戳的转换

UNIX_TIMESTAMP()			以UNIX为时间戳的形式返回当前时间。SELECT UNIX_TIMESTAMP()->1634348884
UNIX_TIMESTAMP(DATE)		将时间date以UNIX时间戳的形式返回
FROM_UNIXTIME(timestamp)	将UNIX时间戳的时间转换为普通格式的时间

3.3获取月份,星期,星期数,天数

YEAR(date) / MONTH(date) / DAY(date) 		  返回具体的日期值
HOUR(time) / MINUTE(time) /SECOND(time)		  返回具体的时间值

MONTHNAME(date) 							返回月份:January,...
DAYNAME(date) 								返回星期几:MONDAY,TUESDAY.....SUNDAY
WEEKDAY(date) 								返回周几,注意,周1是0,周2是1,。。。周日是6
QUARTER(date) 								返回日期对应的季度,范围为1~4

WEEK(date) / WEEKOFYEAR(date) 				  返回一年中的第几周
DAYOFYEAR(date) 							返回日期是一年中的第几天
DAYOFMONTH(date) 							返回日期位于所在月份的第几天
DAYOFWEEK(date)								返回周几,注意:周日是1,周一是2,。。。周六是7
SELECT WEEKDAY(NOW()),WEEK(NOW()),DAYOFWEEK(NOW()) 
-- 6 11 1 NOW(2022-03-13 16:51:23 周日)

3.4日期的操作函数

EXTRACT(type FROM date)		返回指定日期中特定的部分,type指定返回的值

在这里插入图片描述

3.5时间和秒钟转换的函数

TIME_TO_SEC(time)		将 time 转化为秒并返回结果值。转化的公式为: 小时*3600+分钟*60+秒
SEC_TO_TIME(seconds) 	将 seconds 描述转化为包含小时、分钟和秒的时间

3.6计算日期和时间的函数

DATE_ADD(datetime, INTERVAL expr type)
ADDDATE(date,INTERVAL expr type)			返回与给定日期时间相差INTERVAL时间段的日期时间

DATE_SUB(date,INTERVAL expr type)
SUBDATE(date,INTERVAL expr type)			返回与date相差INTERVAL时间间隔的日期

在这里插入图片描述

SELECT DATE_ADD(NOW(),INTERVAL -1 YEAr),DATE_SUB(NOW(),INTERVAL 1 YEAR)
-- 一加一减 等效 可以直接用负数代替

SELECT ADDDATE('2022-3-14',INTERVAL '1-1' year_month)
-- 注意写法
ADDTIME(time1,time2)			返回time1加上time2的时间,当time2为一个数字的时,代表的时秒,可以为负
SUBTIME(time1,time2)			返回time1减去time2的时间
SELECT ADDTIME('2022-03-14 16:07:46','-1:1:1'),SUBTIME('2022-03-14 16:07:46','1:1:1')
-- 使用等号,二者等效

DATEDIFF(date1,date2)			返回二者间隔天数
TIMEDIFF(time1,time2)			返回二者时间间隔
SELECT DATEDIFF(NOW(),'2020-3-14'),TIMEDIFF(NOW(),'2020-3-14 0:0:0')

FROM_DAYS(N)					返回从0000年1月1日起,N天以后的日期
TO_DAYS(date)					返回日期date距离0000年1月1日的天数
SELECT FROM_DAYS(366),TO_DAYS(NOW())

LAST_DAT(date)					返回date所在月份的最后一天的日期

MAKEDATE(year,n)				某年中第某天的日期
MAKETIME(hour,minute,second)	 将给定的小时,分钟和秒组合成时间并返回

PERIOD_ADD(time,n)				返回time加上n的时间
SELECT PERIOD_ADD(2022010203040506,10)
-- 注意写法
-- 时间进行运算后均为该格式

3.6日期的格式化和解析

  • 格式化:日期—>字符串
  • 解析:逆过程
格式化
DATE_FROMAT(date,fmt)				按照字符串fmt格式化日期date值
TIME_FROMAT(time,fmt)				按照字符串fmt格式化时间time值

在这里插入图片描述

select DATE_FORMAT(now(),'%Y-%M-%D'),DATE_FORMAT(now(),'%y-%m-%d')
-- 注意''

在这里插入图片描述

SELECT DATE_FORMAT(CURTIME(),'%H-%i-%s')
-- 注意''

在这里插入图片描述

SELECT DATE_FORMAT(NOW(),'%Y-%M-%D %h:%i:%s %W %j %T')
-- 简单了解 按需
解析
  • 一一对应
STR_TO_DATE(str,fmt)				按照字符串fmt对str进行解析,解析为一个日期
SELECT str_to_date('2022-March-14th 04:20:41 Monday 073','%Y-%M-%D %h:%i:%s %W %j')
GET_FROMAT
GET_FROMAT(date_type,format_type)	 返回日期字符串的显示格式(不同国家时间格式查询)

在这里插入图片描述

4.流程控制函数

IF(value,1,2)				value为TRUE,返回1,否则返回2
IFNULL(value1,value2)		value1不为NULL则返回1,否则返回2
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2...[ELSE resultn]END	if...else
CASE expr WHEN													  switch...case...
SELECT last_name,salary,IF(salary>=6000,'高工资','低工资')
FROM employees

SELECT last_name,salary*IFNULL(commission_pct,0)
FROM employees


SELECT last_name,salary,case WHEN salary >= 15000 THEN '111'
			      		   WHEN salary >= 10000 THEN '222'
			    		   WHEN salary >= 80000 THEN '333'
			    		   ELSE '555' END 'details',department_id
-- 可以去除ELSE ,注意再添加的项目位置                 

-- 二者差别
SELECT last_name,department_id,salary,CASE WHEN 10 THEN salary*1.1
					   				    WHEN 20 THEN salary*1.2
					   				    WHEN 30 THEN salary*1.3
					   				    ELSE salary*1.4 END "details"
FROM employees

SELECT last_name,department_id,salary,CASE department_id WHEN 10 THEN salary*1.1
							   						WHEN 20 THEN salary*1.2
													WHEN 30 THEN salary*1.3
													ELSE salary*1.4 END "details"
FROM employees

5.加密与解密函数(了解)

MDS5(str)	返回字符串str的md5加密后的值,也是一种加密方式。若参数为NULL,则会返回NULL
SHA(str)	从原明文密码str计算并返回加密后的密码字符串,当参数为NULL时,返回NULLSHA加密算法比MD5更加安。
-- 二者不可逆
PASSWORD(str)	返回字符串str的加密版本,41位长的字符串。加密结果 不可逆 ,常用于用户的密码加密
-- 8.0中弃用
ENCODE(value,password_seed)		返回使用password_seed作为加密密码加密value
DECODE(value,password_seed)		对应解密	
-- 8.0不支持

6.MySQL信息函数

version()				返回当前MySQL的版本号
CONNECTION_ID			返回当前MySQL服务器的连接
DATABASE(),SCHEMA()		返回MysQL命令行当前所在的数据库
USER(),CURRENT_USER(),SYSTEM_USER(),SESSION_USER()		返回当前连接MySQL的用户名
CHARSET(value)			返回字符串value自变量的字符集
COLLATION(value)		返回字符集value的比较规则

7.其他函数(了了解)

FORMAT(value,n)					返回对数字value进行格式化后的结果数据。n表示 四舍五入 后保留到小数点后n位
CONV(value,from,to) 			将value的值进行不同进制之间的转换
INET_ATON(ipvalue) 				将以点分隔的IP地址转化为一个数字
INET_NTOA(value) 				将数字形式的IP地址转化为以点分隔的IP地址
BENCHMARK(n,expr)				将表达式expr重复执行n次。用于测试MySQL处理expr表达式所耗费的时间
CONVERT(value USINGchar_code)	 将value所使用的字符编码修改为char_code

第八章_聚合函数

1.常见聚合函数

1.1 AVG / SUM

  • 只适用于数值类型的字段
  • 计算不考虑NULL
SELECT AVG(salary),SUM(salary),AVG(salary) *107
FROM employees

1.2 MAX / MIN

  • 适用于数值类型,字符串类型,日期时间类型的字段
SELECT MAX(salary),MIN(salary),MAX(hire_data)
FROM employees

1.3 COUNT

  • 作用:计算指定字段在查询结果中出现的个数
SELECT COUNT(employee_id),COUNT(salary),COUNT(1)
FROM employees
计算表中又多少条记录
  1. COUNT(1) (效率高)
  2. COUNT(*) (效率高)
  3. COUNT(具体字段):不一定正确

注意:计算字段中出现的个数中,不计算NULL

SELECT AVG(salary),SUM(salary)/COUNT(1),
AVG(commission_pct),SUM(commission_pct)/COUNT(commission_pct),SUM(commission_pct)/107
FROM employees
-- AVG=SUM/COUNT 永远成立

注意:根据需求确定分母

SELECT AVG(commission_pct),SUM(commission_pct)/ COUNT(IFNULL (commission_pct,0)) 
FROM employees

1.4其他

2. GROUP BY

2.1单个分组

  • 需求:查询各个部门的平均工资,最高工资
SELECT  department_id,AVG(salary)
FROM employees
GROUP BY department_id

2.2使用多个分组

  • SELECT中的字段一定会出现在GROUP BY中
  • GROUP BY中出现的字段不一定出现在SELECT中
SELECT  job_id,department_id,AVG(salary)
FROM employees
GROUP BY job_id,department_id

SELECT  department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id,job_id
-- 二者查询结果相同 
-- 分组前后顺序不同

2.3声明顺序

  • GROUP BY 声明在FROM后面,WHERE后面,ORDER BY 前面,LIMIT前面

2.4 新特性:WITH ROLLUP

  • 注意:和ORDER BY使用矛盾(8.0可以使用)
SELECT  department_id,AVG(salary)
FROM employees
GROUP BY department_id WITH ROLLUP
-- 最后计算了平均值

3. HAVING

3.1基本使用

  • 作用:过滤数据
  • 如果过滤条件中使用了聚合函数,则必须使用HAVING来代替WHERE。否则,报错
  • HAVING 必须声明在GROUP BY后面
  • HAVING使用不必须有GROUP BY
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000
  • 当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中
  • 当过滤条件中没有聚合函数时,则次过滤条件声明在WHERE和HAVING中都可以,但WHERE效率高
-- 执行效率高
SELECT department_id,MAX(salary)
FROM employees
WHERE department_id IN (10,20,30)
GROUP BY department_id
HAVING MAX(salary)>10000

SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 AND department_id IN (10,20,30)

3.2 WHERE和HAVING的对比

  1. 从使用范围上讲:HAVING的适用范围更广
  2. 如果过滤条件中没有聚合函数,这种情况下,WHERE的效率更高

4. SQL 底层执行原理

4.1 SELECT 语句的完整结构

SQL92
SELECT  ... , ... , ...(存在聚合函数)
FROM ... , ... , ...
WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件
GROUP BY ... , ... (AEC/DESC)
LIMIT ... , ...

SQL99
SELECT  ... , ... , ...(存在聚合函数)
FROM ... 
(LEFT/ RIGHT )JOIN ... ON 多表的连接条件
JOIN ... ON 
WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件
GROUP BY ... , ... (AEC/DESC)
LIMIT ... , ...

4.2SQL语句的执行过程

FROM ... , ... 
->ON
->(LEFT, RIGHT JOIN)
->WHERE
->GROUP BY
->HAVING
->SELECT
->DISTINCT
->ORDER BY
->LIMIT

第九章_子查询

1.基本使用

1.1简单引入

SELECT t2.last_name,t2.salary
FROM employees t1,employees t2
WHERE t1.`last_name` = 'abel' AND t2.`salary`>t1.`salary`
-- 自连接s

SELECT last_name,salary
FROM employees
WHERE salary>(	SELECT salary
			   FROM employees
			   WHERE last_name='Abel')

1.2.称谓规范:

  • 外查询 (主查询)

  • 内查询(子查询)

1.3基本使用

  • 子查询在主查询之前一次执行
  • 子查询的结果被主查询使用
  • 子查询要在括号内
  • 讲子查询放在比较条件的右侧–>可读性
  • 单行操作符对应单行子查询,多行操作符对应多行子查询

2.子查询的分类

2.1查询返回条目数

  • 单行子查询
  • 多行子查询

2.2内查询是否被执行多次

  • 相关子查询
  • 不相关子查询

eg : 查询工资大于本人所在部门的平均工资的员工信息

​ 查询工资大于本公司的平均工资的员工信息

3.单行子查询

3.0单行比较操作符

= > >= <>

3.1一对一

SELECT last_name,job_id,salary
FROm employees
WHERE salary=(	
		SELECT min(salary)
		FROM employees)	

3.2多对多

SELECT employee_id,manager_id,department_id
FROm employees
WHERE	(department_id,manager_id)=(	
					SELECT department_id,manager_id
					FROM employees
					WHERE employee_id = 141)

3.3. HAVING 中的子查询

SELECT department_id,MIN(salary)
FROm employees
GROUP BY department_id
HAVing MIN(salary)>(	SELECT MIN(salary)
			FROm employees
			WHERE department_id = 100)	
AND department_id IS NOT NULL	

3.4 CASE中的子查询

SELECT 	employee_id,last_name,CASE department_id WHEN department_id= (
									SELECT department_id
									FROM departments
									WHERE location_id = 1800)
						THEN 'Canada'
						ELSE 'USA'
						END
FROM employees 

3.5 子查询中的空值查询

  • 不存在,子查询结果为空
SELECT last_name,salary
FROM employees
WHERE salary>(	SELECT salary
		FROM employees
		WHERE last_name='Thomas')

3.6.非法使用子查询

-- 错误
SELECT employee_id,last_name
FROM employees
WHERE salary = (
		SELECT MIN(salary)
		FROM employees
		GROUP BY department_id)	
		
-- 正确
-- 涉及多行子查询
SELECT employee_id,last_name
FROM employees
WHERE salary IN (
		SELECT MIN(salary)
		FROM employees
		GROUP BY department_id)	

4.多行子查询

  • 也称:集合比较子查询
  • 内查询返回多行
  • 使用多行比较操作符

4.1多行比较操作符

IN		等于列表中的任意一个
ANY		需要和单行比较操作符一起使用,和子查询返回的某一个值比较
ALL		需要和单行比较操作符一起使用,和子查询返回的所以值比较
SOME	实际上是ANY的别名,作用相同
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE job_id <> 'IT_PROG'
AND salary < ANY (	
			SELECT salary
			FROM employees
			WHERE job_id = 'IT_PROG')

4.2 聚合函数不能嵌套

SELECT MIN(avg_sal)
FROM (	 SELECT AVG(salary) avg_sal
		FROM employees
		GROUP BY department_id
)dept_avg_sal
-- 将查询结果看作是table 来进行查询
-- 要加别名
方式1:
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
				SELECT MIN(avg_sal)
				FROM (	SELECT AVG(salary) avg_sal
						FROM employees
						GROUP BY department_id
					)dept_avg_sal
					)
方式2:
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL (
			SELECT AVG(salary) avg_sal
			FROm employees
			GROUP BY department_id	
		)

4.3空值查询

  • 目的:查询员工除 管理者之外的人
  • 错误原因:子查询中有NULL
SELECT last_name
FROM employees
WHERE employee_id NOT IN (
					SELECT manager_id
					FROM employees
);

5.相关子查询

5.1常规

1
SELECT last_name,salary,department_id
FROm employees t1
WHERE salary > (	
			SELECT AVG(salary)
			FROm employees t2
			GROUP By department_id
			HAVING department_id = t1.department_id
			 )
2			 
SELECT last_name,salary,department_id
FROm employees t1
WHERE salary > (	
			SELECT AVG(salary)
			FROM employees t2
			WHERE department_id  = t1.department_id
			 )

5.2在FROM中进行子查询

SELECT last_name,department_id
FROM (	
	SELECT AVG(salary) avg_sal,department_id
	FROM employees t2
	GROUP BY department_id
)t_depart_avg_sal
JOIN employees  USING(department_id) 
WHERE salary > t_depart_avg_sal.avg_sal AND department_id = t_depart_avg_sal.department_id             

5.2在ORDER BY 中进行子查询

SELECT employee_id,salary
FROM employees t1
ORDER BY (	 SELECT department_name
			FROM departments t2			
			WHERE t1.department_id=	t2.department_id
		)

5.3子查询所在位置

在SELECT中,子查询所在位置极其灵活,除了在GROUP BY 和LIMIT之外,其他位置都可以声明子查询

SELECT 	employee_id,last_name,job_id
FROm employees	t1
WHERE 2 <=  (		
		SELECT count(*)
		FROM job_history t2
		WHERE t1.employee_id = t2.`employee_id`	
		)

5.4 EXISTS 和NOT EXISTS关键字

EXISTS

  • 如果在子查询中不满足条件的行
    • 条件返回FALSE
    • 继续在子查询中查找
  • 如果在子查询中存在满足条件的行
    • 停止查找返回TRUE

NOT EXISTS

  • NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE
-- 自连接		
SELECT DISTINCT t2.employee_id,t2.last_name,t2.job_id,t2.department_id
FROM employees t1
JOIN employees t2 ON t2.employee_id = t1.manager_id 

-- 子查询
SELECT 	employee_id,last_name,department_id
FROM employees
WHERE employee_id IN (	
			SELECT DISTINCT manager_id
			FROM employees
			)
			
-- 使用EXISTS	
SELECT employee_id,last_name,job_id,department_id
FROM employees t1
WHERE EXISTS (	
		SELECT *
		FROM employees t2
		WHERE t1.employee_id = t2.manager_id
		)
-- NOT EXISTS的使用
SELECT department_id,department_name
FROM departments t1
WHERE NOT EXISTS(	
			SELECT *
			FROM employees t2
			WHERE t1.department_id = t2.department_id
			)

5.5 更新数据

UPDATE table1 alias1
SET column = (	
				SELECT expression
				FROM table2 alias2
				WHERE alias1.column = alias2.column)

5.6删除数据

DELETE FROM table1,table2
WHERE column oprator(	
					SELECT expression
					FROM table1,table2
					WHERE alias1.column = alias2.column)

第十章_创建和管理表

1. 基础知识

1.1 一条数据存储的过程

在这里插入图片描述

1.2 标识符命名规则

  • 数据库名、表名不得超过30个字符,变量名限制为29
  • 必须只能包含 A–Z, a–z, 0–9, _共63个字符
  • 数据库名、表名、字段名等对象名中间不要包含空格 同一个MySQL软件中,数据库不能同名;
  • 同一个库中,表不能重名;同一个表中,字段不能重名
  • 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使 用`(着重号)引起来 保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据 类型在一个表里是整数,那在另一个表里可就别变成字符型了

1.3 MySQL中的数据类型

在这里插入图片描述

2.创建和管理数据库

2.1创建

  • 方法1:创建数据库 --使用默认的字符集
CREATE DATABASE 数据库名
  • 方法2:创建数据库并指定字符集 --指明了要创建的数据库字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集
  • 方法3:判断数据库是否已经存在,不存在则创建数据库( 推荐 )
CREATE DATABASE IF NOT EXISTS

2.2管理数据库

-- 查看连接中数据库
SHOW DATABASES

-- 切换数据库
USE mytest2

-- 查看当前数据库中保存的数据表
SHOW TABLES

-- 查看当前使用的数据库
SELECT DATABASE() FROM DUAL

-- 查看指定数据库下保存的数据表
SHOW TABLES FROM mysql

2.3修改数据库(一般不修改)

  • 一般修改字符集
ALTER DATABASE mytest2 CHARACTER SET 'utf8';

2.4删除数据库

DROP DATABASE  mytest2
DROP DATABASE IF EXISTS mytest2

3.创建数据表

3.1方法一:“白手起家”

  • 创建
    • CREATE TABLE权限
    • 存储空间
  • 必须指定:
    • 表名
    • 列名(或字段名),数据类型,长度
CREATE TABLE IF NOT exists myemp1(
id INT,
emp_name VARCHAR(15),-- 必须指明长度
hire_date DATE
);
'注意' 如果创建表时没有指明使用的字符集,则默认使用表所在的数据库的字符集
  • 查看表结构
describe myemp1
desc myemp1
  • 查看表数据
SELECT *
FROM myemp1

3.2方法2:基于现有的表,同时会导入数据

CREATE TABLE myemp3
AS
SELECT employee_id,last_name,salary
FROM employees
  • 创建新表同时导入数据
CREATE TABLE mytest4
AS
SELECT t1.employee_id ID,t1.last_name lname,t1.department_id
FROM employees t1
JOIN departments t2 ON t1.department_id=t2.department_id
-- 注意:新表的名称为别名
  • 创建新表不导入数据
CREATE TABLE employees_copy2
AS
SELECT *
FROM employees
WHERE department_id>10000
WHERE 1=2
-- 限制条件不存在

4.修改表

4.1添加一个字段

  • 默认添加最后一个
ALTER TABLE myemp1
ADD salary DOUBLE(10,2)
-- 10位,8位整数位,2位小数位
  • 锁定位置
ALTER TABLE myemp1
ADD phone_number VARCHAR(20) FIRST
-- 第一个
ALTER TABLE myemp1
ADD email VARCHAR(45) AFTER emp_name

4.2修改一个字段:数据类型,长度,默认值

  • 一般不进行修改数据类型
ALTER TABLE myemp1
MODIFY emp_name VARCHAR(35)DEFAULT'aaa'
-- DEFAULT 默认值
-- MODIFY可以实现字段的移动

4.3重命名一个字段

ALTER TABLE myemp1
CHANGE salary mothly_salary DOUBLE(10,4)
-- 同时具备修改

4.4删除一个字段

ALTER TABLE myemp1
DROP COLUMN email

5.重命名表

-- 方法1
 RENAME TABLE myemp1
 TO myemp11
 
-- 方法2
 ALTER TABLE myemp2
 RENAME to myemp12
 

6.删除表

  • 无法撤销
  • 表的数据和结构都会删除
DROP TABLE IF EXISTS myemp12

7.清空表

  • 只会删除表的数据,保留表结构
TRUNCATE TABLE employees_copy

8.COMMIT和ROLLBACK

  • COMMIT:提交数据。一旦执行,则数据就被永久的保存在了数据库中,意味着数据不可以回滚
  • ROLLBACK:回滚数据。一旦执行,则可以实现数据的回滚。回滚到最近的一次COMMIT之后

9.对比TRUNCATE TABLE和 DELETE FROM

  • 相同点:都可以 实现对表中**所有结构数据进行删除,保留
  • 不同点
    • TRUNCATE TABLE:一旦执行操作,表数据全部清除。同时,数据是不可以回滚的
    • DELECE FROM:一旦执行此操作,表数据可以全部清除,(不带WHERE)。可以实现回滚.

10.DDL和DML的说明

  1. DDL的操作一旦执行,就不可以回滚。指令SET autocommit =FALSE对DDL操作失效(因为在执行完DDL操作之后,一定会执行一次COMMIT。而此COMMIT操作不受SET autocommit= FALSE影响)
  2. DML的操作默认情况,一旦执行,也是不可以回滚。但是,如果在执行DML之前,执行了SET autocommit =FALSE,则执行的DML操作就可以实现回滚
COMMIT

SELECT *
FROM myemp3

SET autocommit = FALSE

DELETE FROM myemp3;

ROLLBACK
-- 实现数据回滚
COMMIT

SELECT *
FROM myemp3

SET autocommit = FALSE

TRUNCATE TABLE myemp3;

ROLLBACK
-- w

第11章_数据的增删改

1.插入数据

  • 方式一:一条一条添加
-- 没有指明添加的字段。
-- 按照声明的字段的先后顺序添加
INSERT INTO emp1
VALUES (001,'Tom','2003-05-28',20000) 

-- 指明添加字段
-- 未指明则为空
INSERT INTO emp1(id,hire_date,salary)
VALUES (002,'2003-05-28',122) 

-- 添加多条数据
INSERT INTO emp1(id,name,salary)
VALUES
(3,'中',700),
(4,'啊',789)
  • 方式二:添加查询结果
-- 查询的字段一定要与添加到表的字段一一对应
-- emp1中要添加的数据的字段的长度不能低于employees中查询的字段的长度
INSERT INTO emp1(id,NAME,salary,hire_date)
SELECT employee_id,last_name,salary,hire_date
FROM employees
WHERE department_id IN (60,70)

2.更新数据

UPDATE ... SET ... WHERE ...
-- 修改数据时,是可能存在不成功的情况的(可能是由于约束的影响造成的)
UPDATE emp1
SET hire_date = CURDATE(),salary = 6000
WHERE id=4
-- 添加WHERE 否则批量修改

3删除数据

DELETE FROM ... WHERE ...
-- 也有可能应为约束条件无f

4.MySQl8.0新特性:计算列

CREATE TABLE test1(
a INT,
b INt,
c INT GENERATED ALWAYS AS (a+b) VIRTUAL
)

INSERT INTO test1(a,b)
VALUES(10,20)

UPDATE test1
SET a=100
-- 自动求和c列。修改a和b,c也随之调整
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值