SQL学习

定义

SQL 是用于访问和处理数据库的标准的计算机语言。

  • SQL 指结构化查询语言
  • SQL 使我们有能力访问数据库
  • SQL 是一种 ANSI 的标准计算机语言

注:ANSI,美国国家标准化组织

RDBMS 指的是关系型数据库管理系统

  • RDBMS 中的数据存储在被称为表(tables)的数据库对象中。
  • 表是相关的数据项的集合,它由列和行组成。

分类

数据操作语言 (DML) 和 数据定义语言 (DDL)

SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。

数据操作语言 (DML)

查询和更新指令构成了 SQL 的 DML 部分:更多的是操作表里的数据

  • SELECT - 从数据库表中获取数据
  • UPDATE - 更新数据库表中的数据
  • DELETE - 从数据库表中删除数据
  • INSERT INTO - 向数据库表中插入数据

数据定义语言 (DDL)

SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。更多的是操作数据库及表

SQL 中最重要的 DDL 语句:

  • CREATE DATABASE - 创建新数据库
  • ALTER DATABASE - 修改数据库
  • CREATE TABLE - 创建新表
  • ALTER TABLE - 变更(改变)数据库表
  • DROP TABLE - 删除表
  • CREATE INDEX - 创建索引(搜索键)
  • DROP INDEX - 删除索引

 SELECT 和 SELECT * 语句

SELECT 语句用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。

# 语法

SELECT 列名称 FROM 表名称

SELECT * FROM 表名称

 SELECT DISTINCT 语句

在表中,可能会包含重复值。该语句用于列出不同(distinct)的值。

关键词 DISTINCT 用于返回唯一不同的值。

# 语法

SELECT DISTINCT 列名称 FROM 表名称

 WHERE 子句

如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。

# 语法

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
操作符描述
=等于
<>不等于
<=>

= 或 != 只能判断基本数据类型

is 关键字只能判断null

<=> 既能判断null 又能判断 基本数据类型

>大于
<小于
>=大于等于
<=小于等于
BETWEEN在某个范围内
LIKE搜索某种模式
                                                          注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。

 AND 和 OR 运算符

AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。

AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。

如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。

如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

ORDER BY 语句

ORDER BY 语句用于根据指定的列对结果集进行排序

ORDER BY 语句默认按照升序对记录进行排序。

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

# 以字母顺序显示公司名称

SELECT Company, OrderNumber FROM Orders ORDER BY Company

# 以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber)

SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber

# 以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber)

SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber

# 以逆字母顺序显示公司名称,并以数字顺序显示顺序号

SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC

INSERT INTO 语句

INSERT INTO 语句用于向表格中插入新的行。

# 语法

INSERT INTO 表名称 VALUES (值1, 值2,....)

INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')

我们也可以指定所要插入数据的列

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')

Update 语句

Update 语句用于修改表中的数据。

# 语法

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'

DELETE 语句

DELETE 语句用于删除表中的行。

# 语法

DELETE FROM 表名称 WHERE 列名称 = 值

可以在不删除表的情况下删除所有的行。这意味着表的结构属性索引都是完整的

DELETE FROM table_name

或者:

DELETE * FROM table_name

练习题目:196. 删除重复的电子邮箱https://leetcode-cn.com/problems/delete-duplicate-emails/


TOP 子句

TOP 子句用于规定要返回的记录的数目。

对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。

注释:并非所有的数据库系统都支持 TOP 子句。

# SQL Server 的语法

SELECT TOP number|percent column_name(s) FROM table_name

SELECT TOP 2 * FROM Persons / SELECT TOP 50 PERCENT * FROM Persons

# MySQL 语法

SELECT column_name(s) FROM table_name LIMIT number

SELECT * FROM Persons LIMIT 5

# Oracle 语法

SELECT column_name(s) FROM table_name WHERE ROWNUM <= number

SELECT * FROM Persons WHERE ROWNUM <= 5

