排序
使用order by对表中数据进行排序
#先创建一张表
mysql> select * from game;
+------+----------+-------+----------+-------+
| id | name | sorce | addr | level |
+------+----------+-------+----------+-------+
| 1 | zhangsan | 49.00 | beijing | 10 |
| 2 | lisi | 51.00 | beijing | 13 |
| 3 | lisi | 37.00 | nanjing | 9 |
| 4 | wangwu | 43.00 | zhejiang | 12 |
| 5 | laoliu | 38.00 | shanghai | 16 |
+------+----------+-------+----------+-------+
5 rows in set (0.00 sec)
#排序默认升序排序,asc是升序排序,desc是降序排序
mysql> select * from game order by addr asc;
+------+----------+-------+----------+-------+
| id | name | sorce | addr | level |
+------+----------+-------+----------+-------+
| 1 | zhangsan | 49.00 | beijing | 10 |
| 2 | lisi | 51.00 | beijing | 13 |
| 3 | lisi | 37.00 | nanjing | 9 |
| 5 | laoliu | 38.00 | shanghai | 16 |
| 4 | wangwu | 43.00 | zhejiang | 12 |
+------+----------+-------+----------+-------+
5 rows in set (0.00 sec)
#语句也可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,ORDER BY后面跟多个字段时,字段之间使用英文逗号隔开,优先级是按先后顺序而定。
#但order by之后的第一个参数只有在出现相同值时,第二个字段才有意义。
#order by可以对多字段进行排序
#对addr升序排序,当addr相同时对level进行降序排序
mysql> select * from game order by addr,level desc;
+------+----------+-------+----------+-------+
| id | name | sorce | addr | level |
+------+----------+-------+----------+-------+
| 2 | lisi | 51.00 | beijing | 13 |
| 1 | zhangsan | 49.00 | beijing | 10 |
| 3 | lisi | 37.00 | nanjing | 9 |
| 5 | laoliu | 38.00 | shanghai | 16 |
| 4 | wangwu | 43.00 | zhejiang | 12 |
+------+----------+-------+----------+-------+
5 rows in set (0.00 sec)
#order by也可以跟where进行判断
mysql> select * from game where sorce >45 order by addr,level desc;
+------+----------+-------+---------+-------+
| id | name | sorce | addr | level |
+------+----------+-------+---------+-------+
| 2 | lisi | 51.00 | beijing | 13 |
| 1 | zhangsan | 49.00 | beijing | 10 |
+------+----------+-------+---------+-------+
2 rows in set (0.00 sec)
分组
使用group by进行分组,当分组的字段遇到有相同值时,只会保留第一个记录,所以通常跟count()对分组后的数据进行统计
mysql> select count(*),addr from game group by addr;
+----------+----------+
| count(*) | addr |
+----------+----------+
| 2 | beijing |
| 1 | nanjing |
| 1 | shanghai |
| 1 | zhejiang |
+----------+----------+
4 rows in set (0.01 sec)
#结合group by order by count进行分组排序并统计
mysql> select count(*),addr,sorce from game group by addr order by sorce desc;
+----------+----------+-------+
| count(*) | addr | sorce |
+----------+----------+-------+
| 2 | beijing | 49.00 |
| 1 | zhejiang | 43.00 |
| 1 | shanghai | 38.00 |
| 1 | nanjing | 37.00 |
+----------+----------+-------+
4 rows in set (0.00 sec)
子查询
子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤。
子语句可以与主语句所查询的表相同,也可以是不同表。子语句中的sql语句是为了,最后过滤出一个结果集,用于主语句的判断条件,子语句通过in和主语句连接。
子语句也可以使用where进行判断,使用order by,group by等。
#子语句使用where判断
mysql> select id,name from game where sorce in (select sorce from ti where sorce > 40);
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 4 | wangwu |
+------+----------+
3 rows in set (0.00 sec)
#子语句使用group by分组统计
mysql> select id,name from game where id in (select count(*) from ti group by addr);
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
+------+----------+
2 rows in set (0.00 sec)
视图
视图是数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射视图可以理解为镜花水月/倒影,动态保存结果集(数据)
简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性本质而言视图是一种select(结果集)
视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
#创建视图
mysql> create view v_game as select * from game where sorce>=38;
Query OK, 0 rows affected (0.00 sec)
#查看视图数据
mysql> select * from v_game;
+------+----------+-------+----------+-------+
| id | name | sorce | addr | level |
+------+----------+-------+----------+-------+
| 1 | zhangsan | 49.00 | beijing | 10 |
| 2 | lisi | 51.00 | beijing | 13 |
| 4 | wangwu | 43.00 | zhejiang | 12 |
| 5 | laoliu | 38.00 | shanghai | 16 |
+------+----------+-------+----------+-------+
4 rows in set (0.01 sec)
#对数据表查看
mysql> alter table game add constraint pk_id primary key(id);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc game;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(10) | YES | | NULL | |
| sorce | decimal(5,2) | YES | | NULL | |
| addr | varchar(20) | YES | | NULL | |
| level | int(5) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> desc v_game;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(10) | YES | | NULL | |
| sorce | decimal(5,2) | YES | | NULL | |
| addr | varchar(20) | YES | | NULL | |
| level | int(5) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
#可以发现视图隐藏了原表的主键等属性,增强了数据表的安全性
#用多张表创建组合视图,视图的字段的内容和select后面选取的字段的顺序一一对应
mysql> create view v_zuhe(id,sorce,addr,passwd) as select game.id,game.sorce,game.addr,name.passwd from game,name where game.id=name.id;
mysql> select * from v_zuhe;
+----+-------+---------+--------+
| id | sorce | addr | passwd |
+----+-------+---------+--------+
| 1 | 49.00 | beijing | abc123 |
+----+-------+---------+--------+
1 row in set (0.01 sec)
#对应的顺序出错任然能创建视图,且对应字段的数据类型会变更。
mysql> create view v_zu(id,sorce,addr,passwd) as select game.addr,egame.sorce,name.passwd,game.addr from game,name where game.id=name.id;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from v_zu;
+---------+-------+--------+---------+
| id | sorce | addr | passwd |
+---------+-------+--------+---------+
| beijing | 49.00 | abc123 | beijing |
+---------+-------+--------+---------+
1 row in set (0.01 sec)
mysql> desc v_zu;
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id | varchar(20) | YES | | NULL | |
| sorce | decimal(5,2) | YES | | NULL | |
| addr | varchar(11) | YES | | NULL | |
| passwd | varchar(20) | YES | | NULL | |
+--------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
视图与表的区别:
视图是己经编译好的sql语句。而表不是。
视图没有实际的物理记录。而表有。
表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改。
视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQn语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表
视图的建立和删除只影响视图本身,不影响对应的基本表。
正则
在mysql中也可以使用正则。
^ 匹配开头的字符
$ 匹配末尾的字符
. 匹配单个字符
* 匹配0或多个在它前面的字符
+ 匹配前面的字符1到无穷次
' ' 匹配' '中的字符串
a|b 匹配a或b
[...] 匹配[]中的任意一个字符
[^...] 匹配不在[]中的字符
{n} 匹配前面的字符n次
{n,m} 匹配前面的字符n-m次
? 匹配前面的字符0-1次
正则在mysql数据库中需要配合where和regexp使用
#匹配l开头的
mysql> select * from game where name regexp '^l';
+----+--------+-------+----------+-------+
| id | name | sorce | addr | level |
+----+--------+-------+----------+-------+
| 2 | lisi | 51.00 | beijing | 13 |
| 3 | lisi | 37.00 | nanjing | 9 |
| 5 | laoliu | 38.00 | shanghai | 16 |
+----+--------+-------+----------+-------+
3 rows in set (0.00 sec)
#匹配name字段中有n或u的
mysql> select * from game where name regexp 'n|u';
+----+----------+-------+----------+-------+
| id | name | sorce | addr | level |
+----+----------+-------+----------+-------+
| 1 | zhangsan | 49.00 | 233 | 10 |
| 4 | wangwu | 43.00 | zhejiang | 12 |
| 5 | laoliu | 38.00 | shanghai | 16 |
+----+----------+-------+----------+-------+
3 rows in set (0.00 sec)
mysql> select * from game where name regexp '[nu]';
+----+----------+-------+----------+-------+
| id | name | sorce | addr | level |
+----+----------+-------+----------+-------+
| 1 | zhangsan | 49.00 | 233 | 10 |
| 4 | wangwu | 43.00 | zhejiang | 12 |
| 5 | laoliu | 38.00 | shanghai | 16 |
+----+----------+-------+----------+-------+
3 rows in set (0.00 sec)
匹配没有laoiu字符的
mysql> select * from game where name regexp '[^laoiu]';
+----+----------+-------+----------+-------+
| id | name | sorce | addr | level |
+----+----------+-------+----------+-------+
| 1 | zhangsan | 49.00 | 233 | 10 |
| 2 | lisi | 51.00 | beijing | 13 |
| 3 | lisi | 37.00 | nanjing | 9 |
| 4 | wangwu | 43.00 | zhejiang | 12 |
+----+----------+-------+----------+-------+
4 rows in set (0.00 sec)