触发器
MariaDB [sky]> delimiter //
MariaDB [sky]> create trigger tns after insert on t1
-> FOR EACH ROW
-> BEGIN
-> insert into t2 values (1);
-> insert into t3 values (0);
-> END //
MariaDB [sky]> delimiter ;
MariaDB [sky]> insert into t1 values (100);
MariaDB [sky]> select * from t1,t2,t3;
+------+------+------+
| a | b | c |
+------+------+------+
| 100 | 1 | 0 |
+------+------+------+
存储函数
示例:
1、
MariaDB [sky]> CREATE PROCEDURE cp(IN rangeID INT,OUT Nbr INT)
-> BEGIN
-> SELECT COUNT(*) INTO Nbr FROM class WHERE id < rangeID;
-> END //
MariaDB [sky]> call cp(5,@num) //
MariaDB [sky]> select @num //
2、
MariaDB [sky]> CREATE FUNCTION cf(rangID INT)
-> RETURNS INT
-> BEGIN
-> RETURN (SELECT COUNT(*) FROM class WHERE id < rangID);
-> END //
Query OK, 0 rows affected (0.00 sec)
MariaDB [sky]> SELECT cf(4) //
视图
/*创建视图view_t*/
MariaDB [sky]> CREATE VIEW view_1 AS SELECT id,name,interest FROM class;
/*从视图中查询值*/
SELECT * FROM view_1;
/*从view_1创建view_2视图,使用自己的命名*/
CREATE VIEW view_2(b,c) AS SELECT name,interest FROM view_1;
数据备份和恢复
/*一张表*/
mysqldump -uroot -pmonian shopping since_buy > buy.sql
/*多个表*/
mysqldump -uroot -pmonian shopping since_buy t1 > more.sql
/*一个数据库*/
mysqldump -uroot -pmonian shopping > now.sql
/*多个数据库*/
mysqldump -uroot -pmonian --databases shopping demo > muti_dbs.sql
/*全部数据库*/
mysqldump -uroot -pmonian --all-databases > all.sql
实例:
1、备份sky库
[root@db1 ~]# mysqldump -u root -h localhost -p123456y --database sky > QAZWSXEDC.sql
2、备份sky库里的两张表
[root@db1 ~]# mysqldump -u root -h localhost -p123456y sky class school > YHNUJMIK.sql
查看备份结果
[root@db1 ~]# ls
QAZWSXEDC.sql YHNUJMIK.sql
数据恢复
基本语法:
mysql -u user -p password [dbname] < filename.sql
示例:
[root@db1 ~]# mysql -uroot -p123456y < QAZWSXEDC.sql
对于已经登录到mysql服务器的用户,可以用source恢复
MariaDB [(none)]> source /root/QAZWSXEDC.sql
创建用户
1、
MariaDB [sky]> create user 'my1'@'localhost' IDENTIFIED BY 'passwd_my1';
MariaDB [sky]> grant all privileges on *.* to 'my1'@'localhost';
2、
MariaDB [sky]> grant all privileges on *.* to 'my2'@'localhost' IDENTIFIED BY 'passwd_my2';
3、
insert into mysql.user (Host,User,Password) values ('localhost','NIKI',PASSWORD('NIKI'));
查询语句
select 字段1,字段2,字段3...
-> from [表1],[表2]... //数据来源
-> WHERE 表达式 //查询的条件
-> GROUP BY (group by definition) //如何显示查询数据,按照指定字段分组
-> HAVING (expression) [(operator) (expression)]
-> ORDER BY (order by definition) //用什么样的顺序显示查询的数据,ASC(升序)、DESC(降序)
-> LIMIT [(offset),] (row count) //限制显示条数
实例:
简单查询
查询兴趣为basketball和football,成绩在60’以上的人
MariaDB [sky]> SELECT * FROM class WHERE interest in ('basketball','football') AND point > 60;
Alias别名:
MariaDB [sky]> SELECT interest AS I,point AS P FROM class as C WHERE C.point < 60;
Order By:
单一排序:
MariaDB [sky]> SELECT * FROM class ORDER BY point;
多列排序,现根据interest排序,再根据分数point排序
MariaDB [sky]> SELECT * FROM class ORDER BY interest,point;
Group By:
分组查询,同名即为一组,但是这样是不会显示详情的,可以使用GROUP_CONCAT(Field)显示相信信息。
MariaDB [sky]> SELECT name ,interest ,point FROM class GROUP BY interest;
MariaDB [sky]> SELECT GROUP_CONCAT(name) ,interest ,point FROM class GROUP BY interest;
多字段的分组查询,先分interest,相同的interest中再分point,适合查价格高的商品,比如首先分组用水果,之后再用价格分组。
MariaDB [sky]> select * from class group by interest,point;
Having过滤:
先group分组,分组之后筛选出同一个兴趣有两个人喜欢的
MariaDB [sky]> SELECT GROUP_CONCAT(name),interest FROM class GROUP BY interest HAVING COUNT(name) > 2;
Limit显示结果个数:
仅显示两条
MariaDB [sky]> SELECT * FROM class LIMIT 2;
从第四个开始往后显示两个,附带Offset偏移量
MariaDB [sky]> SELECT * FROM class LIMIT 4,2
连接查询
1、 内连接查询(Inner Query),内连接时,返回查询结果集合中的仅仅是符合查询条件和连接条件的行。
如下,查询class & school表中,id相等的行
MariaDB [sky]> SELECT class.id,school.name,class.name FROM class,school WHERE school.id=class.id;
这个语句同样可以使用 x INNER JOIN y on 的形式写,和用where写结果是一样的:
MariaDB [sky]> SELECT class.id,school.name,class.name FROM class JOIN school ON school.id=class.id;
INNER JOIN等于JOIN , 下面谈谈INNER JOIN和WHERE的区别:
where查询创建了两张表的笛卡尔积,所有可能的组合都会被创建出来。
如果有1000顾客和1000条销售记录,这个查询会先产生1000000(1000*1000)个结果,然后通过正确的 ID过滤出1000条记录。 这是一种低效利用数据库资源,数据库多做1000倍的工作。 在大型数据库中,笛卡尔连接是一个大问题,对两个大表的笛卡尔积会创建数10亿或万亿的记录。
INNER JOIN查询数据库就只产生等于ID的1000条目标结果。增加了查询效率。
外连接查询
外连接时,返回查询结果不仅仅只有查询条件匹配到的行。反向(left,right)是哪个表,就使用哪个表的全部内容。
X LEFT OUTER JOIN Y:左表(X)内容全部打印,并拼接右表
X RIGHT OUTER JOIN Y:右表(Y)内容全部打印,并拼接左表
左连,左为class
MariaDB [sky]> SELECT class.id,school.name,class.name FROM class LEFT OUTER JOIN school ON school.id=class.id;
子查询
子查询的功能也可以通过连接查询完成,但是子查询更容易阅读和理解。
可以看到,下面这个例子,class里面的id只要大于school中的任意一个ID就符合查询条件。ANY,SOME表示满足其中任一条件,就返回true。
```sql
MariaDB [sky]> select id from class where id > ANY(select id from school);
ALL表示满足所有条件才返回。
MariaDB [sky]> select id from class where id > ALL(select id from school);
+----+
| id |
+----+
| 8 |
| 9 |
+----+
EXISTS,如果EXISTS后面的语句有满足的条件,则返回为true,那么执行前面的select查询语句,前面的语句不能执行insert。
MariaDB [sky]> SELECT id FROM class WHERE id > EXISTS( SELECT id FROM school WHERE id < 4);
in:内层查询语句返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。
查询校级表中是否有人属于计算机学院,如果有,在院级表中查找其详细信息
MariaDB [sky]> SELECT * FROM class WHERE name IN (SELECT name FROM school WHERE location='computer');
+----+------+------------+-------+
| id | name | interest | point |
+----+------+------------+-------+
| 1 | c1 | basketball | 99 |
+----+------+------------+-------+
联合查询
- 当union遇到完全相同的行时,将会被合并,合并是比较耗时的工作,一般不让union合并,使用“union all”可以避免。
- union的子句中,不用写order by,合并后的结果集可以进行order by,子句order by没有意义。
- 用于替代逻辑比较复杂的where
- UNION:删除重复的记录
- UNION ALL:不删除重复的记录
MariaDB [sky]> select * from class where id < 4
-> UNION
-> select * from class where interest like 'girls';
等价于
MariaDB [sky]> SELECT * FROM class WHERE id<4 OR interest LIKE 'girls';
MariaDB [sky]> SELECT * FROM class WHERE id<4 || interest LIKE 'girls';