MySQL学习随笔02
SELECT 查询列表
FROM 表名或视图列表
【WHERE 条件表达式】
【GROUP BY 字段名 【HAVING 条件表达式】】
【ORDER BY 字段 【ASC|DESC】】
【LIMIT m,n】;
说明:
(1)如果SELECT后面是*,那么表示查询所有字段
(2)SELECT后面的查询列表,可以是表中的字段,常量值,表达式,函数
(3)查询的结果是一个虚拟的表
select语句,可以包含5种子句:依次是where、 group by、having、 order by、limit必须照这个顺序。
别名AS
语法:AS 别名
说明:
(1)可以给字段取别名、可以给表名取别名
(2)AS 可以省略
(3)如果给字段取别名,如果别名中包含特殊符号,例如“空格”等,建议给别名加上双引号或单引号
(4)如果是给表名取别名,那么不能加双引号或单引号,也不能有特殊符号,例如“空格”等
(5)建议别名简短,见名知意
着重号
例如:select name from t_stu;
可以给字段或表名加着重号
如果字段名或表名与关键字一样更要加着重号了
MySQL的运算符
(1)算术运算符:+ - * /(除也可以写成div,div取整) %(取模可以写成mod)
(2)比较运算符:= > >= < <= !=(不等于还可以写成<>) <=>(安全等于)
(3)逻辑运算符:&&(逻辑与也可以写成and) ||(逻辑或也可以写成or) not(逻辑非) xor(逻辑异或)
(4)范围:表达式 between ... and ... (也可以写成 表达式>=... and 表达式 <=...)
(5)集合:in (值,值,值...) not in(值,值,值...)
(6)模糊查询:LIKE NOT LIKE,通配符:%表示0-n个字符,_下划线代表一个字符
(7)位运算符:&(按位与) |(按位或)^(按位异或)~(按位取反)>>(右移)<<(左移)
(8)NULL值判断,is null 或 is not null,如果使用null=null,null<>null,null=0,null<>0,null=false等都不对
不过xxx is null 可以使用xxx <=> null ,xxx is not null 可以写成 not xxx <=> null
结论:所有的运算符遇到NULL结果都是NULL,除了<=>
关联查询,联合查询
作用:从2张或多张表中,取出有关联的数据.
关联查询一共有几种情况:
-
内连接:INNER JOIN 、CROSS JOIN
-
外连接:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)、全外连接(FULL OUTER JOIN)
-
自连接:当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义
说明:
(1)连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
(2)当两个关联查询的表如果有字段名字相同,并且要查询中涉及该关联字段,那么需要使用表名前缀加以区分
(3)当如果表名比较长时,可以给表取别名,简化SQL语句
有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行
格式:
隐式:SELECT [cols_list] from 表1,表2 where [condition]
显式:SELECT [cols_list] from 表1 INNER JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT [cols_list] from 表1 CROSS JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT [cols_list] from 表1 JOIN 表2 ON [关联条件] where [其他筛选条件]
外连接(OUTER JOIN)
外连接分为:
左外连接(LEFT OUTER JOIN),简称左连接(LEFT JOIN)
右外连接(RIGHT OUTER JOIN),简称右连接(RIGHT JOIN)
自连接
当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询
where条件查询
从原表中的记录中进行筛选
group by 分组查询
很多情况下,用户都需要进行一些汇总操作,比如统计整个公司的人数或者统计每一个部门的人数等。
聚合函数
-
AVG(【DISTINCT】 expr) 返回expr的平均值
-
COUNT(【DISTINCT】 expr)返回expr的非NULL值的数目
-
MIN(【DISTINCT】 expr)返回expr的最小值
-
MAX(【DISTINCT】 expr)返回expr的最大值
-
SUM(【DISTINCT】 expr)返回expr的总和
having与where类似,可筛选数据
having与where不同点
-
where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据
-
where后面不能写分组函数,而having后面可以使用分组函数
-
having只用于group by分组统计语句
order by 排序
-
按一个或多个字段对查询结果进行排序
用法:order by col1,col2,col3...
说明:先按col1排序如果col1相同就按照col2排序,依次类推
col1,col2,col3可以是select后面的字段也可以不是
-
默认是升序,也可以在字段后面加asc显示说明是升序,desc为降序
例如:order by click_count desc;
如果两个字段排序不一样,例如:
order by 字段1 asc ,字段2 desc;
-
order by 后面除了跟1个或多个字段,还可以写表达式,函数,别名等
-
limit 分页
limit m,n
m表示从下标为m的记录开始查询,第一条记录下标为0,n表示取出n条出来,如果从m开始不够n条了,就有几条取几条。m=(page-1)*n,(page页码,n表示每页显示的条数)
如果第一页limit 0,n <=> limit n
如果第二页limit n,n
依次类推,得出公式limit (page-1)*n , n
-
-
where 型子查询
where型子查询即把内层sql语句查询的结果作为外层sql查询的条件.
-
子查询要包含在括号内。
-
建议将子查询放在比较条件的右侧。
-
单行操作符对应单行子查询,多行操作符对应多行子查询。
-
单行操作符 右边子查询必须返回的是单个值,单行比较运算符(=,>,>=,<,<=,<>)
-
多行操作符 右边子查询可以返回多行,但必须是单列,ALL, ANY,IN 其中,ALL和ANY运算符必须与单行比较运算符(=,>,>=,<,<=,<>)结合使用
-
from型子查询
from型子查询即把内层sql语句查询的结果作为临时表供外层sql语句再次查询
-
-
事务
DCL用来控制数据库的访问,包括如下SQL语句:
-
GRANT:授予访问权限
-
REVOKE:撤销访问权限
-
COMMIT:提交事务处理
-
ROLLBACK:事务处理回退
-
SAVEPOINT:设置保存点
-
LOCK:对数据库的特定部分进行锁定
6.1 事务
思考:我去银行给朋友汇款,我卡上有1000元,朋友卡上500元,我给朋友转账50元(无手续费),如果,我的钱刚扣,而朋友的钱又没加时,网线断了,怎么办?
6.1.1 事务的ACID特性
-
原子性(Atomicity):原子意为最小的粒子,或者说不能再分的事物。数据库事务的不可再分的原则即为原子性。 组成事务的所有SQL必须:要么全部执行,要么全部取消(就像上面的银行例子)。
-
一致性(Consistency):指数据的规则,在事务前/后应保持一致
-
隔离性(Isolation):简单点说,某个事务的操作对其他事务不可见的.
-
持久性(Durability):当事务提交完成后,其影响应该保留下来,不能撤消
6.1.2事务的用法
-
开启事务(start transaction)
-
执行sql操作(普通sql操作)
-
提交/回滚(commit/rollback)
注意:
-
建表的时候,选择** Innodb引擎才支持事务**
-
默认情况下,MySQL是自动提交事务,每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚。如果某一组操作需要在一个事务中,那么需要使用start transaction,一旦rollback或commit就结束当次事务,之后的操作又自动提交。
-
如果需要在当前会话(连接)的整个过程中都取消自动提交事务,进行手动提交事务,就需要设置set autocommit = false;或set autocommit = 0;那样的话每一句SQL都需要手动commit提交才会真正生效。rollback或commit之前的所有操作都视为一个事务,之后的操作视为另一个事务,还需要手动提交或回滚。
-
和Oracle一样,DDL语句是不能回滚的,并且部分的DDL语句会造成隐式的提交,因此最好事务中不要涉及DDL语句。
-
-
-
-
浙公网安备 33010602011771号