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)建议别名简短,见名知意

去重DISTINCT

着重号

例如:select name from t_stu;

可以给字段或表名加着重号

如果字段名或表名与关键字一样更要加着重号了

MySQL的运算符

 

(1)算术运算符:+ - * /(除也可以写成div,div取整) %(取模可以写成mod)

(2)比较运算符:= > >= < <= !=(不等于还可以写成<>) <=>(安全等于)

(3)逻辑运算符:&&(逻辑与也可以写成and) ||(逻辑或也可以写成or) not(逻辑非) xor(逻辑异或)

(4)范围:表达式 between ... and ... (也可以写成 表达式>=... and 表达式 <=...)

表达式 not between ... 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语句

内连接(INNER JOIN)

有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行

格式:

隐式: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)

全外连接(FULL OUTER JOIN),简称全连接(FULL JOIN)。

自连接

当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询

select的5个子句

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 筛选

    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语句再次查询

        • exists型子查询

        • 事务

          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语句。

 

posted on 2020-10-21 20:24  QingSeaSnow  阅读(123)  评论(0)    收藏  举报