Java-MySQL-SQL函数

news2024/11/26 18:26:42
SQL 函数
函数介绍

函数是 SQL 的一个非常强有力的特性,函数能够用于下面的目的:

● 执行数据计算

● 修改单个数据项

● 操纵输出进行行分组

● 格式化显示的日期和数字

● 转换列数据类型

SQL 函数有输入参数,并且总有一个返回值。

函数分类
1.单行函数
        单行函数仅对单个行进行运算,并且每行返回一个结果。
        常见的函数类型:
                ● 字符
                ● 数字
                ● 日期
                ● 转换
2
2.多行函数
        多行函数能够操纵成组的行,每个行组给出一个结果,这些函数也被称为组函数。
单行函数
                                                                单行函数
单行函数:
         ● 操作数据项
         ● 接受多个参数并返回一个值
         ● 作用于每一个返回行
         ● 每行返回一个结果
         ● 可以修改数据类型
         ● 可以嵌套
         ● 接受多个参数,参数可以是一个列或者一个表达式

 

单行函数分类

字符函数

 

大小写处理函数

 

函数描述实例
LOWER(s)|LCASE(s)
将字符串 s 转换
为小写
将字符串 OLDLU 转换为小写: SELECT
LOWER("OLDLU") ; -- oldlu
UPPER(s)|UCASE(s)
将字符串s 转换为大写
将字符串 oldlu 转换为大写: SELECT
UPPER("oldlu") ; -- OLDLU
示例:
显示雇员 Davies 的雇员号、姓名和部门号,将姓名转换为大写。
select
employee_id,UPPER(last_name),department_id from employees where last_name = 'davies';

字符处理函数

函数描述实例
LENGTH(s)返回字符串 s 的长度
返回字符串 oldlu 的字符数 SELECT
LENGTH("oldlu") ; -- 5 ;
CONCAT(s1,s2...sn)
字符串 s1,s2 等多个字符串合
并为一个字符串
合并多个字符串 SELECT CONCAT("sxt ",
"teacher ", "oldlu") ; -- sxt teacher oldlu ;
LPAD(s1,len,s2)
在字符串 s1 的开始处填充字
符串 s2 ,使字符串长度达到
len
将字符串 x 填充到 oldlu 字符串的开始处:
SELECT LPAD('oldlu',8,'x') ; -- xxxoldlu
LTRIM(s)去掉字符串 s 开始处的空格
去掉字符串 oldlu 开始处的空格: SELECT
LTRIM(" oldlu") ;-- oldlu
REPLACE(s,s1,s2)
将字符串 s2 替代字符串 s
的字符串 s1
将字符串 oldlu 中的字符 o 替换为字符 O
SELECT REPLACE('oldlu','o','O') ; -- Oldlu
REVERSE(s)将字符串s的顺序反过来
将字符串 abc 的顺序反过来: SELECT
REVERSE('abc') ; -- cba
RPAD(s1,len,s2)
在字符串 s1 的结尾处添加字
符串 s2 ,使字符串的长度达
len
将字符串 xx 填充到 oldlu 字符串的结尾处:
SELECT RPAD('oldlu',8,'x') ; -- oldluxxx
RTRIM(s)去掉字符串 s 结尾处的空格
去掉字符串 oldlu 的末尾空格: SELECT
RTRIM("oldlu ") ; -- oldlu
SUBSTR(s, start,
length)
从字符串 s start 位置截取
长度为 length 的子字符串
从字符串 OLDLU 中的第 2 个位置截取 3
字符: SELECT SUBSTR("OLDLU", 2, 3) ; --
LDL
SUBSTRING(s,
start, length)
从字符串 s start 位置截取
长度为 length 的子字符串
从字符串 OLDLU 中的第 2 个位置截取 3
字符: SELECT SUBSTRING("OLDLU", 2, 3) ; --
LDL
TRIM(s)
去掉字符串 s 开始和结尾处的
空格
去掉字符串 oldlu 的首尾空格: SELECT
TRIM(' oldlu ') ;-- oldlu

示例:

显示所有工作岗位名称从第 4 个字符位置开始,包含字符串 REP的雇员的ID信息,将雇员的姓和名连接显示在一起,还显示雇员名的的长度,以及名字中字母 a 的位置。

SELECT employee_id, CONCAT(last_name,first_name) NAME,

job_id, LENGTH(last_name),INSTR(last_name,'a') "Contains 'a'?" FROM employees WHERE SUBSTR(job_id, 4) = 'REP';

