mysql 查询语句


语句顺序
select 选择的列
from 表
where 查询的条件
group by   分组属性  having 分组过滤的条件 通常与计算语句结合在一起
order by 排序属性
limit 起始记录位置,取记录的条数   
其中
select 选择的列
from 表
where 查询的条件
以上是基本的结构




最基础的查询test表所有选项
mysql> select * from test;
+------+-------+-----+----+
| id   | name  | age | sex|
+------+-------+-----+----|
| 0001 | 小明  |  14 | 男 |
| 0002 | 小红  |  12 | 女 |
| 0003 | 小红2 |  12 | 女 |
| 0004 | 小红3 |  12 | 女 |
| 0005 | 小黄  |  16 | 男 |
| 0006 | 小绿  |  15 | 男 |
+------+-------+-----+----+
另一种将表所有信息都打印出来(不推荐,多表关联时比较麻烦)
mysql> select * from test\G;
*************************** 1. row ***************************
   id: 0001
 name: 小明
  age: 14
  sex: 男
hobby: 宅
money: 2333.23
*************************** 2. row ***************************
.....
在select中*带表全部 也可以特定字段查询 要显示多个字段就用“,”链接
mysql> select name from student;
+--------+
| name   |
+--------+
| 小明   |
| 李雷   |
| 韩梅梅 |
+--------+
3 rows in set (0.00 sec)

mysql> select name,age from student;
+--------+------+
| name   | age  |
+--------+------+
| 小明   |   13 |
| 李雷   |   14 |
| 韩梅梅 |   16 |
+--------+------+
3 rows in set (0.00 sec)

可以给字段起个别名
mysql> select name as '名字' from student;
+--------+
| 名字   |
+--------+
| 小明   |
| 李雷   |
| 韩梅梅 |
+--------+

as可省, 要显示多个字段的时候依然是逗号链接
mysql> select name as 'mingzi',age as 'nianling' from student;
+--------+----------+
| mingzi | nianling |
+--------+----------+
| 小明   |       13 |
| 李雷   |       14 |
| 韩梅梅 |       16 |
+--------+----------+

合并两个字段concat************************************
mysql> select concat(name,'/',sex) from student;
+----------------------+
| concat(name,'/',sex) |
+----------------------+
| 小明/男              |
| 李雷/男              |
| 韩梅梅/女            |
| aboy/男              |
| 小明/男              |
| 李大锤/女            |
| MrJoker/男           |
| mingzdi/男           |
| 新人/男              |
| 又一个新人/女        |
| newboy/男            |
| oldboy/男            |
+----------------------+

逻辑判断符********************************
将小明的年龄修改成一岁
update student set age=1 where name='小明';
删除年龄小于10岁的同学
delete from student where age<10;
查找年龄大于10岁的同学
select * from student where age>10;
查找年龄在10到15之间的
select * from student where age>10 and age<15;
查找年龄在大于15或者年纪小于10的同学
select * from student where age<10 or age>15;

< > = or and 这些是逻辑判断符
其中如果执行的条件恒成立则表信息全部出来 这样比较危险
select * from student where age>10 or 1=1;


将查询结果和自身比较 成立返回1 不成立则0
mysql> select age,age>15 as '年龄大于十五的' from student;
+------+----------------+
| age  | 年龄大于十五的 |
+------+----------------+
|   14 |              0 |
|   14 |              0 |
|   16 |              1 |
+------+----------------+

去除重复条数distinct*****************************************
mysql> select distinct age,name from student;
注意 就拿上一条命令来说 如果age和name中有一个与之不同则都会显示  distinct 后的东西要完全一样才会去除重复的 注意一下两条命令结果的区别
mysql> select distinct id,age,name from student;
+----+------+--------+
| id | age  | name   |
+----+------+--------+
|  1 |   14 | 小明   |
|  2 |   14 | 李雷   |
|  3 |   16 | 韩梅梅 |
|  6 |   14 | 小明   |
+----+------+--------+
4 rows in set (0.00 sec)

mysql> select distinct age,name from student;
+------+--------+
| age  | name   |
+------+--------+
|   14 | 小明   |
|   14 | 李雷   |
|   16 | 韩梅梅 |
+------+--------+
3 rows in set (0.00 sec)

清空表数据
truncate student;
他和delete的区别就是用delete删除的虽然内容清空但id位置还保留 如果添加新的条数则按之前最大id顺着向下排   而truncate则是初始化表 保留表结构而且id也是重置从0开始排


查找set类型数据
先创建一个表
mysql> create table test5(
    -> hobby set('篮球','足球','乒乓球')
    -> );
mysql> select * from test5;
+------------------+
| hobby            |
+------------------+
| 篮球,足球,乒乓球 |
| 篮球,足球        |
| 篮球,乒乓球      |
| 足球             |
+------------------+
1.只找只有喜欢足球的
mysql> select * from test5 where hobby='足球';
+-------+
| hobby |
+-------+
| 足球  |
+-------+
2.找set类型数据中有‘足球’选项的条数
mysql> select * from test5 where find_in_set('足球',hobby);
+------------------+
| hobby            |
+------------------+
| 篮球,足球,乒乓球 |
| 篮球,足球        |
| 足球             |
+------------------+
3.模糊查询 查询字段中包含‘足球’这个名字的信息
mysql> select * from test5 where hobby like '%足球%';
+------------------+
| hobby            |
+------------------+
| 篮球,足球,乒乓球 |
| 篮球,足球        |
| 足球             |
+------------------+
4.使用符号& 这个是取的2的n次方 set选项中的第一个第二个第三个分别对应着&1 &2 &4 以此类推
mysql> select * from test5 where hobby &2;
+------------------+
| hobby            |
+------------------+
| 篮球,足球,乒乓球 |
| 篮球,足球        |
| 足球             |
+------------------+
推荐3方法 2方法代码长而且只适用于set类型



