数据库密码破解:
1、修改/etc/my.cnf配置文件
vim /etc/my.cnf
添加skip-grant-tables
2、重启mysql服务
3、mysql 登入修改密码
update user set authentication_string = password('654321') where User = 'root' and Host = 'localhost';
4、编辑/etc/my.cnf配置文,删除skip-grant-tables,然后重启启动mysql服务
5、使用新密码登入mysql测试
[root@localhost ~]# ls
anaconda-ks.cfg passwd
[root@localhost ~]# cat passwd
RIa<P+tD%6qV
[root@localhost ~]# mysql -uroot -p'RIa<P+tD%6qV' //登录报错显示需要libncurses.so.5
mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
mysql> select tb_course.course_name,tb_students_info.name from tb_course,tb_students_info where tb_course.id = tb_students_info.course_id and tb_course.course_name = 'mysql';
mysql> select s.name,c.course_name from tb_students_info s inner join tb_course c on s.course_id = c.id and c.course_name = 'Mysql';
+-------+-------------+
| name | course_name |
+-------+-------------+
| Green | MySQL |
| Jim | MySQL |
+-------+-------------+
2 rows in set (0.00 sec)
//统计人数
mysql> select count(s.name),c.course_name from tb_students_info s inner join tb_course c on s.course_id = c.id and c.course_name = 'Mysql';
+---------------+-------------+
| count(s.name) | course_name |
+---------------+-------------+
| 2 | MySQL |
+---------------+-------------+
1 row in set (0.00 sec)
复制代码
在tb_students_info表的基础上添加一条字段
mysql> select s.name,c.course_name from tb_students_info s inner join tb_course c on s.course_id = c.id and (c.course_name = 'Mysql' or c.course_name = 'Python');
+-------+-------------+
| name | course_name |
+-------+-------------+
| Green | MySQL |
| Jane | Python |
| Jim | MySQL |
+-------+-------------+
3 rows in set (0.00 sec)
//列出人数
mysql> select count(s.name),c.course_name from tb_students_info s inner join tb_course c on s.course_id = c.id and (c.course_name = 'Mysql' or c.course_name = 'Python') group by c.course_name;
+---------------+-------------+
| count(s.name) | course_name |
+---------------+-------------+
| 2 | MySQL |
| 1 | Python |
+---------------+-------------+
2 rows in set (0.00 sec)
//分别列出学习MySQL和python人的名字
mysql> select group_concat(s.name),c.course_name from tb_students_info s inner join tb_course c on s.course_id = c.id and (c.course_name = 'Mysql' or
在 MySQL 中,GROUP BY 关键字可以根据一个或多个字段对查询结果进行分组。
使用 GROUP BY 关键字的语法格式如下:
mysql> select s.name,c.course_name from tb_students_info s left outer join tb_course c on s.course_id = c.id;
+--------+-------------+
| name | course_name |
+--------+-------------+
| Dany | Java |
| Green | MySQL |
| Henry | Java |
| Jane | Python |
| Jim | MySQL |
| John | Go |
| Lily | Go |
| Susan | C++ |
| Thomas | C++ |
| Tom | C++ |
| LiMing | NULL |
+--------+-------------+
11 rows in set (0.00 sec)
复制代码
其中,"字段名"表示需要分组的字段名称,多个字段时用逗号隔开。
3.5.1 GROUP BY单独使用
单独使用 GROUP BY 关键字时,查询结果会只显示每个分组的第一条记录。 下面根据 tb_students_info 表中的 sex 字段进行查询
SELECT <字段名> FROM <表1> RIGHT OUTER JOIN <表2> <ON子句>;
复制代码
3.5.2 GROUP BY 与 GROUP_CONCAT()
GROUP BY 关键字可以和 GROUP_CONCAT() 函数一起使用。GROUP_CONCAT() 函数会把每个分组的字段值都显示出来。 下面根据 tb_students_info 表中的 sex 字段进行分组查询,使用 GROUP_CONCAT() 函数将每个分组的 name 字段的值都显示出来。
mysql> select s.name,c.course_name from tb_students_info s right outer join tb_course c on s.course_id = c.id;
+--------+-------------+
| name | course_name |
+--------+-------------+
| Dany | Java |
| Green | MySQL |
| Henry | Java |
| Jane | Python |
| Jim | MySQL |
| John | Go |
| Lily | Go |
| Susan | C++ |
| Thomas | C++ |
| Tom | C++ |
| NULL | HTML |
+--------+-------------+
11 rows in set (0.00 sec)
复制代码
上面实例在分组过程中,先按照 age 字段进行分组,当 age 字段值相等时,再把 age 字段值相等的记录按照 sex 字段进行分组。
多个字段分组查询时,会先按照第一个字段进行分组。如果第一个字段中有相同的值,MySQL 才会按照第二个字段进行分组。如果第一个字段中的数据都是唯一的,那么 MySQL 将不再对第二个字段进行分组。 下面根据 tb_students_info 表中的 age 字段进行分组查询
GROUP BY <字段名>
复制代码
下面根据 tb_students_info 表中的 age 和 sex 字段进行分组查询。
mysql> select name,sex from tb_students_info group by sex;
mysql> select c.course_name,max(s.age) from tb_students_info s join tb_course c on s.course_id = c.id and c.course_name = 'mysql';
+-------------+------------+
| course_name | max(s.age) |
+-------------+------------+
| MySQL | 24 |
+-------------+------------+
1 row in set (0.00 sec)
复制代码
3.6 子查询
子查询是 MySQL 中比较常用的查询方法,通过子查询可以实现多表查询。子查询指将一个查询语句嵌套在另一个查询语句中。子查询可以在 SELECT、UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套。在实际开发时,子查询经常出现在 WHERE 子句中。
子查询在 WHERE 中的语法格式如下:
mysql> select c.course_name,min(s.age) from tb_students_info s join tb_course c on s.course_id = c.id and c.course_name = 'mysql';
+-------------+------------+
| course_name | min(s.age) |
+-------------+------------+
| MySQL | 23 |
+-------------+------------+
1 row in set (0.00 sec)
复制代码
其中,操作符可以是比较运算符和 IN、NOT IN、EXISTS、NOT EXISTS 等关键字。
1)IN | NOT IN
当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回值正好相反。
2)EXISTS | NOT EXISTS
用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回的值正好相反。 使用子查询在 tb_students_info 表和 tb_course 表中查询学习 Java 课程的学生姓名
mysql> select sex,group_concat(name) from tb_students_info group by sex with rollup;
mysql> select c.course_name,group_concat(s.name) from tb_students_info s inner join tb_course c on s.course_id = c.id and (c.course_name = 'Mysql' or c.course_name = 'Python') group by c.course_name with rollup;