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 |
+----+------+------+------+