LIMIT数据分页

#提取n条数据
limit n 

#跳过m跳数据,提取n条数据
limit m,n 

LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

# 语法

SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern

SELECT * FROM Persons WHERE City LIKE 'N%'

SELECT * FROM Persons WHERE City LIKE '%g'

SELECT * FROM Persons WHERE City NOT LIKE '%lon%'

#  NOT 关键字  不包含

SELECT * FROM Persons WHERE City NOT LIKE '%lon%'

提示:"%" 可用于定义通配符(模式中缺少的字母)。

通配符

在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。

SQL 通配符必须与 LIKE 运算符一起使用。

通配符描述
%代表零个或多个字符
_仅替代一个字符
[charlist]字符列中的任何单一字符

[^charlist]

或者

[!charlist]

不在字符列中的任何单一字符
# 使用 _ 通配符  仅替代一个字符

SELECT * FROM Persons WHERE FirstName LIKE '_eorge'

# 使用 [charlist] 通配符  字符列中的任何单一字符

SELECT * FROM Persons WHERE City LIKE '[ALN]%'  -- 包含

SELECT * FROM Persons WHERE City LIKE '[!ALN]%'  --不包含

IN 操作符

IN 操作符允许我们在 WHERE 子句中规定多个值

# 语法

SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)

SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')

not in 与 null之间的关系

#判断id为根节点  满足p_id为null ,且在p_id中
#判断id为内部节点  满足id ,p_id中都有值
#判断id为叶子节点  满足p_id有值 ,p_id为null
select 
id
,case 
when p_id is null then 'Root'
when id not in (select p_id from tree) then 'Leaf'
else 'Inner' 
end as type  # 报错 判断都为Inner
from tree

A not in B的原理是拿A表值与B表值做是否不等的比较, 也就是a != b. 在sql中, null是缺失未知值而不是空值(详情请见MySQL reference).

当你判断任意值a != null时, 官方说, "You cannot use arithmetic comparison operators such as =, <, or <> to test for NULL", 任何与null值的对比都将返回null. 因此返回结果为否,这点可以用代码 select if(1 = null, 'true', 'false')证实.

练习题目:

608. 树节点https://leetcode.cn/problems/tree-node/

BETWEEN 操作符

操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。

这些值可以是数值、文本或者日期

# 语法

SELECT column_name(s) FROM table_name WHERE column_name
BETWEEN value1 AND value2

SELECT * FROM Persons WHERE LastName
BETWEEN 'Adams' AND 'Carter'

SELECT * FROM Persons WHERE LastName
NOT BETWEEN 'Adams' AND 'Carter'  -- 不在该范围内

重要事项:不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。所以,请检查你的数据库是如何处理 BETWEEN....AND 操作符的!(左闭右开or全开or左开右闭or全闭)

 Alias(别名)

通过使用 SQL,可以为列名称和表名称指定别名(Alias)。

# 表的 SQL Alias 语法

SELECT column_name(s) FROM table_name
AS alias_name

SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName 
FROM Persons, Product_Orders
WHERE Persons.LastName='Adams' AND Persons.FirstName='John'

SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'

# 列的 SQL Alias 语法

SELECT column_name AS alias_name
FROM table_name

SELECT LastName AS Family, FirstName AS Name
FROM Persons

JOIN

join 用于根据两个多个表中的列之间的关系,从这些表中查询数据。

"Persons" 表:

Id_PLastNameFirstNameAddressCity
1AdamsJohnOxford StreetLondon
2BushGeorgeFifth AvenueNew York
3CarterThomasChangan StreetBeijing

 "Orders" 表:

Id_OOrderNoId_P
1778953
2446783
3224561
4245621
53476465

JOIN

如果表中有至少一个匹配,则返回行

INNER JOIN  内连接

在表中存在至少一个匹配时,则返回行。INNER JOIN 与 JOIN 是相同的。

#语法

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P 