数字函数
函数名
描述实例
ABS(x)返回 x 的绝对值返回 -1 的绝对值: SELECT ABS(-1) -- 返回1
ACOS(x)x 的反余弦值(参数是弧度)SELECT ACOS(0.25);
ASIN(x)求反正弦值(参数是弧度)SELECT ASIN(0.25);
ATAN(x)求反正切值(参数是弧度)SELECT ATAN(2.5);
ATAN2(n,m)求反正切值(参数是弧度)SELECT ATAN2(-0.8, 2);
AVG(expression)
返回一个表达式的平均值,
expression 是一个字段
返回 Products 表中 Price 字段的平均值: SELECT AVG(Price)
AS AveragePrice FROM Products ;
CEIL(x)返回大于或等于 x 的最小整数SELECT CEIL(1.5) -- 返回2
CEILING(x)返回大于或等于 x 的最小整数SELECT CEILING(1.5); -- 返回2
COS(x)求余弦值(参数是弧度)SELECT COS(2);
COT(x)求余切值(参数是弧度)SELECT COT(6);
COUNT(expression)
返回查询的记录总数,
expression 参数是一个字段或
*
返回 Products 表中 products 字段总共有多少条记录:
SELECT COUNT(ProductID) AS NumberOfProducts FROM
Products ;
DEGREES(x)将弧度转换为角度SELECT DEGREES(3.1415926535898) -- 180
n DIV m整除,n 为被除数,m 为除数计算 10 除于 5SELECT 10 DIV 5; -- 2
EXP(x)返回 e x 次方计算 e 的三次方: SELECT EXP(3) -- 20.085536923188
FLOOR(x)返回小于或等于 x 的最大整数小于或等于 1.5 的整数: SELECT FLOOR(1.5) -- 返回1
GREATEST(expr1,
expr2, expr3, ...)
返回列表中的最大值
返回以下数字列表中的最大值: SELECT GREATEST(3, 12, 34, 8,
25) ; -- 34 返回以下字符串列表中的最大值: SELECT
GREATEST("Google", "Runoob", "Apple") ; -- Runoob
LEAST(expr1,
expr2, expr3, ...)
返回列表中的最小值
返回以下数字列表中的最小值: SELECT LEAST(3, 12, 34, 8, 25) ;
-- 3 返回以下字符串列表中的最小值: SELECT LEAST("Google",
"Runoob", "Apple") ; -- Apple
LN
返回数字的自然对数,以 e
底。
返回 2 的自然对数: SELECT LN(2); -- 0.6931471805599453
LOG(x)
LOG(base, x)
返回自然对数 ( e 为底的对
) ,如果带有 base 参数,则
base 为指定带底数。
SELECT LOG(20.085536923188) -- 3 SELECT LOG(2, 4); -- 2
LOG10(x)返回以 10 为底的对数SELECT LOG10(100) -- 2
LOG2(x)返回以 2 为底的对数
返回以 2 为底 6 的对数: SELECT LOG2(6) ; --
2.584962500721156
MAX(expression)
返回字段 expression 中的最
大值
返回数据表 Products 中字段 Price 的最大值: SELECT
MAX(Price) AS LargestPrice FROM Products ;
MIN(expression)
返回字段 expression 中的最
小值
返回数据表 Products 中字段 Price 的最小值: SELECT
MIN(Price) AS MinPrice FROM Products ;
MOD(x,y)返回 x 除以 y 以后的余数5 除于 2 的余数: SELECT MOD(5,2) -- 1
PI() 返回圆周率(3.141593SELECT PI() --3.141593
POW(x,y)返回 x y 次方2 3 次方: SELECT POW(2,3) -- 8
POWER(x,y)返回 x y 次方2 3 次方: SELECT POWER(2,3) -- 8
RADIANS(x)将角度转换为弧度
180 度转换为弧度: SELECT RADIANS(180) --
3.1415926535898
RAND()返回 0 1 的随机数SELECT RAND() --0.93099315644334
ROUND(x)返回离 x 最近的整数SELECT ROUND(1.23456) --1
SIGN(x)
返回 x 的符号, x 是负数、
0 、正数分别返回 -1 0 1
SELECT SIGN(-10) -- (-1)
SIN(x)求正弦值(参数是弧度)SELECT SIN(RADIANS(30)) -- 0.5
SQRT(x)返回x的平方根25 的平方根: SELECT SQRT(25) -- 5
SUM(expression)返回指定字段的总和
计算 OrderDetails 表中字段 Quantity 的总和: SELECT
SUM(Quantity) AS TotalItemsOrdered FROM OrderDetails ;
TAN(x)求正切值(参数是弧度)SELECT TAN(1.75); -- -5.52037992250933
TRUNCATE(x,y)
返回数值 x 保留到小数点后 y
位的值(与 ROUND 最大的区
别是不会进行四舍五入)
SELECT TRUNCATE(1.23456,3) -- 1.234
ROUND( column | expression , n ) 函数
        ROUND 函数四舍五入列、表达式或者 n 位小数的值。如果第二个参数是 0 或者缺少,值被四舍五入为整数。如果第二个参数是 2 值被四舍五入为两位小数。如果第二个参数是–2 ,值被四舍五入到小数点左边两位。
SELECT ROUND(45.923,2),
ROUND(45.923,0),ROUND(45.923,-1);

TRUNCATE(column|expression,n) 函数

        TRUNCATE函数的作用类似于 ROUND 函数。如果第二个参数是 0或者缺少,值被截断为整数。如果第二个参数是 2 ,值被截断为两位小数。如果第二个参数是–2 ,值被截断到小数点左边两位。与ROUND 最大的区别是不会进行四舍五入。
SELECT TRUNCATE(45.923,2);

使用MOD(m,n) 函数

MOD 函数找出m 除以n的余数。

示例:
所有 job_id SA_REP 的雇员的名字,薪水以及薪水被 5000 除后的余数。
SELECT last_name, salary, MOD(salary, 5000)FROM employees

WHERE job_id = 'SA_REP';

日期函数

        在MySQL 中允许直接使用字符串表示日期,但是要求字符串的日期格式必须为:‘YYYY-MM-DD HH:MI:SS’ 或者 ‘YYYY/MM/DD HH:MI:SS’;
函数名描述实例
CURDATE()返回当前日期SELECT CURDATE(); -> 2018-09-19
CURTIME()返回当前时间SELECT CURTIME(); -> 19:59:02
CURRENT_DATE()返回当前日期SELECT CURRENT_DATE(); -> 2018-09-19
CURRENT_TIME()返回当前时间SELECT CURRENT_TIME(); -> 19:59:02
DATE()从日期或日期时间表达式中提取日期值SELECT DATE("2017-06-15"); -> 2017-06-15
DATEDIFF(d1,d2)计算日期 d1->d2 之间相隔的天数
SELECT DATEDIFF('2001 - 01 - 01','2001 - 02 - 02') - >
- 32
DAY(d)返回日期值 d 的日期部分SELECT DAY("2017-06-15"); -> 15
DAYNAME(d)
返回日期 d 是星期几,如
Monday,Tuesday
SELECT DAYNAME('2011 - 11 - 11 11:11:11') -
>Friday
DAYOFMONTH(d)计算日期 d 是本月的第几天
SELECT DAYOFMONTH('2011 - 11 - 11 11:11:11') -
>11
DAYOFWEEK(d)
日期 d 今天是星期几, 1 星期日, 2 星期
一,以此类推
SELECT DAYOFWEEK('2011-11-11 11:11:11') ->6
DAYOFYEAR(d)计算日期 d 是本年的第几天
SELECT DAYOFYEAR('2011 - 11 - 11 11:11:11') -
>315
HOUR(t)返回 t 中的小时值SELECT HOUR('1:2:3') -> 1
LAST_DAY(d)返回给给定日期的那一月份的最后一天SELECT LAST_DAY("2017-06-20"); -> 2017-06-30
MONTHNAME(d)返回日期当中的月份名称,如 November
SELECT MONTHNAME('2011 - 11 - 11 11:11:11') -
> November
MONTH(d)返回日期d中的月份值,1 12SELECT MONTH('2011-11-11 11:11:11') ->11
NOW()返回当前日期和时间SELECT NOW() -> 2018-09-19 20:57:43
SECOND(t)返回 t 中的秒钟值SELECT SECOND('1:2:3') -> 3
SYSDATE()返回当前日期和时间SELECT SYSDATE() -> 2018-09-19 20:57:43
TIMEDIFF(time1,
time2)
计算时间差值
SELECT TIMEDIFF("13:10:11", "13:10:10") ; - >
00:00:01
TO_DAYS(d)计算日期 d 距离 0000 1 1 日的天数SELECT TO_DAYS('0001-01-01 01:01:01') -> 366
WEEK(d)
计算日期 d 是本年的第几个星期,范围是
0 53
SELECT WEEK('2011-11-11 11:11:11') -> 45
WEEKDAY(d)
日期 d 是星期几, 0 表示星期一, 1 表示星
期二
SELECT WEEKDAY("2017-06-15"); -> 3
WEEKOFYEAR(d)
计算日期 d 是本年的第几个星期,范围是
0 53
SELECT WEEKOFYEAR('2011 - 11 - 11 11:11:11') - >
45
YEAR(d)返回年份SELECT YEAR("2017-06-15"); -> 2017

示例一:

        向 employees 表中添加一条数据,雇员 ID 300 ,名字: kevin , email: kevin@sxt.cn ,入职时间: 2049-5-1 8:30:30 ,工作部门:‘IT_PROG’
insert  into
employees(EMPLOYEE_ID,last_name,email,HIRE_DATE,JOB_ID)

values(300,'kevin','kevin@sxt.cn','2049-5-18:30:30','IT_PROG');

示例二:

        显示所有在部门 90 中的雇员的名字和从业的周数。雇员的总工作时间以周计算,用当前日期 (SYSDATE) 减去雇员的受顾日期,再除以 7
SELECT last_name, (SYSDATE()-hire_date)/7 AS WEEKS FROM employees WHERE department_id = 90;

转换函数

 

隐式数据类型转换
        隐式数据类型转换是指MySQL 服务器能够自动地进行类型转换。
        如:可以将标准格式的字串日期自动转换为日期类型。
        MySQL字符串日期格式为: ‘YYYY-MM-DD HH:MI:SS’ 或 ‘YYYY/MM/DD HH:MI:SS’;
显示数据类型转换
        显示数据类型转换是指需要依赖转换函数来完成相关类型的转换。
        如:
        ● DATE_FORMAT(date,format) 将日期转换成字符串 ;
        ● STR_TO_DATE(str,format) 将字符串转换成日期;
格式描述
%a缩写星期名
%b缩写月名
%c月,数值
%D带有英文前缀的月中的天
%d月的天,数值(00-31)
%e月的天,数值(0-31)
%f微秒
%H小时(00-23)
%h小时(01-12)
%I小时(01-12)
%i分钟,数值(00-59)
%j年的天(001-366)
%k小时(0-23)
%l小时(1-12)
%M月名
%m月,数值(00-12)
%pAM 或 PM
%r时间,12-小时(hh:mm:ss AM 或 PM)
%S秒(00-59)
%s秒(00-59)
%T时间,24-小时(hh:mm:ss)
%U周(00-53)星期日是一周的第一天
%u周(00-53)星期一是一周的第一天
%V周(01-53)星期日是一周的第一天,与%X使用
%v周(01-53)星期日是一周的第一天,与%x使用
%W星期名
%w周的天(0 = 星期日,6 = 星期六)
%X年,其中的星期日是周的第一天,4 位,与%V使用
%x年,其中的星期日是周的第一天,4 位,与%v使用
%Y年,4位
%y年,2位

示例一:

employees 表中添加一条数据,雇员 ID 400 ,名字: oldlu , email: oldlu@sxt.cn ,入职时间: 2049 5 5 日,工作部门:‘IT_PROG’
insert  into
employees(EMPLOYEE_ID,last_name,email,HIRE_DATE,JOB_ID)

values(400,'oldlu','oldlu@sxt.cn',
STR_TO_DATE('2049 年 5 月 5 日','%Y 年%m 月%d日'),'IT_PROG');
示例二:
查询 employees 表中雇员名字为 King 的雇员的入职日期,要求显示格式为 yyyy MM dd 日。
select DATE_FORMAT(hire_date,'%Y 年%m 月%d日') from employees where last_name = 'King';

通用函数

函数名描述实例
IF(expr,v1,v2)
如果表达式 expr 成立,返回结果 v1 ;否 则,返回结果 v2
SELECT IF(1 >0,'正
确','错误') - >正确
IFNULL(v1,v2)
如果 v1 的值不为 NULL ,则返回 v1 ,否则返回 v2
SELECT IFNULL(null,'Hello
Word') - >Hello Word
ISNULL(expression)判断表达式是否为 NULL
SELECT
ISNULL(NULL) ; - >1
NULLIF(expr1, expr2)
比较两个参数是否相同,如果参数 expr1 与 expr2 相等 返回 NULL ,否则返回 expr1
SELECT NULLIF(25,
25) ; - >
COALESCE(expr1, expr2, ...., expr_n)
返回参数中的第一个非空表达式(从左向右)
SELECT
COALESCE(NULL,
NULL, NULL,
'bjsxt.com', NULL,
'google.com') ; - > bjsxt.com
CASE expression WHEN
condition1 THEN result1
WHEN condition2 THEN
result2 ... WHEN conditionN
THEN resultN ELSE result
END
CASE 表示函数开始, END 表示函数结束。
如果 condition1 成立,则返回 result1, 如果
condition2 成立,则返回 result2 ,当全部不
成立则返回 result ,而当有一个成立之后,
后面的就不执行了。
SELECT CASE 'oldlu'
WHEN 'oldlu' THEN
'OLDLU' WHEN
'admin' THEN
'ADMIN' ELSE 'kevin'
END ;

示例一:

        查询部门编号是50 或者 80 的员工信息,包含他们的名字、薪水、佣金。在income 列中,如果有佣金则显示 ‘SAL+COMM’ ,无佣金则显示'SAL'
SELECT last_name, salary, commission_pct,    
    if(ISNULL(commission_pct),
'SAL','SAL+COMM') income
FROM employees
WHERE department_id IN (50, 80);

示例二:

        计算雇员的年报酬,你需要用 12 乘以月薪,再加上它的佣金 (等于年薪乘以佣金百分比)

SELECT last_name, salary,
IFNULL(commission_pct, 0), (salary*12) + (salary*12*IFNULL(commission_pct, 0)) AN_SAL
FROM employees;

示例三

        查询员工表,显示他们的名字、名字的长度该列名为expr1 ,姓氏、姓氏的长度该列名为expr2 。在 result 列中,如果名字与姓氏的长度相同则显示空,如果不相同则显示名字长度。
 SELECT first_name, LENGTH(first_name)
"expr1",
     last_name, LENGTH(last_name) "expr2",
    NULLIF(LENGTH(first_name),
LENGTH(last_name)) result
FROM employees;

示例四:

        查询员工表,显示他们的名字,如果 COMMISSION_PCT 值是非空,显示它。如果COMMISSION_PCT 值是空,则显示 SALARY 。如果 COMMISSION_PCT SALARY 值都是空,那么显示 10 。在结果中对佣金列升序排序。
SELECT last_name,
COALESCE(commission_pct, salary, 10) comm
FROM employees
ORDER BY commission_pct;

示例五:

        查询员工表,如果 JOB_ID IT_PROG ,薪水增加 10% ;如果JOB_ID 是 ST_CLERK ,薪水增加 15% ;如果 JOB_ID SA_REP, 薪水增加 20% 。对于所有其他的工作角色,不增加薪水。
SELECT last_name, job_id, salary,
        CASE job_id WHEN 'IT_PROG' THEN
1.10*salary
                    WHEN 'ST_CLERK' THEN
1.15*salary
                    WHEN 'SA_REP' THEN
1.20*salary
        ELSE salary END "REVISED_SALARY"
FROM employees;

多表查询
多表查询简介

 

笛卡尔乘积

 

笛卡尔乘积 :
        当一个连接条件无效或被遗漏时,其结果是一个笛卡尔乘积(Cartesian product ) ,其中所有行的组合都被显示。第一个表中的所有行连接到第二个表中的所有行。一个笛卡尔乘积会产生大量的
行,其结果没有什么用。你应该在 WHERE 子句中始终包含一个有效的连接条件,除非你有特殊的需求,需要从所有表中组合所有的行。

 多表查询分类

● sql92标准:内连接(等值连接 、非等值连接 、 自连接)

● sql99标准:内连接、外连接 ( 左外、右外、全外 (MySQL 不支持全外连接 )) 、交叉连接。
SQL92 标准中的查询
等值连接
等值连接
       
         为了确定一个雇员的部门名,需要比较 EMPLOYEES 表中的DEPARTMENT_ID 列与 DEPARTMENTS 表中的 DEPARTMENT_ID列的值。在 EMPLOYEES DEPARTMENTS 表之间的关系是一个相等 ( equijoin ) 关系,即,两 个 表 中 DEPARTMENT_ID 列的值必须相等。
等值连接特点:
① 多表等值连接的结果为多表的交集部分;
② n表连接,至少需要 n-1 个连接条件;
③ 多表不分主次,没有顺序要求;
④ 一般为表起别名,提高阅读性和性能;
⑤ 可以搭配排序、分组、筛选 …. 等子句使用;
注意:
        等值连接也被称为简单连接 ( simple joins ) 或内连接 ( inner joins )
等值连接的使用

 ● SELECT 子句指定要返回的列名:

        − employee last name、 employee number department number,这些是
        EMPLOYEES 表中的列
        − department number、 department name location ID , 这些是 DEPARTMENTS 表中的列
● FROM 子句指定数据库必须访问的两个表:
− EMPLOYEES
− DEPARTMENTS
● WHERE 子句指定表怎样被连接:
EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID,因为 DEPARTMENT_ID 列是两个表的同名列,它必须用表名做前缀以避免混淆。
增加搜索条件

 添加查询条件

        除连接之外,可能还要求用 WHERE 子句在连接中限制一个或多个表中的行。
限制不能缺的列

 

限制不明确的列名
● 需要在 WHERE 子句中用表的名字限制列的名字以避免含糊不清。没有表前 DEPARTMENT_ID
列可能来自 DEPARTMENTS 表,也可能来自 EMPLOYEES 表,这种情况下需要添加表前缀来执行查询。
● 如果列名在两个表之间不相同,就不需要限定列。但是,使用表前缀可以改善性能,因为MySQL 服务器可以根据表前缀找到对应的列。
● 必须限定不明确的列名也适用于在其它子句中可能引起混淆的那些列,例如 SELECT子句或 ORDER BY 子句。
使用表别名

表别名定义原则

● 表别名不易过长,短一些更好。
● 表别名应该是有意义的。
● 表别名只对当前的 SELECT 语句有效。
多表连接

示例一:

查询雇员 King 所在的部门名称。
 select d.department_name from employees
e,departments d   where e.dept_id =
d.department_id and e.last_name = 'King';

非等值连接

 

非等值连接
        一个非等值连接是一种不同于等值操作的连接条件。 EMPLOYEES表 和JOB_GRADES A 表之间的关系有一个非等值连接例子。在两个表之间的关系是EMPLOYEES 表中的 SALARY 列必须是 JOB_GRADES 表的 LOWEST_SALARY HIGHEST_SALARY 列之间的值。使用不同于等于 (=) 的操作符获得关系。

 

示例一:
创建 job_grades 表,包含 lowest_sal highest_sal , grade_level。
 create table job_grades(lowest_sal int,highest_sal int ,grade_level
varchar(30));

示例二:

插入数据

1000 2999 A
2000 4999 B
5000 7999 C
8000 12000 D
 insert into job_grades values(1000,2999,'A');
 insert into job_grades values(2000,4999,'B');
 insert into job_grades values(5000,7999,'C');
 insert into job_grades
 values(8000,12000,'D');

自连接

 

自连接
连接一个表到它自己。有时需要连接一个表到它自己。为了找到每个雇员的经理的名字,则需要连接EMPLOYEES 表到它自己,或执行一个自连接。

 

图片中的例子连接 EMPLOYEES 表到它自己。为了在 FROM 子句中模拟两个表,对于相同的表 EMPLOYEES ,用两个别名,分别为worker 和 manager 。在该例中, WHERE 子句包含的连接意味着“一个工人的经理号匹配该经理的雇员号
示例一:
查询每个雇员的经理的名字以及雇员的名字,雇员名字列别名为W,经理列别名为 M
 SELECT
 worker.LAST_NAME W,manager.LAST_NAME M
 from employees worker,employees manager
 where worker.MANAGER_ID = manager.EMPLOYEE_ID;

SQL99标准中的查询

MySQL5.7 支持部分的 SQL99 标准。
SQL99 中的交叉连接 (CROSS JOIN)

 示例:

使用交叉连接查询 employees 表与 departments 表。
select * from employees cross join departments;

SQL99中的自然连接(NATURAL JOIN)

自然连接

连接只能发生在两个表中有相同名字和数据类型的列上。如果列有相同的名字,但数据类型不同,NATURAL JOIN 语法会引起错误。
自然连接查询

在图片例子中,LOCATIONS 表被用 LOCATION_ID 列连接到DEPARTMENT表,这是在两个表中唯一名字相同的列。如果存在其它的同名同类型的列,自然连接会使用等值连接的方式连接他们, 连接条件的关系为and

自然连接也可以被写为等值连接:

        SELECT d.department_id, d.department_name,
                d.location_id , l.city
        FROM
                departments d , locations l
        WHERE
                d.location_id = l.location_id;
示例:
使用自然连接查询所有有部门的雇员的名字以及部门名称。
select e.last_name,d.department_name from employees e natural join departments d;
SQL99 中的内连接 (INNER JOIN)

 

语法:
● SELECT 查询列表 ;
● FROM 表 1 别名 ;
● INNER JOIN 连接表 (INNER 关键字可省略 );
● ON 连接条件 ;
ON 子句指定连接条件

ON子句指定更多的连接条件

示例:

查询雇员名字为 Fox 的雇员 ID ,薪水与部门名称。
select
e.employee_id,e.salary,d.department_name from
employees e inner JOIN departments d on
e.department_id = d.department_id where
e.last_name = 'Fox';

外连接查询(OUTER JOIN)

 

孤儿数据 (Orphan Data)
孤儿数据是指被连接的列的值为空的数据。

 

左外连接
        左边的表 (EMPLOYEES) 中即使没有与 DEPARTMENTS 表中匹配的行,该查询
也会取回 EMPLOYEES 表中所有的行。
示例:
查询所有雇员的名字以及他们的部门名称,包含那些没有部门的雇员。
select e.last_name,d.department_name from
employees e LEFT OUTER JOIN departments d on
e.dept_id = d.department_id;

右外连接 (RIGTH OUTER JOIN)

 

右外连接
        右边的表 (DEPARTMENTS ) 中即使没有与 EMPLOYEES 表中匹配的行,该查询
也会取回 DEPARTMENTS 表中所有的行。
示例:
查询所有雇员的名字以及他们的部门名称,包含那些没有雇员的部门。
select e.last_name,d.department_name  from 
employees e RIGHT  OUTER JOIN departments 
d on e.DEPARTMENT_ID = d.department_id;

全外连接 (FULL OUTER JOIN)

 

注意: MySQL 中不支持 FULL OUTER JOIN 连接
                可以使用 union 实现全完连接。
● UNION: 可以将两个查询结果集合并,返回的行都是唯一的,如同对整个结果集合使用了 DISTINCT。
● UNION ALL: 只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数 据, 那么返回的结果集就会包含重复的数据了。
语法结构
 (SELECT 投影列 FROM 表名 LEFT OUTER JOIN 表名 ON 连接条件)
 UNION
 (SELECT 投影列 FROM 表名 RIGHT OUTER JOIN 表名 ON 连接条件)

示例:         查询所有雇员的名字以及他们的部门名称,包含那些没有雇员的部门以及没有部门的雇员。

 (select e.last_name,d.department_name from employees e LEFT OUTER JOIN departments d  one.department_id = d.department_id)  
 UNION  
 (select e1.last_name,d1.department_name from employees e1 RIGHT OUTER JOIN
departments d1 on d1.department_id = e1.department_id)

聚合函数
聚合函数介绍
聚合函数
        聚合函数也称之为多行函数,组函数或分组函数。聚合函数不象单行函数,聚合函数对行的分组进行操作,对每组给出一个结果。如果在查询中没有指定分组,那么聚合函数则将查询到的结果集视为一组。

聚合函数类型

 聚合函数说明:

函数名描述实例
AVG(expression)
返回一个表达式的平均值,expression 是一个字段
返回 Products 表中 Price 字段的平均值: SELECT
AVG(Price) AS AveragePrice FROM Products ;
COUNT(expression)
返回查询的记录总数,
expression 参数是一个字段或者 *
返回 Products 表中 products 字段总共有多少条记录: SELECT COUNT(ProductID) AS
NumberOfProducts FROM Products ;
MAX(expression)
返回字段 expression 中的最大值
返回数据表 Products 中字段 Price 的最大值:
SELECT MAX(Price) AS LargestPrice FROM Products ;
MIN(expression)
返回字段 expression
的最小值
返回数据表 Products 中字段 Price 的最小值:
SELECT MIN(Price) AS MinPrice FROM Products ;
SUM(expression)返回指定字段的总和
计算 OrderDetails 表中字段 Quantity 的总和:
SELECT SUM(Quantity) AS TotalItemsOrdered FROM
OrderDetails ;
聚合函数使用方式
使用聚合函数的原则
       
        ● DISTINCT 使得函数只考虑不重复的值;
        ● 所有聚合函数忽略空值。为了用一个值代替空值,用 IFNULL COALESCE 函数。
AVG SUM 函数
AVG(arg) 函数
对分组数据做平均值运算。
arg: 参数类型只能是数字类型。
SUM(arg) 函数
对分组数据求和。
arg: 参数类型只能是数字类型。
示例:
        计算员工表中工作编号含有REP 的工作岗位的平均薪水与薪水总和。
 
SELECT AVG(salary),SUM(salary)
FROM employees
WHERE job_id LIKE '%REP%';

MIN MAX 函数

MIN(arg) 函数
求分组中最小数据。
arg: 参数类型可以是字符、数字、 日期。
MAX(arg) 函数
求分组中最大数据。
arg: 参数类型可以是字符、数字、 日期。
示例:
        查询员工表中入职时间最短与最长的员工,并显示他们的入职时 间。
SELECT MIN(hire_date), MAX(hire_date) FROM employees;

COUNT 函数

返回分组中的总行数。

COUNT 函数有三种格式:
● COUNT(*) :返回表中满足 SELECT 语句的所有列的行数,包括重复行,包括有空值列
的行。
● COUNT(expr):返回在列中的由 expr 指定的非空值的数。
● COUNT(DISTINCT expr):返回在列中的由 expr 指定的唯一的非空值的数。
使用 DISTINCT 关键字
● COUNT(DISTINCT expr) 返回对于表达式 expr 非空并且值不相同的行数
● 显示 EMPLOYEES 表中不同部门数的值
示例:
显示员工表中部门编号是 80 中有佣金的雇员人数。

SELECT COUNT(commission_pct) FROM employees WHERE department_id = 80;

组函数和 Null
在组函数中使用 IFNULL 函数
SELECT AVG(IFNULL(commission_pct, 0)) FROM
employees;

数据分组(GROUP BY)

创建数据组

创建数据组

        在没有进行数据分组之前,所有聚合函数是将结果集作为一个大的信息组进行处理。但是,有时,则需要将表的信息划分为较小的组,可以用 GROUP BY 子句实现。

GROUP BY 子句语法

原则

● 使用 WHERE 子句,可以在划分行成组以前过滤行。

● 如果有WHERE 子句,那么 GROUP BY 子句必须在 WHERE 的子句后面。
● 在 GROUP BY 子句中必须包含列。
使用 GROUP BY 子句

GROUP BY 子句

下面是包含一个 GROUP BY 子句 SELECT 语句的求值过程:
● SELECT 子句指定要返回的列:
● 在 EMPLOYEES 表中的部门号
        − GROUP BY 子句中指定分组的所有薪水的平均值
        − FROM 子句指定数据库必须访问的表: EMPLOYEES 表。
● WHERE 子句指定被返回的行。因为无 WHERE 子句默认情况下所有行被返回。
● GROUP BY 子句指定行怎样被分组。行用部门号分组,所以AVG 函数被应用于薪水列,以计算每个部门的平均薪水。
示例:
计算每个部门的员工总数。
SELECT DEPARTMENT_ID, COUNT(*) FROM employees GROUP BY DEPARTMENT_ID;
在多列上使用分组

 

在组中分组
        可以列出多个 GROUP BY 列返回组和子组的摘要结果。可以用GROUP BY子句中的列的顺序确定结果的默认排序顺序。下面是图片中的 SELECT 语句中包含一个 GROUP BY 子句时的求值过程:
        ● SELECT 子句指定被返回的列:
                − 部门号在 EMPLOYEES 表中
                − Job ID 在 EMPLOYEES 表中
                − 在 GROUP BY 子句中指定的组中所有薪水的合计
        ● FROM 子句指定数据库必须访问的表: EMPLOYEES 表。
        ● GROUP BY 子句指定你怎样分组行:
                − 首先,用部门号分组行。
                − 第二,在部门号的分组中再用 job ID 分组行。
如此 SUM 函数被用于每个部门号分组中的所有 job ID salary列。
示例:
计算每个部门的不同工作岗位的员工总数。
SELECT e.DEPARTMENT_ID, e.JOB_ID,COUNT(*)FROM 
employees e
GROUP BY e.DEPARTMENT_ID,e.JOB_ID;

约束分组结果(HAVING)

HAVING 子句

HAVING 子句是对查询出结果集分组后的结果进行过滤。
约束分组结果
        用 WHERE 子句约束选择的行,用 HAVING 子句约束组。为了找到每个部门中的最高薪水,而且只显示最高薪水大于 $10,000 的那些部门,可以像下面这样做:
① 用部门号分组,在每个部门中找最大薪水。
②    返回那些有最高薪水大于 $10,000 的雇员的部门
SELECT department_id, MAX(salary) FROM
employees GROUP BY department_id HAVING
MAX(salary)>10000 ;

HAVING 子句语法

示例:

显示那些合计薪水超过 13,000 的每个工作岗位的合计薪水。排除那些JOB_ID 中含有 REP 的工作岗位,并且用合计月薪排序列表。
SELECT job_id, SUM(salary) PAYROLL FROM
employees WHERE job_id NOT LIKE '%REP%'GROUP
BY job_id HAVING SUM(salary) > 13000 ORDER BY
SUM(salary);

子查询

子查询介绍

 

用子查询解决问题
假如要写一个查询来找出挣钱比 Abel 的薪水还多的人。为了解决这个问题,需要两个查询:一个找出 Abel 的收入,第二个查询找出收入高于 Abel 的人。可以用组合两个查询的方法解决这个问题。内查询或子查询返回一个值给外查询或主查询。使用一个子查询相当于执行两个连续查询并且用第一个查询的结果作为第二个查询的搜索值。
子查询语法

子查询

子查询是一个 SELECT 语句,它是嵌在另一个 SELECT 语句中的子句。使用子查询可以用简单的语句构建功能强大的语句。

可以将子查询放在许多的 SQL 子句中,包括:

● WHERE 子句
● HAVING 子句
● FROM 子句
使用子查询

使用子查询的原则

● 子查询放在圆括号中。
● 将子查询放在比较条件的右边。
● 在单行子查询中用单行运算符,在多行子查询中用多行运算符。
子查询类型
示例:
查询与 Fox 同一部门的同事,并显示他们的名字与部门 ID
select e.LAST_NAME,e.DEPARTMENT_ID FROM
employees e
where e.DEPARTMENT_ID =
(select e1.DEPARTMENT_ID from employees e1
where e1.last_name = 'Fox');

单行子查询

 

单行子查询
        单行子查询是从内查询返回一行的查询。在该子查询类型中用一个单行操作符。
示例:
        查询 Fox 的同事,但是不包含他自己。
 select   empl.last_name   from   employees  
empl   where   empl.department_id   =  
(select e.department_id from employees e
where e.last_name = 'Fox') and empl.last_name
<> 'Fox';

多行子查询

多行子查询

        子查询返回多行被称为多行子查询。对多行子查询要使用多行运算符而不是单行运算符。
使用 ANY 运算符

 

ANY 运算符

ANY 运算符比较一个值与一个子查询返回的每一个值。
       ● < ANY 意思是小于最大值。
       ● > ANY 意思是大于最小值。
       ● = ANY 等同于 IN
使用 ALL 运算符

 

ALL 运算符比较一个值与子查询返回的每个值。

        ● < ALL 意思是小于最小值。
        ● > ALL 意思是大于最大值,
NOT 运算符可以与 IN 运算符一起使用。
子查询中的空值

内查询返回的值含有空值,并因此整个查询无返回行,原因是用大于、小于或不等于比较Null值,都返回null。所以,只要空值可能是子查询结果集的一部分,就不能用 NOT IN 运算符。NOT IN 运算符相当于 <> ALL

注意,空值作为一个子查询结果集的一部分,如果使用 IN 操作符的话,不是一个问题。IN 操作符相当于 =ANY
SELECT emp.last_name FROM employees emp WHERE
emp.employee_id IN (SELECT mgr.manager_id
FROM employees mgr);

示例:

查找各部门收入为部门最低的那些雇员。显示他们的名字,薪水以及部门 ID
 
select
em.last_name,em.salary,em.department_id  from
employees em  where em.salary in(select
min(e.salary) from employees e group by
e.department_id);

MySQL 中的索引

索引介绍

        索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。索引是一种特殊的文件,它们包含着对数据表里所有记录的位置信息。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。MySQL索引的建立对于MySQL 的高效运行是很重要的,索引可以大大提高MySQL 的检索速度。
索引的作用
        索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提高性能(查询速度)。
索引优点:
        ① 通过创建唯一性索引,可以保证数据库表中的每一行数据的唯一性;
        ② 可以加快数据的检索速度;
        ③ 可以加速表与表之间的连接;
        ④ 在使用分组和排序进行检索的时候,可以减少查询中分组和排序的时间;
索引缺点
         ① 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加;
         ② 索引需要占用物理空间,数据量越大,占用空间越大;
         ③ 会降低表的增删改的效率,因为每次增删改索引都需要进行动态维护;
什么时候需要创建索引
         ① 频繁作为查询条件的字段应该创建索引;
         ② 查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找);
         ③ 查询中统计或者分组的字段;
什么时候不需要创建索引
         ① 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件;
         ② where条件里用不到的字段,不创建索引;
         ③ 表记录太少,不需要创建索引;
         ④ 经常增删改的表;
         ⑤ 数据重复且分布平均的字段,因此为经常查询的和经常排序的字段建立索引。注意某些数据包含大量重复数据,因此他建立索引就没有太大的效果,例如性别字段,只有男女,不适合建立索引;
MySQL 中的索引类型
● 普通索引:
   最基本的索引,它没有任何限制。
● 唯一索引:
  索引列的值必须唯一,但允许有空值,如果是组合索引,则列值的组合必须唯一。
● 主键索引:
   特殊的索引,唯一的标识一条记录,不能为空,一般用 primary key来约束。
● 联合索引:
   在多个字段上建立索引,能够加速查询到速度。
普通索引
是最基本的索引,它没有任何限制。在创建索引时,可以指定索引长度。length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度,如果是 BLOB TEXT 类型,必须指定length。
        创建索引时需要注意:
        如果指定单列索引长度,length 必须小于这个字段所允许的最大字符个数。
查询索引
SHOW INDEX FROM table_name;

直接创建索引

CREATE INDEX index_name ON table(column(length));

示例:

为 emp3 表中的 name 创建一个索引,索引名为emp3_name_index;

create index emp3_name_index ON emp3(name);

修改表添加索引

ALTER TABLE table_name ADD INDEX index_name (column(length));

创建表时指定索引列

CREATE TABLE `table` (
COLUMN TYPE ,
PRIMARY KEY (`id`),
INDEX index_name (column(length))
);
唯一索引
唯一索引与普通索引类似,不同的就是: 索引列的值必须唯一,但允许有空值。
创建唯一索引
 
CREATE UNIQUE INDEX indexName ON
table(column(length));

修改表添加唯一索引

ALTER TABLE table_name ADD UNIQUE indexName
(column(length));

创建表时指定唯一索引

CREATE TABLE `table` (
COLUMN TYPE ,
PRIMARY KEY (`id`),
UNIQUE index_name (column(length))
);

主键索引
        主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。
修改表添加主键索引
ALTER TABLE 表名 ADD PRIMARY KEY(列名);
创建表时指定主键索引
CREATE TABLE `table` (
COLUMN TYPE ,
PRIMARY KEY(column)
);

组合索引

        组合索引是指使用多个字段创建的索引,只有在查询条件中使用了 创建索引时的第一个字段,索引才会被使用(最左前缀原则)

最左前缀原则
就是最左优先。
如: 我们使用表中的 name address salary 创建组合索引,那么想要组合索引生效, 我们只能使用如下组合:
        name/address/salary
        name/address
        name/
        如果使用 addrees/salary 或者是 salary 则索引不会生效。
添加组合索引
ALTER TABLE table_name ADD INDEX index_name
(column(length),column(length));
创建表时创建组合索引
CREATE TABLE `table` (
COLUMN TYPE ,
INDEX index_name
(column(length),column(length))
);

MySQL 事务
事务简介
        事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
事务定义 (Transaction)
● 事务是一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务 ( 例如银行账户转账业务,该业务就是一个最小的工作单元)
● 一个完整的业务需要批量的DML(insert update delete) 语句共同联合完成事务只和DML 语句有关,或者说 DML 语句才有事务。这个和业务逻辑有关,业务逻辑不同, DML语句的个数不同
事务四大特征 (ACID)
● 原子性 (ATOMICITY)
        事务中的操作要么都不做,要么就全做。
● 一致性 (CONSISTENCY)
        一个事务应该保护所有定义在数据上的不变的属性( 例如完整性约束) 。在完成了一个成功的事务时,数据应处于一致的状态。
● 隔离性 (ISOLATION)
        一个事务的执行不能被其他事务干扰。
● 持久性(DURABILITY)
        一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
事务类型
● 显式事务
需要我们手动的提交或回滚。 DML 语言中的所有操作都是显示事务操作。
● 隐式事务
数据库自动提交不需要我们做任何处理,同时也不具备回滚性。 DDL、 DCL 语言都是隐式事务操作
使用事务
TCL语句描述
start transaction事务开启
commit事物提交
rollback事物回滚

事务的并发问题
脏读(读取未提交数据)
指一个事务读取了另外一个事务未提交的数据。
A 事务读取 B 事务尚未提交的数据,此时如果 B 事务发生错误并执行回滚操作,那么A 事务读取到的数据就是脏数据。

 

不可重复读(前后多次读取,数据内容不一致)

在一个事务内读取表中的某一行数据,多次读取结果不同。
事务A 在执行读取操作,由整个事务 A 比较大,前后读取同一条数据需要经历很长的时间 。而在事务A 第一次读取数据,比如此时读取了小明的年龄为20 岁,事务 B 执行更改操作,将小明的年龄更改为30岁,此时事务 A 第二次读取到小明的年龄时,发现其年龄是 30岁,和之前的数据不一样了,也就是数据不重复了,系统不可以读取到重复的数据,成为不可重复读。

 

幻读(前后多次读取,数据总量不一致)

是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。
事务 A 在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B 执行了新增数据的操作并提交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读。

 

事务的隔离级别
事务的隔离级别用于决定如何控制并发用户读写数据的操作。数据库是允许多用户并发访问的,如果多个用户同时开启事务并对同一数据进行读写操作的话,有可能会出现脏读、不可重复读和幻读问题,所以MySQL 中提供了四种隔离级别来解决上述问题。
事务的隔离级别从低到高依次为:
● READ UNCOMMITTED
● READ COMMITTED
● REPEATABLE READ
● SERIALIZABLE
隔离级别越低,越能支持高并发的数据库操作。

 

查看 MySQL 默认事务隔离级别
SELECT @@transaction_isolation;

设置事务隔离级别
对当前 session 有效。
 
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;

MySQL 的用户管理
        MySQL 是一个多用户的数据库系统,按权限,用户可以分为两种: root 用户,超级管理员,和由 root 用户创建的普通用户。
用户管理
创建用户
CREATE USER username IDENTIFIED BY
'password';

查看用户

SELECT USER,HOST FROM mysql.user;
权限管理
        新用户创建完后是无法登陆的,需要分配权限。
        GRANT 权限 ON 数据库 . TO 用户名 @ 登录主机 IDENTIFIED BY
        "密码 "
登陆主机:
字段含义
%匹配所有主机
localhostlocalhost 不会被解析成 IP 地址,直接通过 UNIXsocket 连接
127.0.0.1会通过 TCP/IP 协议连接,并且只能在本机访问
:: 1::1 就是兼容支持 ipv6 的,表示同 ipv4 127.0.0. 1
权限列表
权 限作用范围作 用
all [privileges]服务器所有权限
select表、列选择行
insert表、列插入行
update
表、列
更新行
delete
删除行
create数据库、表、索引创建
drop数据库、表、视图删除
reload服务器允许使用flush语句
shutdown服务器关闭服务
process服务器查看线程信息
file服务器文件操作
grant option数据库、表、存储过程授权
references数据库、表外键约束的父表
index创建/删除索引
alter修改表结构
show databases服务器查看数据库名称
super服务器超级权限
create temporary tables
创建临时表
lock tables数据库锁表
execute存储过程执行
replication client服务器允许查看主//二进制日志状态
replication slave服务器
主从复制
create view视图创建视图
show view视图查看视图
create routine存储过程创建存储过程
alter routine存储过程修改/删除存储过程
create user服务器创建用户
event数据库创建/更改/删除/查看事件
trigger触发器
create tablespace服务器创建/更改/删除表空间/日志文件
proxy服务器代理成为其它用户
usage服务器没有权限
刷新权限
每当调整权限后,通常需要执行以下语句刷新权限。
FLUSH PRIVILEGES;

删除用户

DROP USER username@localhost;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云原生系列CKA备考】Kubernetes架构

目录前言一、Kubernetes架构1.1Master节点1.2 Node节点1.3 Add-ons1.3 Kubeadm二、相关命令2.1 查看组件运行状态2.2 kubeadm容器化组件三、总结前言 ​ OpenStack是管理虚拟机的&#xff0c;底层依靠虚拟化技术&#xff1b;kubernetes是管理容器的&#xff0c;底层也是依靠虚…

juery笔记

文章目录Jquery一、什么是 jQuery二、如何使用 jQuery三、如何选择 jQuery 版本四、jQuery 的运行原理实例方法1、一般通过一个字符串来标识匹配的元素2、支持多个选择器任意组合使用3、jQuery 特有的选择器&#xff0c;当然也可以和其他选择器任意组合使用4、元素筛选&#xf…

基于OpenGL的地形建模技术的研究与实现

毕业论文 基于OpenGL的地形建模技术的研究与实现 诚信声明 本人郑重声明&#xff1a;本设计&#xff08;论文&#xff09;及其研究工作是本人在指导教师的指导下独立完成的&#xff0c;在完成设计&#xff08;论文&#xff09;时所利用的一切资料均已在参考文献中列出。 本人…

代码随想录训练营第50天|LeetCode 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

参考 代码随想录 题目一&#xff1a;LeetCode 123.买卖股票的最佳时机III 确定dp数组下标及其含义 某一天最多存在5个状态&#xff1a; j 0&#xff1a;没有操作j 1&#xff1a;第一次买入j 2&#xff1a;第一次卖出j 3&#xff1a;第二次买入j 4&#xff1a;第二次卖出…

[附源码]Python计算机毕业设计SSM基于JAVA线上订餐系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

安卓电子名片管理器的设计与实现

毕业设计 安卓电子名片管理器的设计与实现 诚信申明 本人郑重声明&#xff1a;本设计&#xff08;论文&#xff09;及其研究工作是本人在指导教师的指导下独立完成的&#xff0c;在完成设计&#xff08;论文&#xff09;时所利用的一切资料均已在参考文献中列出。 本人签名&…

789. 数的范围

目录 题目&#xff1a;​编辑 题目思路&#xff1a; 解释&#xff1a; 方法&#xff1a; 对于k值所在左边界&#xff1a; 对于k值所在右边界&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 链接&#xff1a;789. 数的范围 - AcWing题库https://www.acwing.com/prob…

【在SpringBoot项目中执行修改相册数据--MSC层】

目录 1. 编辑相册--执行修改--Mapper层 2. 编辑相册--执行修改--Service层 3. 编辑相册--执行修改--Controller层 1. 编辑相册--执行修改--Mapper层 执行修改相册使用已有的update()即可。 另外&#xff0c;还需要检查“提交修改的名称&#xff0c;是不是其它数据的名称”…

基于Pyqt5和PaddleOCR实现PDF转DOC

在上一篇文章《基于Pyqt5实现笔记本摄像头拍照及PaddleOCR测试》的基础上&#xff0c;继续做了个简单的扩展&#xff1a; 将PDF文档转换为DOC文档。 一、界面增加一个按钮&#xff0c;如下图&#xff1a; 二、源码修改 1、paddleocr.py文件直接拷贝 Github下载的源码PaddleO…

DBCO-PEG-Cholesterol,Cholesterol-PEG-DBCO,胆固醇-聚乙二醇-二苯并环辛炔

DBCO-PEG-Cholesterol属于高分子点击试剂&#xff0c;胆固醇PEG-DBCO是一种具有DBCO反应基团的亲脂性PEG衍生物。DBCO-PEG试剂在水缓冲液中具有快速动力学和稳定性&#xff0c;可用于标记具有高特异性和反应性的叠氮化物修饰的生物分子。 西安凯新生物科技有限公司​点击类化学…

写了个tooltip的切换动画,个人感觉比一些组件库的渐变动画好看

最近修改了个语言切换框的tooltip的切换动画&#xff0c;感觉比element-plus或者其他组件库的tooltip的切换动画好看一些&#xff0c;看起来比较灵动&#xff0c;下面将代码分享出来。 <!DOCTYPE html> <html lang"en"><head><meta charset&quo…

Linux内核调试技术之kprobes(1)基本原理与使用

概述 Linux kprobes技术是一种可以跟踪内核函数执行状态的轻量级内核调试技术&#xff0c;利用kprobes技术可以在运行的内核中动态的插入探测点&#xff0c;当内核运行到该探测点后可以执行用户预定义的回调函数&#xff0c;以收集所需的调试状态信息而基本不影响内核原有的执…

XXL-JOB详解(整合springboot)保姆级教程

文章目录XXL-JOB简介XXL-JOB是什么为什么需要任务调度平台&#xff0c;而不用传统的 Timer 与 Quartz为什么选择XXL-JOB&#xff0c;不选择elasticjob学习之前必看&#xff0c;少走很多弯路安装XXL-JOB一、源码编译&#xff08;Windows&#xff09;1、拉取源码&#xff1a;[xxl…

NR HARQ(二) CBG HARQ-ACK codebook

这篇开始看下HARQ-ACK codebook的相关内容&#xff0c;先看CBG-based HARQ-ACK codebook。那第一个关注点就是CBG 的划分规则&#xff0c;这部分内容主要在38.213 9.1.1章节中&#xff0c;PDSCH和PUSCH 的CBG 划分规则基本是一样的&#xff0c;这里以PDSCH为例介绍。 PDSCH 和P…

MyBatis-Plus之通用枚举

系列文章目录 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus分页查询&#xff08;快速上手运用&#xff09;_心态还需努力呀的博客-CSDN博客_mybatis plus分页查询 MyBa…

CyclicBarrier 多线程处理数据

文章目录前言需求环境准备单线程处理多线程处理总结前言 开发中&#xff0c;我们经常会遇到处理批量数据&#xff0c;最后把处理成功和失败的数据结果记录下来。普通方法一个循环就可以搞定这个需求&#xff0c;但是面临大量数据单个线程去处理可能面临很大的瓶颈&#xff0c;…

怎么进行视频配音?建议收藏这些配音方法

最近我的朋友向我求助&#xff0c;他想要自己制作一个视频&#xff0c;但是视频里面有些片段需要配音&#xff0c;可是他又不想用自己的声音来配音。一方面担心容易NG&#xff0c;需要录制很多遍&#xff0c;会浪费较多的时间&#xff1b;另一方面是&#xff0c;如果视频录制和…

​单张图像三维人脸重建必备入门face3d—3DMM

作者&#xff1a;小灰灰 来源&#xff1a;投稿 编辑&#xff1a;学姐 本次的例子是将pipeline生成的图片作用于3DMM&#xff0c;重新拟合成新的图片。 load model 3DMM的表达式&#xff1a; &#x1d446;̅ ∈ &#x1d445;3&#x1d45b;是平均人脸形状&#xff0c;&#x…

国产网关apisix安装

1、安装docker 参考&#xff1a;centos7安装docker_代码手艺人老羊的博客-CSDN博客 2、下载包&#xff08;从github&#xff09; # Download the Docker image of Apache APISIX git clone https://github.com/apache/apisix-docker.git 3、安装 # Switch the current di…

单点登录设计

01 单系统登录机制 1、http无状态协议 web应用采用browser/server架构&#xff0c;http作为通信协议。http是无状态协议&#xff0c;浏览器的每一次请求&#xff0c;服务器会独立处理&#xff0c;不与之前或之后的请求产生关联&#xff0c;这个过程用下图说明&#xff0c;三…