MySQL高级SQL语句
- 1. MySQL的晋级查询
- 2.数据库函数
-
- 2.1 数学函数
-
- 2.1.1 abs(x) 返回 x 的绝对值
- 2.1.2 rand() 返回 0 到 1 的随机数
- 2.1.3 mod(x,y) 返回 x 除以 y 以后的余数
- 2.1.4 power(x,y) 返回 x 的 y 次方
- 2.1.5 round(x) 返回离 x 最近的整数
- 2.1.6 round(x,y) 保留x 的y 位小数四舍五入后的值
- 2.1.7 sqrt(x) 返回 x 的平方根
- 2.1.8 truncate(x,y) 返回数字 x 截断为 y 位小数的值
- 2.1.9 ceil(x) 返回大于或等于 x 的最小整数
- 2.1.10 floor(x) 返回小于或等于 x 的最大整数
- 2.1.11greatest(x1,x2...) 返回集合中最大的值
- 2.1.12 least(x1,x2...) 返回集合中最小的值
- 2.2 聚合函数
- 2.3 字符串函数
-
- 2.3.1 length(x) 返回字符串 x 的长度
- 2.3.2 trim() 返回去除指定格式的值
- 2.3.3 concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
- 2.3.4 upper(x) 将字符串 x 的所有字母变成大写字母
- 2.3.5 lower(x) 将字符串 x 的所有字母变成小写字母
- 2.3.6 left(x,y) 返回字符串 x 的前 y 个字符
- 2.3.7 right(x,y) 返回字符串 x 的后 y 个字符
- 2.3.8 repeat(x,y) 将字符串 x 重复 y 次
- 2.3.9 space(x) 返回 x 个空格
- 2.3.10 replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
- 2.3.11 strcmp(x,y) 比较 x 和 y,返回的值可以为-1,0,1
- 2.3.12 substring(x,y,z) 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
- 2.3.13 reverse(x) 将字符串 x 反转
- 2.4 日期时间函数
- 3. 存储过程
1. MySQL的晋级查询
1.1 按关键字排序
- 使用ORDER BY语句来实现排序
- 排序可针对一个或多个字段
- ASC:升序,默认排序方式
- DESC:降序
- ORDER BY的语句结构
###语法结构###
SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC;
1.2 用法
1.2.1 升序
mysql> select * from info order by score;
+----+----------+-------+-------+------+
| id | name | score | hobby | addr |
+----+----------+-------+-------+------+
| 4 | kb | 8.00 | 2 | NULL |
| 3 | ks | 25.00 | 1 | NULL |
| 5 | ooxoo | 55.00 | 3 | NULL |
| 6 | ooxooo | 66.00 | 3 | NULL |
| 1 | zhangsan | 77.00 | 1 | NULL |
| 2 | lisi | 88.00 | 2 | NULL |
+----+----------+-------+-------+------+
6 rows in set (0.00 sec)
1.2.2 降序
mysql> select * from info order by score;
+----+----------+-------+-------+------+
| id | name | score | hobby | addr |
+----+----------+-------+-------+------+
| 4 | kb | 8.00 | 2 | NULL |
| 3 | ks | 25.00 | 1 | NULL |
| 5 | ooxoo | 55.00 | 3 | NULL |
| 6 | ooxooo | 66.00 | 3 | NULL |
| 1 | zhangsan | 77.00 | 1 | NULL |
| 2 | lisi | 88.00 | 2 | NULL |
+----+----------+-------+-------+------+
6 rows in set (0.00 sec)
1.2.3 多字段降序排序
mysql> select id,name from info where 3=3 order by score desc,hobby desc;
+----+----------+
| id | name |
+----+----------+
| 2 | lisi |
| 1 | zhangsan |
| 6 | ooxooo |
| 5 | ooxoo |
| 3 | ks |
| 4 | kb |
+----+----------+
6 rows in set (0.00 sec)
1.2.4 对结果进行分组
- GROUP BY语句来实现分组
- 结合聚合函数一起使用
- 以按一个或多个字段对结果进行分组
- GRO BY的语法结构
###语法结构###
SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator valueGROUP BY column_name;
分组
mysql> select count(name),hobby nfo group by hobby; ###统计hobby中相同的输出name的个数和hobby
+-------------+-------+
| count(name) | score |
+-------------+-------+
| 2 | 77.00 |
| 2 | 88.00 |
| 2 | 55.00 |
+-------------+-------+
3 rows in set (0.00 sec)
GROUP BY结合ORDER BY
mysql> select count(name),hobby from info group by hobby order by count(name);
+-------------+-------+
| count(name) | hobby |
+-------------+-------+
| 2 | 2 |
| 2 | 3 |
| 2 | 1 |
+-------------+-------+
3 rows in set (0.00 sec)
1.2.5 限制结果条目
- 回SELECT查询结果的第一行或前几行
- LIMIT语句限制条目
- IMIT语法结构
###语法结构###
SELECT column1, column2, ... FROM table_name LIMIT [offset,] number ###返回记录行的最大数目
[offset,] :位置偏移量,从0开始算
查看前三行
mysql> select * from info limit 3;
+----+----------+-------+-------+------+
| id | name | score | hobby | addr |
+----+----------+-------+-------+------+
| 1 | zhangsan | 77.00 | 1 | NULL |
| 2 | lisi | 88.00 | 2 | NULL |
| 3 | ks | 25.00 | 1 | NULL |
+----+----------+-------+-------+------+
3 rows in set (0.00 sec)
查看2-4行
mysql> select * from info limit 1,3;
+----+------+-------+-------+------+
| id | name | score | hobby | addr |
+----+------+-------+-------+------+
| 2 | lisi | 88.00 | 2 | NULL |
| 3 | ks | 25.00 | 1 | NULL |
| 4 | kb | 8.00 | 2 | NULL |
+----+------+-------+-------+------+
3 rows in set (0.00 sec)
1.2.6 设置别名
1.使用AS语句设置别名,关键字AS可省略
2. 设置别名时,保证不能与库中其他表或字段名称冲突
3. 别名的语法结构
###语法结构###
SELECT column_name AS alias_name FROM table_name;
###给name和score设置别名### 方法一
mysql> select name as 姓名,score as 成绩 from info;
+----------+--------+
| 姓名 | 成绩 |
+----------+--------+
| zhangsan | 77.00 |
| lisi | 88.00 |
| ks | 25.00 |
| kb | 8.00 |
| ooxoo | 55.00 |
| ooxooo | 66.00 |
+----------+--------+
6 rows in set (0.01 sec)
###给name和score设置别名### 方法二
mysql> select name 姓名,score 成绩 from info;
+----------+--------+
| 姓名 | 成绩 |
+----------+--------+
| zhangsan | 77.00 |
| lisi | 88.00 |
| ks | 25.00 |
| kb | 8.00 |
| ooxoo | 55.00 |
| ooxooo | 66.00 |
+----------+--------+
6 rows in set (0.00 sec)
给表设置别名i
mysql> select i.name 姓名,i.score 成绩 from info as i;
+----------+--------+
| 姓名 | 成绩 |
+----------+--------+
| zhangsan | 77.00 |
| lisi | 88.00 |
| ks | 25.00 |
| kb | 8.00 |
| ooxoo | 55.00 |
| ooxooo | 66.00 |
+----------+--------+
6 rows in set (0.00 sec)
创建新表,将info表中的分数大于等于80的数据放在新表上
mysql> create table tmp as select * from info where score >= 80;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from tmp;
+----+------+-------+-------+------+
| id | name | score | hobby | addr |
+----+------+-------+-------+------+
| 2 | lisi | 88.00 | 2 | NULL |
+----+------+-------+-------+------+
1 row in set (0.00 sec)
注意点:这边只复制数据和表结构,但是表的约束并不会复制过去
1.3 通配符
- 用于替换字符串的部分字符
- 通常配合LIKE一起使用,并协同WHERE完成查询
- 常用的通配符
- %表示零个、一个或多个
- _表示单个字符
mysql> select * from info where name like 'l% ; ##匹配l0次或者多次
+----+------+-------+-------+------+
| id | name | score | hobby | addr |
+----+------+-------+-------+------+
| 2 | lisi | 88.00 | 2 | NULL |
+----+------+-------+-------+------+
1 row in set (0.00 sec)
mysql> select * from info where name like '_i_i'; ###_ 任意一个字符
+----+------+-------+-------+------+
| id | name | score | hobby | addr |
+----+------+-------+-------+------+
| 2 | lisi | 88.00 | 2 | NULL |
+----+------+-------+-------+------+
1 row in set (0.00 sec)
1.4 子查询
- 也称作内查询或者嵌套查询
- 先于主查询被执行,其结果将作为外层主查询的条件
- 在增删改查中都可以使用子查询
- 支持多层嵌套
- IN语句是用来判断某个值是否在给定的结果集中
准备工作
mysql> create table num (id int (4)); ##创建表
Query OK, 0 rows affected (0.01 sec)
mysql> insert into num values (1),(3),(5),(7); #插入数据
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from num; ##查看表内容
+------+
| id |
+------+
| 1 |
| 3 |
| 5 |
| 7 |
+------+
4 rows in set (0.00 sec)
###然后根据刚刚的info表和num表进行多表相连,按照num表的1、3、5、7显示出info表的1、3、5、7行数据###
###后面输出的结果赋予了前面的值###
mysql> select * from info where id in(select id from num); ##括号里面的id对应外面条件id,对应上的输出结果
+----+----------+-------+-------+------+
| id | name | score | hobby | addr |
+----+----------+-------+-------+------+
| 1 | zhangsan | 77.00 | 1 | NULL |
| 3 | ks | 25.00 | 1 | NULL |
| 5 | ooxoo | 55.00 | 3 | NULL |
+----+----------+-------+-------+------+
3 rows in set (0.00 sec)
多层嵌套,先内括号一步步到外括号
mysql> select * from info where id in(select id from num where name in (select name from num));
+----+----------+-------+-------+------+
| id | name | score | hobby | addr |
+----+----------+-------+-------+------+
| 1 | zhangsan | 77.00 | 1 | NULL |
| 3 | ks | 25.00 | 1 | NULL |
| 5 | ooxoo | 55.00 | 3 | NULL |
+----+----------+-------+-------+------+
3 rows in set (0.00 sec)
注意点:外层的条件要和内存的类型是相同的
1.5 视图
数据库中的虚拟表,这张虚拟表中不包含任何数据,只是做了数据映射
mysql> create view v_score as select * from info where score >=80; ##创建视图,并且将info表中大于80分的移进视图表中
Query OK, 0 rows affected (0.00 sec)
mysql> select * from v_score;
+----+------+-------+-------+------+
| id | name | score | hobby | addr |
+----+------+-------+-------+------+
| 2 | lisi | 88.00 | 2 | NULL |
+----+------+-------+-------+------+
1 row in set (0.00 sec)
mysql> show table status; ###查看视图表信息
注意点:视图表是一个虚拟的动态的,当info表中有同学的分数变成80以上时,会自动更新数据
拓展
mysql> select id from (select id,name from info) ;
ERROR 1248 (42000): Every derived table must have its own alias ##错误1248(42000):每个派生表必须有自己的别名
解决方法,设置别名
```bash
mysql