lumen 自定义错误日志文件
本节复习mysql的基础知识,这部分会较详细的复习,因为mysql在日常开发中起到的作用非常大
1, mysql 新增用户 insert into user (host, user, password, select_priv, insert_priv, update_priv) values ('localhost', 'guest', password('root'), 'Y', 'Y', 'Y')
其中的password('root')是对密码进行加密,然后存储
增加完用户后同时要进行 flush privileges 进行重新载入索引表,这样才能起作用
2,mysql命令新增用户的方法: GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON TUTORIALS.* TO 'zara'@'localgost' IDENTIFIED BY 'zara123'
3,常用的mysql管理命令
use 数据库名 选库
show databases 列出mysql数据库管理系统的数据库列表
show tables 显示指定数据库的所有表
show columns from 数据表 显示数据表的属性,属性类型,主键信息,是否为null, 默认值等其他信息
show index from 数据表 展示数据表的详细索引信息,包括primary key 主键
show tables status
4,PHP 提供了函数 mysqli_select_db 来选取一个数据库。函数在执行成功后返回 TRUE ,否则返回 FALSE 。mysqli_select_db(connection,dbname);
5,数值类型

6,日期与时间类型

7,字符串类型

8,在我们执行完 SELECT 语句后,释放游标内存是一个很好的习惯。可以通过 PHP 函数 mysqli_free_result() 来实现内存的释放。
9,MySQL 的 WHERE 子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。
mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='runoob.com'; Empty set (0.01 sec) mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='RUNOOB.COM'; +-----------+---------------+---------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-----------+---------------+---------------+-----------------+ | 3 | JAVA 教程 | RUNOOB.COM | 2016-05-06 | | 4 | 学习 Python | RUNOOB.COM | 2016-03-06 | +-----------+---------------+---------------+-----------------+ 2 rows in set (0.01 sec)
10,select country from A union select country from B UNION 不能用于列出两个表中所有的country。如果一些网站和APP来自同一个国家,每个国家只会列出一次。UNION 只会选取不同的值。请使用 UNION ALL 来选取重复的值!
若要列出所有的值,包括重复的,可以使用union all select country from A union all select country from B
11, group by 可以根据一个列或者多个列对结果进行分组,在分组的列上可以使用count, sum avg 进行计算
使用 with rollup 可以实现在分组统计数据基础上再进行相同的统计
select name, SUM(singin) as sing_count from employee_tb1 group by name with rollup

其中null 中的值为所有人的所有次数,可以使用coalesce 来设置一个可以取代null的名称,coalesce的语法;
select coalesce(a,b,c); 如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。
将sql 改为 select coalesce(name,'总数'), SUM(singin) as sing_count from employee_tb1 group by name with rollup
12, having having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。
eg: select region sum(pop), sum(area) from A group by region having sum(area) >100000
以下是having和where的区别:
Select city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。
WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。因此,WHERE
子句不能包含聚集函数; 因为 试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING
子句总是包含聚集函数。(严格说来,你可以写不使用聚集的 HAVING 子句, 但这样做只是白费 劲。同样的条件可以更有效地用于 WHERE
阶段。)
13,mysql 多表联查的时候需要使用到了join 包括inner join, left join, rignt join
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
14, 连表查询实例
inner join 内连接查询:
获取A表与B表中runoob_id一样的列的runoob_id和runoob_author
select a.runoob_id, a.runoob_author, b.runoob_count from A a inner join B b on a.runoob_id = b.runoob_id
图解:

left join
MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
select a.runoob_id, a.runoob_author,b.runoob_count from A a left join B b on a.runoob_author = b.runoob_author
以上实例中使用了 LEFT JOIN,该语句会读取左边的数据表 A 的所有选取的字段数据,即便在右侧表 B 中 没有对应的 runoob_author 字段值。
图解:

right join
MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。
select a.runoob_id, a.runoob_author,b.runoob_count from A a right join B b on a.runoob_author = b.runoob_author
与left相反,主要以右侧表为主

15,在mysql 中使用正则表达式进行匹配
eg: select name from person_tb1 where name REGEXP '^st' 取出以st开头的符合条件的列
16, 事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
17,事务的原子性:一组事务,要么成功;要么撤回。稳定性 :有非法数据(外键约束之类),事务撤回。隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
18, 事务的控制语句:
BEGIN或START TRANSACTION;显式地开启一个事务;
COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
ROLLBACK TO identifier;把事务回滚到标记点;
SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
19,mysql 的事务处理主要有两种方法
用 BEGIN, ROLLBACK, COMMIT来实现 BEGIN 开始一个事务 ROLLBACK 事务回滚 COMMIT 事务确认
直接用 SET 来改变 MySQL 的自动提交模式: SET AUTOCOMMIT=0 禁止自动提交 SET AUTOCOMMIT=1 开启自动提交
20,在php 中使用事务的时候,默认mysql是开启自动提交的,因此需要设置不自动提交 mysqli_query($conn, "SET AUTOCOMMIT=0");
21,Alert 当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。

浙公网安备 33010602011771号