#可以使用join优化

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName

LEFT JOIN / LEFT OUTER JOIN 左连接

即使右表中没有匹配,也从左表返回所有的行

# 语法

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

RIGHT JOIN / RIGHT OUTER JOIN  右连接

即使左表中没有匹配,也从右表返回所有的行

# 语法

SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

FULL JOIN / FULL OUTER JOIN  全连接

只要其中一个表中存在匹配,就返回

# 语法

SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同

UNION 操作符默认选取不同的值。如果允许重复的值,请使用 UNION ALL

UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

Employees_China:

E_IDE_Name
01Zhang, Hua
02Wang, Wei
03Carter, Thomas
04Yang, Ming

Employees_USA:

E_IDE_Name
01Adams, John
02Bush, George
03Carter, Thomas
04Gates, Bill
行转列用groupby+sumif列转行用union all  1795. 每个产品在不同商店的价格https://leetcode.cn/problems/rearrange-products-table/
# UNION 语法

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA  -- UNION 命令只会选取不同的值

# UNION ALL 语法

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA  -- UNION ALL 命令会列出所有的值

                                         ——函数——                                        

IFNULL()函数

IFNULL函数是MySQL控制流函数之一,它接受两个参数,如果不是NULL,则返回第一个参数。 否则,IFNULL函数返回第二个参数。

两个参数可以是文字值或表达式

# 语法  如果expression_1不为NULL,则IFNULL函数返回expression_1; 否则返回expression_2的结果。
#      IFNULL函数根据使用的上下文返回字符串或数字。

IFNULL(expression_1,expression_2);

请注意,应避免在WHERE子句中使用IFNULL函数,因为它会降低查询的性能。

如果要检查值是否为NULL,则可以在WHERE子句中使用IS NULLIS NOT NULL

 COALESCE函数

 返回从左至右第一个非空表达式的值。  

COALESCE(expr1, expr2, ...., expr_n)

select coalesce(null,null,"1");    -- 返回结果 1

COALESCE和IFNULL函数的区别

只有2个表达式的时候,两者的用法可以互换 ;

有多个参数判断是否null时,只能使用COALESCE。

 NULLIF函数

NULLIF(expr1,expr2)

如果expr1不等于epxr2.那么返回expr1,如果相等就返回null;

 left()函数、right()函数

LEFT(ARG,LENGTH)、RIGHT(ARG,LENGTH) 

LEFT、RIGHT函数返回ARG最左边、右边的LENGTH个字符串,ARG可以是CHAR或BINARY STRING

eg: SELECT LEFT(NAME,2),RIGHT(NAME,2) FROM T1   

//返回结果为 'NA' 、'ME'   *从字符串左边开始截取长度为2的字符串   从字符串右边开始截取长度为2的字符串

substring()和substr()函数

用途 : 截取字符串

相同点:如果只是写一个参数,两者的作用都一样:都是是截取字符串从当前下标以后直到字符串最后的字符串片段。

var str = '123456789';
console.log(str.substr(2));    //  "3456789"
console.log(str.substring(2)) ;//  "3456789"

不同点:第二个参数

substr(字符串,截取开始位置,截取长度) //返回截取的字

substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串

substr('Hello World',1,1) //返回结果为 'H'  *0和1都是表示截取的开始位置为第一个字符

substr('Hello World',2,4) //返回结果为 'ello'

substr('Hello World',-3,3)//返回结果为 'rld' *负数(-i)表示截取的开始位置为字符串右端向左数第i个字符

substr(startIndex,lenth): 第二个参数是截取字符串的长度(从起始点截取某个长度的字符串);


substring(startIndex, endIndex): 第二个参数是截取字符串最终的下标 (截取2个位置之间的字符串,‘含头不含尾’)。

console.log("123456789".substr(2,5));    //  "34567"
console.log("123456789".substring(2,5)) ;//  "345"

