概要
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 流程控制
来源:oschina
链接:https://my.oschina.net/u/3160411/blog/1589387