ORDER BY的语法结构
SELECT column1, column2, .. FROM table_ name ORDER BY column1, column2, ..
ASC|DESC;
我创建了一个mask库,mess表
mysql> select * from mess;
+----+------+-------+
| id | name | score |
+----+------+-------+
| 1 | zs | 90 |
| 2 | ls | 80 |
| 3 | ww | 70 |
| 4 | zl | 60 |
+----+------+-------+
4 rows in set (0.00 sec)
###单字段降序
mysql> select * from mess where score>=70 order by score desc;
+----+------+-------+
| id | name | score |
+----+------+-------+
| 1 | zs | 90 |
| 2 | ls | 80 |
| 3 | ww | 70 |
+----+------+-------+
3 rows in set (0.00 sec)
###单字段升序,默认即为升序ASC
mysql> select * from mess where score>=70 order by score;
+----+------+-------+
| id | name | score |
+----+------+-------+
| 3 | ww | 70 |
| 2 | ls | 80 |
| 1 | zs | 90 |
+----+------+-------+
3 rows in set (0.00 sec)
多字段排序,大概就是先按一个字段进行排序,如果有相同的属性的值再对此进行排序;
如下先按分数进行升序,然后在分数相同的记录中再按照id进行升序排序
mysql> select * from mess order by score ,id ;
+----+------+-------+
| id | name | score |
+----+------+-------+
| 4 | zl | 60 |
| 3 | ww | 70 |
| 5 | hb | 70 |
| 2 | ls | 80 |
| 1 | zs | 90 |
+----+------+-------+
5 rows in set (0.00 sec)
GROUP BY的语法结构
SELECT column name, aggregate_ function(column_ name) FROM table_ name
WHERE column_ name operator value GROUP BY column_ name;
group by大概就是将字段进行分组,可以再对组内的数据进行统计
如下,把score进行分组,分完后计算组内name的个数;将分数进行降序排序
mysql> select count(name),score from mess group by score order by score desc;
+-------------+-------+
| count(name) | score |
+-------------+-------+
| 1 | 90 |
| 1 | 80 |
| 2 | 70 |
| 1 | 60 |
+-------------+-------+
4 rows in set (0.00 sec)
##group by 不与聚合函数用,可以将相应重复的字段给过滤了
mysql> select * from mess group by score order by score desc;
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
| 1 | zs | 90 | 1 |
| 2 | ls | 80 | 1 |
| 3 | ww | 70 | 2 |
| 4 | zl | 60 | 2 |
+----+------+-------+-------+
上面的语句中有一个count()聚合函数,可以有如下类型
mysql> select avg(score) from mess;
+------------+
| avg(score) |
+------------+
| 74.0000 |
+------------+
1 row in set (0.00 sec)
mysql> select sum(score) from mess;
+------------+
| sum(score) |
+------------+
| 370 |
+------------+
1 row in set (0.00 sec)
mysql> select max(score) from mess;
+------------+
| max(score) |
+------------+
| 90 |
+------------+
1 row in set (0.00 sec)
LIMIT语法结构
offset位置偏移量,从0开始
SELECT column1, column2, .. FROM table_ name LIMIT [offset,] number;
number返回记录行的最大数目
limit限制结果条目
显示3条
mysql> select * from mess limit 3 ;
+----+------+-------+
| id | name | score |
+----+------+-------+
| 1 | zs | 90 |
| 2 | ls | 80 |
| 3 | ww | 70 |
+----+------+-------+
3 rows in set (0.00 sec)
不从第一条开始,从索引值后输出相应数量的条目,索引值从0开始
下面表示从索引值为1的记录开始,输出3条记录,也就是第2条到第5条记录
mysql> select * from mess limit 1,3;
+----+------+-------+
| id | name | score |
+----+------+-------+
| 2 | ls | 80 |
| 3 | ww | 70 |
| 4 | zl | 60 |
+----+------+-------+
3 rows in set (0.01 sec)
别名的语法结构
alias _name 列的别名
SELECT column_ name AS alias _name FROM table_ name;
alias name表的别名
SELECT column_ name(s) FROM table_ name AS alias name;
原字段或者表名在库内并不会被改变
字段别名
mysql> select count(*) from mess;
+----------+
| count(*) |
+----------+
| 5 |
+----------+
1 row in set (0.00 sec)
##别名
mysql> select count(*) as number from mess;
+--------+
| number |
+--------+
| 5 |
+--------+
1 row in set (0.00 sec)
表的别名
mysql> select a.id,a.name from mess as a;
+----+------+
| id | name |
+----+------+
| 1 | zs |
| 2 | ls |
| 3 | ww |
| 4 | zl |
| 5 | hb |
+----+------+
5 rows in set (0.00 sec)
拓展
改善下原来的mess表
##插入一列award
mysql> alter table mess add column award int(3);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from mess;
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
| 1 | zs | 90 | NULL |
| 2 | ls | 80 | NULL |
| 3 | ww | 70 | NULL |
| 4 | zl | 60 | NULL |
| 5 | hb | 70 | NULL |
+----+------+-------+-------+
5 rows in set (0.00 sec)
##更新分数大于75的记录中award字段为1
mysql> update mess set award=1 where score>75;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from mess;
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
| 1 | zs | 90 | 1 |
| 2 | ls | 80 | 1 |
| 3 | ww | 70 | NULL |
| 4 | zl | 60 | NULL |
| 5 | hb | 70 | NULL |
+----+------+-------+-------+
5 rows in set (0.00 sec)
##更新分数小于75的记录中award字段为2
mysql> update mess set award=2 where score<75;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> select * from mess;
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
| 1 | zs | 90 | 1 |
| 2 | ls | 80 | 1 |
| 3 | ww | 70 | 2 |
| 4 | zl | 60 | 2 |
| 5 | hb | 70 | 2 |
+----+------+-------+-------+
5 rows in set (0.00 sec)
mysql> create table awards (id int(3) primary key not null,awardname varchar(10) not null);
mysql> insert into awards values (1,'pen'),(2,'book');
mysql> select * from awards;
+----+-----------+
| id | awardname |
+----+-----------+
| 1 | pen |
| 2 | book |
+----+-----------+
##两表联合查询,mess表的award字段和awards表的id字段相关联
mysql> select * from mess inner join awards on mess.award=awards.id;
+----+------+-------+-------+----+-----------+
| id | name | score | award | id | awardname |
+----+------+-------+-------+----+-----------+
| 1 | zs | 90 | 1 | 1 | pen |
| 2 | ls | 80 | 1 | 1 | pen |
| 3 | ww | 70 | 2 | 2 | book |
| 4 | zl | 60 | 2 | 2 | book |
| 5 | hb | 70 | 2 | 2 | book |
+----+------+-------+-------+----+-----------+
5 rows in set (0.00 sec)
##只输出部分字段
mysql> select mess.name,awards.awardname from mess inner join awards on mess.award=awards.id;
+------+-----------+
| name | awardname |
+------+-----------+
| zs | pen |
| ls | pen |
| ww | book |
| zl | book |
| hb | book |
+------+-----------+
5 rows in set (0.00 sec)
###给表设置别名,as是可以省略的
mysql> select a.name,b.awardname from mess as a inner join awards b on a.award=b.id;
+------+-----------+
| name | awardname |
+------+-----------+
| zs | pen |
| ls | pen |
| ww | book |
| zl | book |
| hb | book |
+------+-----------+
5 rows in set (0.01 sec)
##给字段设置别名,
mysql> select a.name 姓名,b.awardname 奖励 from mess a inner join awards b on a.award=b.id;
+--------+--------+
| 姓名 | 奖励 |
+--------+--------+
| zs | pen |
| ls | pen |
| ww | book |
| zl | book |
| hb | book |
+--------+--------+
5 rows in set (0.00 sec)
通配符
常用通配符
mysql> select * from mess where name like '%s';
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
| 1 | zs | 90 | 1 |
| 2 | ls | 80 | 1 |
+----+------+-------+-------+
2 rows in set (0.00 sec)
mysql> select * from mess where name like 'z_';
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
| 1 | zs | 90 | 1 |
| 4 | zl | 60 | 2 |
+----+------+-------+-------+
2 rows in set (0.00 sec)
子查询
后面select语句结果是2,所以整个语句会输出mess表中award字段为2的记录
mysql> select * from mess where award in (select id from awards where awardname='book');
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
| 3 | ww | 70 | 2 |
| 4 | zl | 60 | 2 |
| 5 | hb | 70 | 2 |
+----+------+-------+-------+
3 rows in set (0.00 sec)
###注意使用的=号
mysql> select * from mess where award=(select id from awards where awardname='pen');
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
| 1 | zs | 90 | 1 |
| 2 | ls | 80 | 1 |
+----+------+-------+-------+
2 rows in set (0.00 sec)
##!=号
mysql> select * from mess where award!=(select id from awards where awardname='pen');
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
| 3 | ww | 70 | 2 |
| 4 | zl | 60 | 2 |
| 5 | hb | 70 | 2 |
+----+------+-------+-------+
3 rows in set (0.00 sec)
exists,判断后面语句结果是否存在,存在则正确执行前面的语句,否则不能正确执行;exists后一般更select语句,跟DML语句insert会报错
mysql> select count(*) as number from mess where exists (select id from awards where id=1);
+--------+
| number |
+--------+
| 5 |
+--------+
1 row in set (0.00 sec)
##awards表中没有id为3的记录
mysql> select count(*) as number from mess where exists (select id from awards where id=3);
+--------+
| number |
+--------+
| 0 |
+--------+
1 row in set (0.00 sec)
NULL值和空值的区别
mysql> create table a (id int(3) primary key not null,name varchar(10));
mysql> insert into a values (1,'a');
mysql> insert into a values (2,'');
mysql> insert into a (id) values(3);
mysql> select * from a;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | |
| 3 | NULL |
+----+------+
3 rows in set (0.00 sec)
####COUNT()计算时,NULL会忽略,空值会加入计算
mysql> select count(name) from a;
+-------------+
| count(name) |
+-------------+
| 2 |
+-------------+
1 row in set (0.01 sec)
mysql> select * from a where name is not null;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | |
+----+------+
2 rows in set (0.00 sec)
常用匹配模式
mysql> select * from awards
-> ;
+----+-----------+
| id | awardname |
+----+-----------+
| 1 | pen |
| 2 | book |
| 3 | fruit |
| 4 | car |
| 5 | phone |
+----+-----------+
##查找以name中以p开头的记录
mysql> select * from awards where awardname regexp '^p';
+----+-----------+
| id | awardname |
+----+-----------+
| 1 | pen |
| 5 | phone |
+----+-----------+
2 rows in set (0.00 sec)
###查找包含相应字符的记录,应满足字符连续,如搜索’pe’的时候phone就不会被查出来
mysql> select * from awards where awardname regexp 'on';
+----+-----------+
| id | awardname |
+----+-----------+
| 5 | phone |
+----+-----------+
1 row in set (0.00 sec)
mysql> select * from awards where awardname regexp 'pe';
+----+-----------+
| id | awardname |
+----+-----------+
| 1 | pen |
+----+-----------+
##‘*’的用法是表示‘*’前面的字符出现任意次,单独出现时区别于不在正则中的表示所有,会报错
mysql> select * from awards where awardname regexp '*';
ERROR 1139 (42000): Got error 'repetition-operator operand invalid' from regexp
mysql> select * from awards where awardname regexp '.*';
+----+-----------+
| id | awardname |
+----+-----------+
| 1 | pen |
| 2 | book |
| 3 | fruit |
| 4 | car |
| 5 | phone |
+----+-----------+
5 rows in set (0.00 sec)
算术运算符
MySQL支持的算术运算符
mysql> select 1+2,2-1,2*1,4/2,6%2;
+-----+-----+-----+--------+------+
| 1+2 | 2-1 | 2*1 | 4/2 | 6%2 |
+-----+-----+-----+--------+------+
| 3 | 1 | 2 | 2.0000 | 0 |
+-----+-----+-----+--------+------+
1 row in set (0.00 sec)
比较运算符
大于
=大于等于
mysql> select 2=3,2='2','e'='e',(1+3)=(2+2),'a'=NULL;
+-----+-------+---------+-------------+----------+
| 2=3 | 2='2' | 'e'='e' | (1+3)=(2+2) | 'a'=NULL |
+-----+-------+---------+-------------+----------+
| 0 | 1 | 1 | 1 | NULL |
+-----+-------+---------+-------------+----------+
1 row in set (0.00 sec)
从以上查询可以看出来:
mysql> select 'njit'<>'njiu',1<>1,3!=3,NULL<>NULL;
+----------------+------+------+------------+
| 'njit'<>'njiu' | 1<>1 | 3!=3 | NULL<>NULL |
+----------------+------+------+------------+
| 1 | 0 | 0 | NULL |
+----------------+------+------+------------+
1 row in set (0.00 sec)
需要注意的是不等于运算符不能用于判断 NULL
mysql> select 5>4,'a'>'b',2>=3,(2+3)>=(1+2),4.4<3,1<2,'x'<='y',5<=5.5,'u'>=NULL;
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
| 5>4 | 'a'>'b' | 2>=3 | (2+3)>=(1+2) | 4.4<3 | 1<2 | 'x'<='y' | 5<=5.5 | 'u'>=NULL |
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | NULL |
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
1 row in set (0.00 sec)
大于、大于等于、小于等于都是不用于判断NULL
关于数字、字符和 NULL 值的运用如下
IS NULL 和 IS NOT NULL 一个判断为空,另一个判断不为空,只是有无 NOT 这个关键字的区别,同时返回值不同。
mysql> select 2 IS NULL,'f' IS NOT NULL,NULL IS NULL;
+-----------+-----------------+--------------+
| 2 IS NULL | 'f' IS NOT NULL | NULL IS NULL |
+-----------+-----------------+--------------+
| 0 | 1 | 1 |
+-----------+-----------------+--------------+
1 row in set (0.01 sec)
BETWEEN AND 比较运算通常用于判断一个值是否落在某两个值之间,如果是比较字母的话,会转换成ASCII码进行比较
mysql> select 4 BETWEEN 2 AND 4,5 BETWEEN 5 AND 6,'B' BETWEEN 'A' AND 'C';
+-------------------+-------------------+-------------------------+
| 4 BETWEEN 2 AND 4 | 5 BETWEEN 5 AND 6 | 'B' BETWEEN 'A' AND 'C' |
+-------------------+-------------------+-------------------------+
| 1 | 1 | 1 |
+-------------------+-------------------+-------------------------+
1 row in set (0.00 sec)
LEAST:当有两个或者多个参数时,返回其中的最小值。如果其中一个值为 NULL,则返回结果就为 NULL。
GREATEST:当有两个或者多个参数时,返回其中的最大值。如果其中一个值为 NULL, 则返回结果就为 NULL。
mysql> select least(1,2,3),least('a','b','c'),greatest(1,2,3),greatest('a','b','c'),least(1,2,null);
+--------------+--------------------+-----------------+-----------------------+-----------------+
| least(1,2,3) | least('a','b','c') | greatest(1,2,3) | greatest('a','b','c') | least(1,2,null) |
+--------------+--------------------+-----------------+-----------------------+-----------------+
| 1 | a | 3 | c | NULL |
+--------------+--------------------+-----------------+-----------------------+-----------------+
1 row in set (0.00 sec)
IN 判断一个值是否在对应的列表中,如果是返回 1,否则返回 0。
NOT IN 判断一个值是否不在对应的列表中,如果不是返回 1,否则返回 0。
mysql> select 2 in (1,2,3,4),'c' not in ('a','b','c');
+----------------+--------------------------+
| 2 in (1,2,3,4) | 'c' not in ('a','b','c') |
+----------------+--------------------------+
| 1 | 0 |
+----------------+--------------------------+
1 row in set (0.00 sec)
LIKE 用来匹配字符串,如果匹配成功则返回 1,反之返回 0。LIKE 支持两种通配符:’%’ 用于匹配任意数目的字符,而’_’只能匹配一个字符。
mysql> select 'aug' like 'au_','njit' like 'n%','zn' not like 'z%';
+------------------+------------------+--------------------+
| 'aug' like 'au_' | 'njit' like 'n%' | 'zn' not like 'z%' |
+------------------+------------------+--------------------+
| 1 | 1 | 0 |
+------------------+------------------+--------------------+
1 row in set (0.00 sec)
逻辑运算符
常用的逻辑运算符
逻辑非,分为0值和非零值
mysql> select not 2,!3,not 0,!(4-4);
+-------+----+-------+--------+
| not 2 | !3 | not 0 | !(4-4) |
+-------+----+-------+--------+
| 0 | 0 | 1 | 1 |
+-------+----+-------+--------+
1 row in set (0.00 sec)
逻辑与,逻辑与通常用于判断两个值或多个值的有效性,如果所有值都是真返回 1,否则返回 0。
mysql> select 2 and 0,2 and 3,0 && null,1 && null;
+---------+---------+-----------+-----------+
| 2 and 0 | 2 and 3 | 0 && null | 1 && null |
+---------+---------+-----------+-----------+
| 0 | 1 | 0 | NULL |
+---------+---------+-----------+-----------+
1 row in set (0.00 sec)
逻辑或,逻辑或表示包含的操作数,任意一个为非零值并且不是 NULL 值时,返回 1,否则返回0。还是使用or比较好,使用||显示结果好像会有错误
mysql> select 2 or 0,2 or 3,0 or null,1 or null;
+--------+--------+-----------+-----------+
| 2 or 0 | 2 or 3 | 0 or null | 1 or null |
+--------+--------+-----------+-----------+
| 1 | 1 | NULL | 1 |
+--------+--------+-----------+-----------+
1 row in set (0.00 sec)
逻辑异或,两个非 NULL 值的操作数,如果两者都是 0 或者都是非 0,则返回 0;如果一个为 0, 另一个为非 0,则返回结果为 1;当任意一个值为 NULL 时,返回值为 NULL
mysql> select 1 xor 1,0 xor 1,0 xor null,1 xor null;
+---------+---------+------------+------------+
| 1 xor 1 | 0 xor 1 | 0 xor null | 1 xor null |
+---------+---------+------------+------------+
| 0 | 1 | NULL | NULL |
+---------+---------+------------+------------+
1 row in set (0.00 sec)
位运算符
:按位右移
将十进制数转换成二进制数然后进行相应的位运算,5 & 1大概就是5为,0101,1为0001,1为1110,把0101和1110进行与运算。
mysql> select 10 & 15,10 | 15,10 ^ 15,5 & ~1;
+---------+---------+---------+--------+
| 10 & 15 | 10 | 15 | 10 ^ 15 | 5 & ~1 |
+---------+---------+---------+--------+
| 10 | 15 | 5 | 4 |
+---------+---------+---------+--------+
1 row in set (0.01 sec)
左移右移运算符
1为0001向左移两位的话就成了0100结果为4,5为0101向左移一位的话1010结果为10,
5为0101,向右移两位的话就成了0001结果为1
mysql> select 1<<2;
+------+
| 1<<2 |
+------+
| 4 |
+------+
1 row in set (0.00 sec)
mysql> select 5<<1;
+------+
| 5<<1 |
+------+
| 10 |
+------+
1 row in set (0.00 sec)
mysql> select 5>>2;
+------+
| 5>>2 |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
运算符优先级
优先级 运算符 优先级 运算符
1 ! 8 |
2 ~ 9 =,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
3 ^ 10 BETWEEN,CASE,WHEN,THEN,ELSE
4 * , /(DIV), %(MOD) 11 NOT
5 +,- 12 &&,AND
6 >>,<< 13 ||,OR,XOR
7 & 14 :=
MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择 性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接。
内连接inter join ,会显示两张连接表的交集
mysql> select * from mess;
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
| 1 | zs | 90 | 1 |
| 2 | ls | 80 | 1 |
| 3 | ww | 70 | 2 |
| 4 | zl | 60 | 2 |
| 5 | hb | 70 | 2 |
| 6 | ad | 60 | 0 |
+----+------+-------+-------+
6 rows in set (0.00 sec)
mysql> select * from awards;
+----+-----------+
| id | awardname |
+----+-----------+
| 1 | pen |
| 2 | book |
| 3 | fruit |
| 4 | car |
| 5 | phone |
+----+-----------+
mysql> select * from mess inner join awards on mess.award=awards.id;
+----+------+-------+-------+----+-----------+
| id | name | score | award | id | awardname |
+----+------+-------+-------+----+-----------+
| 1 | zs | 90 | 1 | 1 | pen |
| 2 | ls | 80 | 1 | 1 | pen |
| 3 | ww | 70 | 2 | 2 | book |
| 4 | zl | 60 | 2 | 2 | book |
| 5 | hb | 70 | 2 | 2 | book |
+----+------+-------+-------+----+-----------+
5 rows in set (0.00 sec)
mysql> select mess.name,mess.score,mess.award from mess inner join awards on mess.award=awards.id;
+------+-------+-------+
| name | score | award |
+------+-------+-------+
| zs | 90 | 1 |
| ls | 80 | 1 |
| ww | 70 | 2 |
| zl | 60 | 2 |
| hb | 70 | 2 |
+------+-------+-------+
5 rows in set (0.00 sec)
外连接
左连接,将左边的表作为主表,右边作为匹配相应字段的表,主表将显示所有
mysql> select * from mess left join awards on mess.award=awards.id;
+----+------+-------+-------+------+-----------+
| id | name | score | award | id | awardname |
+----+------+-------+-------+------+-----------+
| 1 | zs | 90 | 1 | 1 | pen |
| 2 | ls | 80 | 1 | 1 | pen |
| 3 | ww | 70 | 2 | 2 | book |
| 4 | zl | 60 | 2 | 2 | book |
| 5 | hb | 70 | 2 | 2 | book |
| 6 | ad | 60 | 0 | NULL | NULL |
+----+------+-------+-------+------+-----------+
右连接,右边的表作为基础表,会显示所有表的内容,左边的表匹配上右边表的也会显示
mysql> select * from mess right join awards on mess.award=awards.id;
+------+------+-------+-------+----+-----------+
| id | name | score | award | id | awardname |
+------+------+-------+-------+----+-----------+
| 1 | zs | 90 | 1 | 1 | pen |
| 2 | ls | 80 | 1 | 1 | pen |
| 3 | ww | 70 | 2 | 2 | book |
| 4 | zl | 60 | 2 | 2 | book |
| 5 | hb | 70 | 2 | 2 | book |
| NULL | NULL | NULL | NULL | 3 | fruit |
| NULL | NULL | NULL | NULL | 4 | car |
| NULL | NULL | NULL | NULL | 5 | phone |
+------+------+-------+-------+----+-----------+
8 rows in set (0.00 sec)