var a="abcdefghiklmnopqrstuvwxyz";
var b=a.substr(3,5);
var c=a.substring(3,5);
打印输出的结果是:
defgh
de
截取的时候是不会截取到最后一个[3,5)

练习题目:

1667. 修复表中的名字https://leetcode-cn.com/problems/fix-names-in-a-table/

Split()函数

用途 : 截取字符串

格式:字段.split(字段名,'分隔字符',取出的第几个字符串)
如果没有分隔的字符,则返回整个字符串。

例 : ${cdxd_refund_management.CREATED_DEPT_IDS.split(',')[0]}

        其中CREATED_DEPT_IDS的值为:{98780318030426894,98780318030426686,25140425559900225}

        以逗号为分割点,截取经办人公司下标为 0 的 经办人公司编码 98780318030426894

 SUBSTRING_INDEX(str,delim,count)函数

在定界符 delim 以及count 出现前,从str返回自字符串。

若count为正值,则返回最终定界符(从左边开始)   不包含count

若count为-1,则是从后往前截取  不包含第一个

# 语法

SUBSTRING_INDEX(str,delim,count) 

MySQL中没有split()函数功能

CASE WHEN 及 SELECT CASE WHEN函数

简单Case函数

CASE sex

WHEN '1' THEN '男'

WHEN '2' THEN '女'

ELSE '其他' END

Case搜索函数 

CASE WHEN sex = '1' THEN '男' 

WHEN sex = '2' THEN '女' 

ELSE '其他' END

trim()函数

作用 : 去掉首尾空格

CONCAT拼接函数

作用 : 用于将两个字符串连接起来,形成一个单一的字符串。

replace()替换函数

REPLACE(String,from_str,to_str)

即:将String中所有出现的from_str替换为to_str。

也可以用于去掉不需要的字符

# 语法

REPLACE ( string_expression , string_pattern , string_replacement )

round()函数

作用 : 用于数据的四舍五入


#这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0;

round(x,d) -- #x指要处理的数,d是指保留几位小数

round(x)  -- 其实就是round(x,0),也就是默认d为0;

SUM()函数

作用 : 用于计算一组值或表达式的总和

SUM(DISTINCT expression)
  • 如果在没有返回匹配行SELECT语句中使用SUM函数,则SUM函数返回NULL,而不是0
  • DISTINCT运算符允许计算集合中的不同值。
  • SUM函数忽略计算中的NULL值。

rank ()开窗函数

-- <窗口函数> OVER ( [PARTITION BY <列清单> ]

-- ORDER BY <排序用列清单> )

#其中[ ]中的内容可以忽略

select emp_no, salary,dense_rank() over (order by salary desc) as rank

from salaries

where to_date='9999-01-01'

order by rank asc,emp_no asc;

RANK()       

在计算排序时,若存在相同位次,会跳过之后的位次

例如,有3条排在第1位时,排序为:1,1,1,4······

DENSE_RANK()

这就是题目中所用到的函数,在计算排序时,若存在相同位次,不会跳过之后的位次

例如,有3条排在第1位时,排序为:1,1,1,2······

ROW_NUMBER()

这个函数赋予唯一的连续位次

例如,有3条排在第1位时,排序为:1,2,3,4······

format()千分位函数

FORMAT 函数用于对字段的显示进行格式化

SELECT FORMAT(column_name,format) FROM table_name

select format(123456789,0) -- format(字段,保留小数点位数)

MOD()函数

用途:对数据进行取余

举例: mod(id, 2)=1 求是奇数的数

STRCMP(x,y)   字符串对比函数

STRCMP结果=0 表示相等

char(x)函数

 x 实际上是ASCII表中的十进制

ASCII码表

ASCII值

控制字符

ASCII值

控制字符

ASCII值

控制字符

ASCII值

控制字符

0

NUL

32

(space)

64

@

96

1

SOH

33

65

A

97

a

2

STX

34

66

B

98

b

3

ETX

35

#

67

C

99

c

4

