MySQL数据库复习(二)
MySQL 排序
select 字段1,字段2,....from 数据库表1,数据库表2,.....
order by 字段1[ASC | DESC]
eg: select * from `sbxl` order by sbxl_date;
使用order by根据某个字段排序
MySQL分组
实例演示:
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS employee_tbl
;
CREATE TABLE employee_tbl
(
id
int(11) NOT NULL,
name
char(10) NOT NULL DEFAULT ‘’,
date
datetime NOT NULL,
singin
tinyint(4) NOT NULL DEFAULT ‘0’ COMMENT ‘登录次数’,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO employee_tbl
VALUES (‘1’, ‘小明’, ‘2016-04-22 15:25:33’, ‘1’), (‘2’, ‘小王’, ‘2016-04-20 15:25:47’, ‘3’), (‘3’, ‘小丽’, ‘2016-04-19 15:26:02’, ‘2’), (‘4’, ‘小王’, ‘2016-04-07 15:26:14’, ‘4’), (‘5’, ‘小明’, ‘2016-04-11 15:26:40’, ‘4’), (‘6’, ‘小明’, ‘2016-04-04 15:26:54’, ‘2’);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
set names utf8;
使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:
select name
,count(*) from employee_tbl GROUP BY name
;
WITH ROLLUP
WITH ROLLUP:在group分组字段的基础上再进行统计数据。
SELECT COALESCE(`name`,"总共") AS `name`,SUM(money)
as money FROM `test` GROUP BY `name` WITH ROLLUP;
MySQL 连接的使用
使用 MySQL 的 JOIN 在两个或多个表中查询数据。
可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录
INNER JOIN实例:
CREATE table tcount_tbl(
runoob_author VARCHAR(20),
runnob_count INT(255));
insert into tcount_tbl (runoob_author,runnob_count) VALUES
("菜鸟教程",10),("RUNOOB.COM",20),("Google",22);
CREATE TABLE runoob_tbl(
runoob_id INT(255) PRIMARY KEY auto_increment,
runoob_title VARCHAR(20),
runoob_author VARCHAR(20),
submission_date DATE);
INSERT INTO runoob_tbl (runoob_title,runoob_author,submission_date) VALUES
("学习PHP","菜鸟教程",NOW()),
("学习MySQL","菜鸟教程",NOW()),
("学习JAVA","RUNOOB.COM",NOW()),
("学习Python","RUNOOB.COM",NOW()),
("学习C","PS",NOW());
eg: select b.runoob_id,a.runoob_author,a.runnob_count from tcount_tbl a INNER JOIN runoob_tbl b ON a.runoob_author = b.runoob_author;
LEFT JOIN:
select b.runoob_id,b.runoob_author,a.runnob_count from tcount_tbl a RIGHT JOIN runoob_tbl b ON a.runoob_author = b.runoob_author;
MySQL 正则表达式
MySQL可以通过 LIKE …% 来进行模糊匹配;
同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配.
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。 |
. | 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。 |
[…] | 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 |
p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
实例:
查找name字段中以’st’为开头的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP ‘^st’;
查找name字段中以’ok’为结尾的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP ‘ok$’;
查找name字段中包含’mar’字符串的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP ‘mar’;
查找name字段中以元音字符开头或以’ok’字符串结尾的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP ‘^[aeiou]|ok$’;
MySQL 事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
实例:
BEGIN;
INSERT INTO `employee_tbl` VALUES
('1', '小明', '2016-04-22 15:25:33', '1'),
('2', '小王', '2016-04-20 15:25:47', '3');
INSERT INTO `employee_tbl` VALUES
('3', '小丽', '2016-04-19 15:26:02', '2'),
('4', '小王', '2016-04-07 15:26:14', '4'),
('5', '小明', '2016-04-11 15:26:40', '4'),
('6', '小明', '2016-04-04 15:26:54', '2');
COMMIT;