SQL总结

你。 提交于 2020-03-01 14:40:36

概要

SQL的增删改查操作的对象是数据库表中的记录
SQL语句的要素:

  • 一是指明具体操作的关键字,insert、delete、update、select;
  • 二是表名,缩小目标记录的范围;
  • 三是条件表达式,对表中记录进行筛选,还可以对筛选出的结果进一步筛选;
  • 四是操作的具体内容,查询和删除不需要指明操作内容,插入和更新需要指明具体的列名和值。

SQL增删改查的重点在于使用条件表达式对记录进行筛选
增删改查四种操作:

  • 按是否对数据库数据有影响,可以分为查和增删改
  • 按操作的记录是已经存在或不存在的,可以分为插入和删改查
  • 按操作表的数量可以分为单表操作和多表操作

条件表达式对插入操作并不适用:insert语句操作的不是已经存在的记录,所有不需要对记录进行筛选的条件表达式,所以insert语句不能带where子句,insert语句可以结合IF、ELSE、NOT等结构实现条件插入。

该总结以MySQL为准,不同数据库系统之间存在差异

 

四种基本操作(单表不带条件)

select语句
select  列名,列名  from 表名
select  列名 as 别名 from 表名
select  *  from 表名
select distinct 列名 from 表名

insert语句
insert  into  表名  values  (值,值......)
insert  into  表名  (列名,列名......)  values  (值,值......)

update语句
update  表名 set  列名=值 ,列名=值

delete语句
delete  from  表名

 

注:多个列名或值用逗号隔开,insert语句需要用括号包裹

 

运算符与表达式

比较运算符
=  
<=> 用于判断NULL,例如:select NULL<=>NULL
<> 或 != 不能判断NULL,建议使用前者
<  
>  
<=  
>=  
IS NULL 或 ISNULL 是NULL返回1
IS NOT NULL  
LEAST 返回最小值,格式 LEAST(val,val,......)
GREATEST  
BETWEEN AND  
IN 判断某个值是否在某个列表中
NOT IN  
LIKE  
REGEXP 正则
逻辑运算符
NOT 或 ! NOT NULL 返回 NULL
AND 或 && 有0返回0,有NULL无0,返回NULL,其他返回1
OR 或 || 有1返回1,有NULL无1,返回NULL,其他返回0
XOR 异或,有NULL返回NULL,一0一1返回1,其他0
算术运算符
+
-
*
/
% 求余
位运算符
&
|
~
^ 异或
<< 左移
>> 右移

注:=、<、>都不能用于比较NULL,应该使用IS NULL等进行判断 ;表达式比较之后的返回值是1或0,而非true或false

MySQL中的通配符、正则表达式

1.正则

2.通配符必须与like一起使用

%  替代一个或多个字符

_  仅替代一个字符

[charlist]  字符列中的任何单一字符

[^charlist]或[!charlist]  不在字符列中的任何单一字符

SQL子句以及执行顺序

WHERE

where后面的表达式格式:列名 + 操作符 + 值 ;多个表达式可以使用AND和OR以及()表达更加复杂的逻辑。

GROUP BY 与 合计函数

 按一个或多个字段分组,多个字段用逗号隔开,一般与合计函数结合使用;合计函数和group by子句并不互相依赖,都可以单独使用,但是只分组不进行合计或其他操作没有什么实际意义。

HAVING

where后面无法使用合计函数,所以引入having子句;where和having子句都可以单独使用,也可以同时使用。先分组,然后合计,然后having判断。

ORDER BY

用于排序,指明升序用ASC ,降序用DESC,默认是升序;格式:order by 列名 ASC , 列名 DESC

LIMIT

通过索引和数量筛选记录,limit子句接收一个或两个参数,第一个表示偏移量,第二个表示从第一个参数开始之后的记录条数,偏移量是从0开始不是1。

执行顺序

select语句的书写顺序是固定的

<SELECT clause> 

[<FROM clause>] 

[<WHERE clause>]

[<GROUP BY clause>] 

[<HAVING clause>]

[<ORDER BY clause>] 

[<LIMIT clause>]

执行顺序为:FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->

  每个子句执行后都会产生一个中间结果,供接下来的子句使用。执行select的时候还可能会有聚合函数,DISTINCT字句等 ;

  在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用(聚合函数是针对结果集进行的,但是where条件并不是在查询出结果集之后运行,所以主函数放在where语句中,会出现错误)。

参考博客

MySQL常用系统函数

判断与比较函数

  • isnull()
  • max()/min()  [字符串日期也能比较]

字符串的函数

  • left(字段名,位数)
  • concat()函数
  • length()和char_length()函数,前者返回字节数,后者返回字符数
  • substring(str,m,n)
  • find_in_set(字符串,列名)查找某个字段中包含给定字符串的记录

日期的函数

  • curtime() [当前时间,返回类型为]

聚合函数:SQL基本函数,聚合函数对一组值执行计算,并返回单个值。除了 COUNT 以外,聚合函数都会忽略空值。 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用。

  • AVG
  • COUNT [count(*)速度慢]
  • MIN/MAX
  • SUM
  • GROUP_CONCAT

多表联合操作

JOIN

/*user表id是主键,order表u_id关联user表id*/
select user.xxx,order.xxx from user,order where user.id=order.u_id;

INNER JOIN(和JOIN是相同的)

/*使用on关键字*/
select user.xxx,order.xxx from user inner join order on user.id=order.u_id;

LEFT JOIN

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

RIGHT JOIN

和left join相反,如果交换左右表的位置可以达到同样的效果

FULL JOIN

left join和right join的并集

UNION

对两个查询语句的结果集进行纵向合并,要求两个结果集字段的数据类型,顺序都是相同的。

union不允许重复记录,union all可以重复

ON和USING

/*使用on关键字*/
select user.xxx,order.xxx from user inner join order on user.id=order.u_id;

/*如果order表和user表中关联字段的字段名相同,都是xxx,可以使用using简化*/
select user.xxx,order.xxx from user inner join order on using(xxx);

子查询

--创建临时表
select * from (select * from tb_demo) as tb_temp where 

--重复的记录只返回一条
select distinct * from tb_demo;

--某个字段相同的记录只返回一条
select distinct 字段名 from tb_demo;

http://www.jb51.net/article/48994.htm

存储过程

索引

触发器

游标

视图

SQL编程

SQL自定义函数

流程控制

if(expr1,expr2,expr3)实现0、1与男、女的转换

case...when...then...else...end 实现if表达式

ifnull(expr1,expr2) 参考

if else 流程控制

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!