EOT

36

$

68

D

100

d

5

ENQ

37

%

69

E

101

e

6

ACK

38

&

70

F

102

f

7

BEL

39

'

71

G

103

g

8

BS

40

(

72

H

104

h

9

HT

41

)

73

I

105

i

10

LF

42

*

74

J

106

j

11

VT

43

+

75

K

107

k

12

FF

44

,

76

L

108

l

13

CR

45

-

77

M

109

m

14

SO

46

.

78

N

110

n

15

SI

47

/

79

O

111

o

16

DLE

48

0

80

P

112

p

17

DCI

49

1

81

Q

113

q

18

DC2

50

2

82

R

114

r

19

DC3

51

3

83

X

115

s

20

DC4

52

4

84

T

116

t

21

NAK

53

5

85

U

117

u

22

SYN

54

6

86

V

118

v

23

TB

55

7

87

W

119

w

24

CAN

56

8

88

X

120

x

25

EM

57

9

89

Y

121

y

26

SUB

58

:

90

Z

122

z

27

ESC

59

;

91

[

123

{

28

FS

60

92

\

124

|

29

GS

61

=

93

]

125

}

30

RS

62

94

^

126

~

31

US

63

?

95

127

DEL

练习题目 : 627. 变更性别https://leetcode-cn.com/problems/swap-salary/

大小写转换函数

SQL UPPER()函数
SQL upper()函数字母大小写转换函数,将字母转成大写 - 返回字符串str,根据当前字符集映射的所有字符更改为大写。


SQL LOWER()函数
SQL lower()字母大小写转换函数,将字母转成小写 - 返回根据当前字符集映射所有字符改变为小写,即返回小写的字符串。

SQL UCASE() 函数
UCASE() 函数把字段的值转换为大写。

SELECT UCASE(column_name) FROM table_name;    

SQL LCASE() 函数
LCASE() 函数把字段的值转换为小写

SELECT LCASE(column_name) FROM table_name;  

TRIM()函数


用于去除字符串左右两边的空格(字符串字之间的空格不能去除)

group_concat函数

格式 : group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] ) 

 mysql中 all & any 的用法

any,all关键字必须与一个比较操作符一起使用。

any关键词可以理解为“对于子查询返回的列中的任一数值,如果比较结果为true,则返回true”。

all的意思是“对于子查询返回的列中的所有值,如果比较结果为true,则返回true”

any 可以与=、>、>=、结合起来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的任何一个数据。

all可以与=、>、>=、结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。mysql里all什么意思_mysql中all的用法是什么_落地后的阿飞们的博客-CSDN博客mysql中all的用法:1、all是“对于子查询返回的列中的所有值,如果比较结果为true,则返回true”;2、all可以与【=、>、>=、】结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于。mysql中all的用法:最近一直在练习MYSQL的多表查询,基本上每个查询语句我都会写至少两次:一次join连接,一次子查询。来对比一下MYSQL在不同的查询方式下的工作方...https://blog.csdn.net/weixin_29822105/article/details/113956981

 日期函数MySQL 时间函数加减计算_云中鲸的博客-CSDN博客_mysql 时间计算一、MySQL 获得当前日期时间 函数1.1 获得当前日期 + 时间(date + time)1.2 获得当前日期 + 时间(date + time)1.3 获得当前日期(date)1.4 获得当前时间(time)1.5 获得当前 UTC 日期时间二、MySQL 日期时间 Extract(选取) 函数2.1 选取日期时间的各个部分:2.2 MySQL Extract() ...https://blog.csdn.net/qq_38486203/article/details/80654040

DATEDIFF()函数

DATEDIFF() 函数返回两个日期之间的天数,通俗的讲就是计算时间差。

#语法格式 

DATEDIFF(date1,date2)

得到的结果为 date1 与 date2 相差天数,如果 date1 比 date2 大,则结果为正,反之则为负。

练习题目:

