ame | sub_name | score |
+----------+----------+-------+
| 张三 | 语文 | 80 |
| 张三 | 数学 | 85 |
| 张三 | 英语 | 88 |
| 李四 | 语文 | 83 |
| 李四 | 数学 | 84 |
| 李四 | 英语 | 87 |
| 王五 | 语文 | 81 |
| 王五 | 数学 | 85 |
| 王五 | 英语 | 85 |
| 赵六 | 语文 | 88 |
| 赵六 | 数学 | 88 |
| 赵六 | 英语 | 87 |
| 侯七 | 语文 | 84 |
| 侯七 | 数学 | 83 |
| 侯七 | 英语 | 82 |
+----------+----------+-------+
六、自连接查询
有时在信息查询时需要进行对自身连接(自连接)自连接是单边操作,所以我们需要为表定义别名。举例说明,下面是一个新的学生成绩表,在下表中我们要找到比张三成绩高的。
+--------+----------+-----------+
| stu_id | stu_name | stu_score |
+--------+----------+-----------+
| 1 | 张三 | 90 |
| 2 | 李四 | 85 |
| 3 | 王五 | 80 |
| 4 | 赵六 | 95 |
| 5 | 侯七 | 100 |
+--------+----------+-----------+
一般情况我们看到这张表我们第一时间用语句进行操作:
select * from Score where stu_score>90;
可想而知,这是有多么简单,假设你并不知道数据库中张三的成绩是90或者数据量相当庞大呢?作为一个数据库管理员,我们就要用别的方式迅速找出所需要的数据。
方式一:分步查找:最简单的一种方式,也是最容易想到的操作“
select stu_score from Score where stu_name='张三';//得出张三的成绩
select *from Score where stu_score>90;
与采用自连接的方式相比,这种方法需要对中间结果进行人工干预,显然不利于程序中的自动处理操作。
方式二:自连接方式:
select * from Score as a,Score as b where a.stu_name='张三' and a.stu_score<b.stu_score;
+--------+----------+-----------+--------+----------+-----------+
| stu_id | stu_name | stu_score | stu_id | stu_name | stu_score |
+--------+----------+-----------+--------+----------+-----------+
| 1 | 张三 | 90 | 4 | 赵六 | 95 |
| 1 | 张三 | 90 | 5 | 侯七 | 100 |
+--------+----------+-----------+--------+----------+-----------+
如果不想把张三的信息打印出来我们可以调整SQL语句为:
select b.* from Stu_score as a,Stu_score as b where a.stu_name='张三' and a.stu_score<b.stu_score;
+--------+----------+-----------+
| stu_id | stu_name | stu_score |
+--------+----------+-----------+
| 4 | 赵六 | 95 |
| 5 | 侯七 | 100 |
+--------+----------+-----------+
注意:别名 a,b虽然名称不同,但是同一个表,定义别名的目的是更方便在自身进行删选。
执行select通过(中间表)所得到的b.*,,就是最终结果。
七、子查询
子查询也是常用的一种方式,就是在select里嵌套select。还是上面的例子,我们用子查询实现如下:
select * from Stu_score where stu_score>(select stu_score from Stu_score where stu_name='张三');
+--------+----------+-----------+
| stu_id | stu_name | stu_score |
+--------+----------+-----------+
| 4 | 赵六 | 95 |
| 5 | 侯七 | 100 |
+--------+----------+-----------+
八、内置函数
1、字符串函数
1、查看字符的ascii码值ascii(str),str是空串时返回0
mysql> select ascii('a'); +------------+
| ascii('a') |
+------------+
| 97 |
+------------+
2、查看ascii码值对应的字符char(数字)
mysql> select char(97); +----------+
| char(97) |
+----------+
| a |
+----------+
3、拼接字符串concat(str1,str2...)
select concat(12,34,'ab'); +--------------------+
| concat(12,34,'ab') |
+--------------------+
| 1234ab |
+--------------------+
4、包含字符个数length(str)
mysql> select length('abc'); +---------------+
| length('abc') |
+---------------+
| 3 |
+---------------+
5、截取字符串
- left(str,len)返回字符串str的左端len个字符
- right(str,len)返回字符串str的右端len个字符
- substring(str,pos,len)返回字符串str的位置pos起len个字符
mysql> select substring('abc123',2,3); +-------------------------+
| substring('abc123',2,3) |
+-------------------------+
| bc1 |
+-------------------------+
6、去除空格
- ltrim(str)返回删除了左空格的字符串str
- rtrim(str)返回删除了右空格的字符串str
- trim([方向 remstr from str)返回从某侧删除remstr后的字符串str,方向词包括both、leading、trailing,表示两侧、左、右
mysql> select trim(' bar '); +------------------+
| trim(' bar ') |
+------------------+
| bar |
+--------