left join
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
SELECT *column_name(s)*
FROM *table1*
LEFT JOIN *table2*
ON *table1.column_name*=*table2.column_name*;
Right join
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
SELECT *column_name(s)*//列名子
FROM *table1*//表
RIGHT JOIN *table2*//连表匹配
ON *table1.column_name*=*table2.column_name*;//匹配条件。
FULL OUTER JOIN
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.
SELECT *column_name(s)*
FROM *table1*
FULL OUTER JOIN *table2*
ON *table1.column_name*=*table2.column_name*;
Inner join
INNER JOIN 关键字在表中存在至少一个匹配时返回行。
SELECT *column_name(s)*
FROM *table1*
INNER JOIN *table2*
ON *table1.column_name*=*table2.column_name*;
Cast
CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型。CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。
语法:CAST (expression AS data_type)
AVG
AVG() 函数返回数值列的平均值。
语法:SELECT AVG(column_name) FROM table_name
Sum
SUM() 函数返回数值列的总数。
语法:SELECT SUM(column_name) FROM table_name;
Nvl
如果 "某个元素值" 是 NULL,则不会影响计算,因为如果值是 NULL 则 ISNULL() 返回 0:
Round
ROUND() 函数用于把数值字段舍入为指定的小数位数。
SELECT ROUND(column_name,decimals) FROM TABLE_NAME;
参数 | 描述 |
---|---|
column_name | 必需。要舍入的字段。 |
decimals | 可选。规定要返回的小数位数。 |
As
as可以为表名称或列名称指定别名。
SQL 别名
通过使用 SQL,可以为表名称或列名称指定别名。基本上,创建别名是为了让列名称的可读性更强。
列的 SQL 别名语法
SELECT column_name AS alias_name FROM table_name;
表的 SQL 别名语法
SELECT column_name(s) FROM table_name AS alias_name;
like
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
SELECT *column_name(s)* FROM *table_name* WHERE *column_name* LIKE *pattern*;
Case when
场景1:**有分数score,score<60返回不及格,score>=60返回及格,score>=80返回优秀**
SELECT STUDENT_NAME, (CASE WHEN score < 60 THEN '不及格' WHEN score >= 60 AND score < 80 THEN '及格' WHEN score >= 80 THEN '优秀' ELSE '异常' END) AS REMARK FROM TABLE
Cast down
时间戳函数
1、时间获取以及时间字符使用
select now();//当前时间
SELECT SYSDATE();//当前时间
SELECT CURRENT_TIMESTAMP();//当前时间
select now()+0;
以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个字符串还是在数字的上下文被使用。
2、 UNIX_TIMESTAMP(date)
如果没有参数调用,返回一个Unix时间戳记(从'1970-01-01 00:00:00'GMT开始的秒数)。如果UNIX_TIMESTAMP()用一个date参数被调用,它返回从'1970-01-01 00:00:00' GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。
select UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP('2021-11-24 20:44:00');
当UNIX_TIMESTAMP被用于一个TIMESTAMP列,函数将直接接受值,没有隐含的“string-to-unix-timestamp”变换。
3、 FROM_UNIXTIME(unix_timestamp)(重点)
以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值,取决于函数是在一个字符串还是或数字上下文中被使用。
select from_unixtime(1637757840);
select from_unixtime(1637757840)+0;//转换成字符
4、FROM_UNIXTIME(unix_timestamp,format) (重点)
返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。 时间戳转化为指定格式的函数from_unixtime.
格式:from_unixtime(bigint unixtime,string format)
format
yyyy-MM-dd hh:mm:ss yyyy-MM-dd hh 12小时制 yyyy-MM-dd HH 24小时制 yyyy-MM-dd hh:mm yyyyMMdd *注意yyyy要小写,千万不要大写*
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y %M %D %h:%i:%s');
其他的转换格式,就是相应的format改变。
5、TIME_TO_SEC(time)
返回time参数,转换成秒。
SELECT TIME_TO_SEC('21:01:00');
SELECT TIME_TO_SEC('00:39:38');
6、SEC_TO_TIME(seconds)
返回seconds参数,变换成小时、分钟和秒,值以'HH:MM:SS'或HHMMSS格式化,取决于函数是在一个字符串还是在数字上下文中被使用。
select SEC_TO_TIME(2378);
select SEC_TO_TIME(2378) + 0;
ORDER BY
ORDER BY 关键字用于对结果集进行排序。主要对结果集按照一个列或者多个列进行排序。默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。
语法:
SELECT *column_name*,*column_name* FROM *table_name* ORDER BY *column_name*,*column_name* ASC|DESC;
Group By
GROUP BY 子句用于与 SELECT 语句一起使用,来对相同的数据进行分组。在 SELECT 语句中,GROUP BY 子句放在 WHERE 子句之后,放在 ORDER BY 子句之前。
语法:
SELECT column-list FROM table_name WHERE [ conditions ] GROUP BY column1, column2....columnN ORDER BY column1, column2....columnN
我们的表具有重复名称的记录如下所示:
用同样的 GROUP BY 语句来对所有记录按 NAME 列进行分组,如下所示:
SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME;
其他方法与函数
union
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SELECT *column_name(s)* FROM *table1* UNION SELECT *column_name(s)* FROM *table2*;
union all
UNION去重且排序 UNION ALL不去重不排序
语法:[SQL 语句 1] UNION ALL [SQL 语句 2]
select into
SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
我们可以复制所有的列插入到新表中:
SELECT * INTO *newtable* [IN *externaldb*] FROM *table1;*
或者只复制希望的列插入到新表中:
SELECT *column_name(s)* INTO *newtable* [IN *externaldb*] FROM *table1;*
inser into select
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。
我们可以从一个表中复制所有的列插入到另一个已存在的表中:
**INSERT** **INTO** table2 **SELECT** * **FROM** table1;
或者我们可以只复制希望的列插入到另一个已存在的表中:
**INSERT** **INTO** table2 (column_name(s)) **SELECT** column_name(s) **FROM** table1;
嵌套查询(省略)
分页查询
分页实际上就是从结果集中“截取”出第M~N条记录。这个查询可以通过LIMIT <N-M> OFFSET <M>
子句实现。
在MySQL中,分页查询一般都是使用limit子句实现,limit子句声明如下:
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMIT子句可以被用于指定 SELECT 语句返回的记录数。需注意以下几点:
1、第一个参数指定第一个返回记录行的偏移量
2、第二个参数指定返回记录行的最大数目
3、如果只给定一个参数:它表示返回最大的记录行数目
4、第二个参数为 -1 表示检索从某一个偏移量到记录集的结束所有的记录行
5、初始记录行的偏移量是0(而不是 1)
SELECT * FROM student LIMIT 3 OFFSET 0
注意
OFFSET
是可选的,如果只写LIMIT 15
,那么相当于LIMIT 15 OFFSET 0
。
在MySQL中,LIMIT 15 OFFSET 30
还可以简写成LIMIT 30, 15
。
使用LIMIT <M> OFFSET <N>
分页时,随着N
越来越大,查询效率也会越来越低。
小结
使用LIMIT <M> OFFSET <N>
可以对结果集进行分页,每次查询返回结果集的一部分;
分页查询需要先确定每页的数量和当前页数,然后确定LIMIT
和OFFSET
的值。