197. 上升的温度https://leetcode.cn/problems/rising-temperature/

 JSON_EXTRACT() 函数

MySQL JSON_EXTRACT() 函数在 JSON 文档提取路径表达式指定的数据并返回。

格式 :JSON_EXTRACT(json, path, ...)

JSON_EXTRACT() 函数将在以下情况下返回错误:

Invalid JSON text in argument 1 to function json_extract: "The document is empty." at position 0
  • 如果参数 json 不是有效的 JSON 文档,MySQL 将会给出错误。您可以使用JSON_VALID() 验证 JSON 文档的有效性。
  • 如果参数 path 不是有效的路径表达式, MySQL 将会给出错误。

MySQL JSON_EXTRACT() 函数MySQL JSON_EXTRACT() 函数在 JSON 文档提取路径表达式指定的数据并返回。https://www.sjkjc.com/mysql-ref/json_extract/

JSON_VALID() 函数

 MySQL JSON_VALID() 函数返回 0 和 1 来指示给定的参数是否是一个有效的 JSON 文档。

格式 :JSON_VALID(str)

返回值

JSON_VALID() 函数验证给定的参数是否是一个有效的 JSON 文档。如果给定的参数是有效的 JSON 文档,JSON_VALID() 函数返回 1,如果不是 JSON 文档,JSON_VALID() 函数返回 0

如果参数为 NULL,此函数将返回 NULL

MySQL JSON_VALID() 函数https://www.sjkjc.com/mysql-ref/json_valid/

 JSON_UNQUOTE() 函数

MySQL JSON_UNQUOTE() 函数取消双引号引用 JSON 值,并将结果作为字符串返回。

格式 :JSON_UNQUOTE(json_val)

参数

json_val

必需的。一个字符串。

返回值

JSON_UNQUOTE() 函数取消双引号引用 JSON 值,并将结果作为字符串返回。

如果参数为 NULLJSON_UNQUOTE() 函数返回 NULL

如果值以双引号开头和结尾,但不是有效的 JSON 字符串文本,MySQL 将返回类似的错误: ERROR 3141 (22032): Invalid JSON text in argument 1 to function json_unquote: xxx.

MySQL 能够识别下表中的转义字符:

转义序列序列表示的字符
\"双引号 "
\b退格字符
\f换页符
\n换行符
\r回车符
\t制表符
\\反斜杠 \
\uXXXXUnicode 值  XXXX  的 UTF-8 字节
MySQL JSON_UNQUOTE() 函数https://www.sjkjc.com/mysql-ref/json_unquote/

 数据类型

在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。

Text 类型:

数据类型描述
CHAR(size)保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。
VARCHAR(size)

保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。

注释:如果值的长度大于 255,则被转换为 TEXT 类型。

TINYTEXT存放最大长度为 255 个字符的字符串。
TEXT存放最大长度为 65,535 个字符的字符串。
BLOB用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。
MEDIUMTEXT存放最大长度为 16,777,215 个字符的字符串。
MEDIUMBLOB用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。
LONGTEXT存放最大长度为 4,294,967,295 个字符的字符串。
LONGBLOB用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。
ENUM(x,y,z,etc.)

允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。

注释:这些值是按照你输入的顺序存储的。

可以按照此格式输入可能的值:ENUM('X','Y','Z')

SET与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。

Number 类型:

数据类型描述
TINYINT(size)-128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。
SMALLINT(size)-32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。
MEDIUMINT(size)-8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。
INT(size)-2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。
BIGINT(size)-9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*。在括号中规定最大位数。
FLOAT(size,d)带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
DOUBLE(size,d)带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
DECIMAL(size,d)作为字符串存储的 DOUBLE 类型,允许固定的小数点。

* 这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。

Date 类型:

数据类型描述
DATE()

日期。格式:YYYY-MM-DD

注释:支持的范围是从 '1000-01-01' 到 '9999-12-31'

DATETIME()

*日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'

TIMESTAMP()