like查询 %代表一个或多个元素 _只代表一个元素
如找名字只有连个字的同学
mysql> select * from student where name like '__';
+----+------+------+------+
| id | name | sex  | age  |
+----+------+------+------+
|  1 | 小明 | 男   |   14 |
|  2 | 李雷 | 男   |   14 |
|  6 | 小明 | 男   |   14 |
+----+------+------+------+
找姓李的同学
mysql> select * from student where name like '李%';
+----+--------+------+------+
| id | name   | sex  | age  |
+----+--------+------+------+
|  2 | 李雷   | 男   |   14 |
|  7 | 李大锤 | NULL | NULL |
+----+--------+------+------+
找姓李且只有两个字的 where name like '李_'; 找名字中有“大”的同学 where name like '%大%';



查询null数据 要用 is null 语段而不是 '';
mysql> select * from student where sex is null;
+----+--------+------+------+
| id | name   | sex  | age  |
+----+--------+------+------+
|  7 | 李大锤 | NULL | NULL |
+----+--------+------+------+
mysql> select * from student where sex='';
Empty set (0.00 sec)

否定判断就 is not null;
mysql> select * from student where sex is not null;




if的使用方法  这有点像三元表达式   而且if在mysql中不常用,因为有更方便的php中的if
mysql> select age,if(age>15,'大','小') from student;
+------+----------------------+
| age  | if(age>15,'大','小') |
+------+----------------------+
|   14 | 小                   |
|   14 | 小                   |
|   16 | 大                   |
|   14 | 小                   |
| NULL | 小                   |
+------+----------------------+



order by 按照顺序排列 desc是降序排列 asc是升序排列 rand()是随机排列
mysql> select * from student order by age desc;
+----+--------+------+------+
| id | name   | sex  | age  |
+----+--------+------+------+
|  3 | 韩梅梅 | 女   |   16 |
|  1 | 小明   | 男   |   14 |
|  2 | 李雷   | 男   |   14 |
|  6 | 小明   | 男   |   14 |
|  7 | 李大锤 | NULL | NULL |
+----+--------+------+------+
5 rows in set (0.00 sec)
升序排列
mysql> select * from student order by age asc;
+----+--------+------+------+
| id | name   | sex  | age  |
+----+--------+------+------+
|  7 | 李大锤 | NULL | NULL |
|  1 | 小明   | 男   |   14 |
|  2 | 李雷   | 男   |   14 |
|  6 | 小明   | 男   |   14 |
|  3 | 韩梅梅 | 女   |   16 |
+----+--------+------+------+
随机排列
mysql> select * from student order by rand();
+----+--------+------+------+
| id | name   | sex  | age  |
+----+--------+------+------+
|  3 | 韩梅梅 | 女   |   16 |
|  7 | 李大锤 | NULL | NULL |
|  2 | 李雷   | 男   |   14 |
|  6 | 小明   | 男   |   14 |
|  1 | 小明   | 男   |   14 |
+----+--------+------+------+



limit 1 只截取一条  limit 2,2 从下标为2开始截取两条
mysql> select * from student limit 1;
+----+------+------+------+
| id | name | sex  | age  |
+----+------+------+------+
|  1 | 小明 | 男   |   14 |
+----+------+------+------+
mysql> select * from student limit 2,2;
+----+--------+------+------+
| id | name   | sex  | age  |
+----+--------+------+------+
|  3 | 韩梅梅 | 女   |   16 |
|  6 | 小明   | 男   |   14 |
+----+--------+------+------+



查找区间 between 相当于 >= and <=  包括区间在内的范围
mysql> select * from student student where age between 10 and 14;
+----+------+------+------+
| id | name | sex  | age  |
+----+------+------+------+
|  1 | 小明 | 男   |   14 |
|  2 | 李雷 | 男   |   14 |
|  6 | 小明 | 男   |   14 |
+----+------+------+------+



in 相当于 or 的用法 只要满足条件就行
mysql> select * from student where age in(16,42);
+----+---------+------+------+
| id | name    | sex  | age  |
+----+---------+------+------+
|  3 | 韩梅梅  | 女   |   16 |
|  8 | MrJoker | 男   |   42 |
+----+---------+------+------+



截取字符串
从左边截取student表中的名字 从右边截取一个用法 right(name,1)
mysql> select left(name,1) from student;
+--------------+
| left(name,1) |
+--------------+
| 小           |
| 李           |
| 韩           |
| 小           |
| 李           |
| M            |
+--------------+
从中间截取 mid(字段名,从第几个字节开始,截取几个字节)
mysql> select mid(name,2,1) from student;
+---------------+
| mid(name,2,1) |
+---------------+
| 明            |
| 雷            |
| 梅            |
| 明            |
| 大            |
| r             |
+---------------+


显示一个0到1之间的随机数
select rand();
显示1到10之间的随机数(先随机再截取第一个数后+1)
select left(rand()*10,1)+1;

随机选取一位同学
mysql> select * from student order by rand() limit 1;
+----+------+------+------+
| id | name | sex  | age  |
+----+------+------+------+
|  6 | 小明 | 男   |   14 |
+----+------+------+------+