*时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描述来存储。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC

TIME()

时间。格式:HH:MM:SS

注释:支持的范围是从 '-838:59:59' 到 '838:59:59'

YEAR()

2 位或 4 位格式的年。

注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。

* 即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。


重要事项 

  • 一定要记住,SQL 对大小写不敏感 
  • 分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的语句。
  • 条件值周围使用的是单引号

    SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自己用的,对别人无用 create table t_classify_method ( id uniqueidentifier primary key default newid(), name_ch nvarchar(20), naem_en nvarchar(60), d_code nvarchar(2) ) go insert into t_classify_method(id, name_ch, name_en, d_code) values ('2F71F378-6D5F-473C-A43C-B34216532E5D', '按蒸制方式分', 'By cooking method', '10') go insert into t_classify_method(id, name_ch, name_en, d_code) values ('5A089703-DD0F-4189-ADBD-51661C5A49B2', '按地域菜系分', 'By Cuisine ', '20') go create table t_dish_type ( id uniqueidentifier primary key default newid(), name_ch nvarchar(20), naem_en nvarchar(50), d_code nvarchar(2), classify_code nvarchar(2), item_index int, deleted_flag bit default 0 ) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('44A09637-51AF-4D7C-94A9-4346D41C8D53', '特色菜类', 'Special dishes', '01', '10', 1) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('67BDF3CE-3C58-48D9-B10D-169082D52CD5', '炒菜类', 'Stir-fries', '02', '10', 2) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('81165D4A-A49D-4008-9C74-4EC27609E9DA', '火锅类', 'Chafing dish', '03', '10', 3) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('78DC1E62-42D7-4B4D-8069-3E1500126492', '汤菜类', 'Soup', '04', '10', 4) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('9F59125C-6896-4BE8-8E7C-941F6CF88C3F', '清蒸类', 'Steamed dishes', '05', '10', 5) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('B01C0007-310A-46A1-834A-745B28A37FA8', '主食类', 'Staple food', '06', '10', 6) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('2C53093C-5BA8-4D84-9151-90BD56C35C26', '酒水类', 'Drinks', '07', '10', 7) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('C3E21EBB-86B2-4D84-99A0-B1A28749456C', '鲁菜', 'Shandong Cuisine', '08', '20', 1) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('7BA617C6-05F9-4737-B699-8776D93817E4', '川菜', 'Sichuan Cuisine', '09', '20', 2) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('172EDB24-3729-40DA-AE0B-E1164DAE33B5', '粤菜', 'Guangdong Cuisine', '10', '20', 3) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('388A0F43-0BCE-4285-8290-757E7DD08926', '闽菜', 'Fujian Cuisine', '11', '20', 4) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('8B6D107E-4CFA-461F-BB76-FCA70D5A60BC', '苏菜', 'Jiangsu Cuisine', '12', '20', 5) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('95D50EF5-6230-46E6-BD9C-F7F7779E7602', '浙菜', 'Zhejiang Cuisine', '13', '20', 6) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('4A31EF34-46AF-4378-99AA-5E80F2B596E1', '湘菜', 'Hunan Cuisine', '14', '20', 7) go insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('358C5D85-FB36-4B56-BB10-16E62A14EB56', '徽菜', 'Anhui Cuisine', '15', '20', 8) go create table t_dish_unit ( id uniqueidentifier primary key default newid(), name_ch nvarchar(5), naem_en nvarchar(20), d_code nvarchar(2), deleted_flag bit default 0 ) go create table t_dishes ( id uniqueidentifier primary key default newid(), name_ch nvarchar(20), naem_en nvarchar(50), dishType_id1 uniqueidentifier, dishType_id2 uniqueidentifier, price nvarchar(12), dishUnit_id uniqueidentifier, ordered_number int, dishMemo nvarchar(500), dishImage image, create_time time default getdate(), companyNo nvarchar(5), deleted_flag bit default 0 ) go

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值