mysql 伪表查询语句_MySQL数据库之select查询语句

select查询语句

语法

select [选项] 列名 [from 表名] [where 条件] [group by 分组] [order by 排序][having 条件] [limit 限制]

select字段表达式

可以直接输出内容

MariaDB [sel]> select 'Sunny is a boy!';

+-----------------+

| Sunny is a boy! |

+-----------------+

| Sunny is a boy! |

+-----------------+

# `1 row in set (0.000 sec)`

输出表达式

MariaDB [sel]> select 10*27;

+-------+

| 10*27 |

+-------+

| 270 |

+-------+

# `1 row in set (0.000 sec)`

MariaDB [sel]> select name,chinese,math,chinese+math from grades;

+-------+---------+------+--------------+

| name | chinese | math | chinese+math |

+-------+---------+------+--------------+

| Sunny | 93 | 96 | 189 |

| Jerry | 97 | 91 | 188 |

| Marry | 95 | 94 | 189 |

| Tommy | 98 | 94 | 192 |

+-------+---------+------+--------------+

# `4 rows in set (0.000 sec)`

输出函数表达式

MariaDB [sel]> select rand();

+-------------------+

| rand() |

+-------------------+

| 0.294372641755615 |

+-------------------+

# `1 row in set (0.007 sec)`

通过as给字段取别名

as可以省略

MariaDB [sel]> select 'Sunny' as 'name';

+-------+

| name |

+-------+

| Sunny |

+-------+

# `1 row in set (0.000 sec)`

MariaDB [sel]> select name,chinese,math,chinese+math as '总分' from grades;

+-------+---------+------+------+

| name | chinese | math | 总分 |

+-------+---------+------+------+

| Sunny | 93 | 96 | 189 |

| Jerry | 97 | 91 | 188 |

| Marry | 95 | 94 | 189 |

| Tommy | 98 | 94 | 192 |

+-------+---------+------+------+

# `4 rows in set (0.007 sec)`

MariaDB [sel]> select name,chinese,math,chinese+math '总分' from grades;

+-------+---------+------+------+

| name | chinese | math | 总分 |

+-------+---------+------+------+

| Sunny | 93 | 96 | 189 |

| Jerry | 97 | 91 | 188 |

| Marry | 95 | 94 | 189 |

| Tommy | 98 | 94 | 192 |

+-------+---------+------+------+

# `4 rows in set (0.001 sec)`

from子句

from [表名]

from后面跟的是数据源

数据源可以有多个,返回笛卡尔积

-- 创建数据表

MariaDB [sel]> create table stu1(

-> name varchar(20)

-> )charset=gbk;

# `Query OK, 0 rows affected (0.026 sec)`

MariaDB [sel]> insert into stu1 values ('Sunny'),('Jerry');

# `Query OK, 2 rows affected (0.012 sec)`

# `Records: 2 Duplicates: 0 Warnings: 0`

MariaDB [sel]> create table stu2(

-> age int

-> )charset=gbk;

# `Query OK, 0 rows affected (0.023 sec)`

MariaDB [sel]> insert into stu2 values (20),(24);

# `Query OK, 2 rows affected (0.012 sec)`

# `Records: 2 Duplicates: 0 Warnings: 0`

-- from子句查询

MariaDB [sel]> select * from stu1;

+-------+

| name |

+-------+

| Sunny |

| Jerry |

+-------+

# `2 rows in set (0.000 sec)`

-- from返回笛卡尔积

MariaDB [sel]> select * from stu1,stu2;

+-------+------+

| name | age |

+-------+------+

| Sunny | 20 |

| Jerry | 20 |

| Sunny | 24 |

| Jerry | 24 |

+-------+------+

# `4 rows in set (0.000 sec)`

dual表

概念

dual表是一个伪表

在有些特定情况下,没有具体的表的参与

为了保证select语句的完整又必须要一个表名,这时候就使用伪表

MariaDB [sel]> select 10*27 as '结果' from dual;

+------+

| 结果 |

+------+

| 270 |

+------+

# `1 row in set (0.007 sec)`

where子句

概念

where后面跟的是条件,在数据源中进行筛选

返回条件为真记录

MySQL支持的运算符

比较运算符

> 大于

< 小于

>= 大于等于

<= 小于等于

= 等于

!= 不等于

逻辑运算符

and 与

or 或

not 非

其他

in | not in 字段的值在枚举范围内

between...and | not between...and 字段的值在数字范围内

is null | is not null 字段的值不为空

-- 比较运算判断

MariaDB [sel]> select * from grades where math=94;

+-------+---------+------+

| name | chinese | math |

+-------+---------+------+

| Marry | 95 | 94 |

| Tommy | 98 | 94 |

+-------+---------+------+

# `2 rows in set (0.007 sec)`

-- 输出所有数据

MariaDB [sel]> select * from grades where 1;

+-------+---------+------+

| name | chinese | math |

+-------+---------+------+

| Sunny | 93 | 96 |

| Jerry | 97 | 91 |

| Marry | 95 | 94 |

| Tommy | 98 | 94 |

+-------+---------+------+

# `4 rows in set (0.000 sec)`

-- 不输出数据

MariaDB [sel]> select * from grades where 0;

# `Empty set (0.000 sec)`

-- 逻辑运算判断

MariaDB [sel]> select * from grades where math=96 or math=91;

+-------+---------+------+

| name | chinese | math |

+-------+---------+------+

| Sunny | 93 | 96 |

| Jerry | 97 | 91 |

+-------+---------+------+

# `2 rows in set (0.001 sec)`

MariaDB [sel]> select * from grades where math in (91,96);

+-------+---------+------+

| name | chinese | math |

+-------+---------+------+

| Sunny | 93 | 96 |

| Jerry | 97 | 91 |

+-------+---------+------+

# `2 rows in set (0.000 sec)`

MariaDB [sel]> select * from grades where math not in (91,96);

+-------+---------+------+

| name | chinese | math |

+-------+---------+------+

| Marry | 95 | 94 |

| Tommy | 98 | 94 |

+-------+---------+------+

# `2 rows in set (0.000 sec)`

查找年龄在20~25之间

-- 方法一:

mysql> select * from stu where stuage>=20 and stuage<=25;

-- 方法二:

mysql> select * from stu where not(stuage<20 or stuage>25);

-- 方法三:between...and...

mysql> select * from stu where stuage between 20 and 25;

-- 年龄不在20~25之间

mysql> select * from stu where stuage not between 20 and 25;

查找缺考的学生

mysql> select * from stu where ch is null or math is null;

+--------+----------+--------+--------+---------+------------+------+------+

| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |

+--------+----------+--------+--------+---------+------------+------+------+

| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL |

| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | NULL | 74 |

+--------+----------+--------+--------+---------+------------+------+------+

查找没有缺考的学生

mysql> select * from stu where ch is not null and math is not null;

+--------+----------+--------+--------+---------+------------+------+------+

| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |

+--------+----------+--------+--------+---------+------------+------+------+

| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 |

| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 |

| s25305 | 诸葛丽丽 | 女 | 23 | 7 | 河南 | 72 | 56 |

| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | 86 | 92 |

| s25319 | 梅超风 | 女 | 23 | 5 | 河北 | 74 | 67 |

| s25320 | Tom | 男 | 24 | 8 | 北京 | 65 | 67 |

| s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 |

+--------+----------+--------+--------+---------+------------+------+------+

# `7 rows in set (0.00 sec)`

查找需要补考的学生

mysql> select * from stu where ch<60 or math<60 or ch is null or math is null;

+--------+----------+--------+--------+---------+------------+------+------+

| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |

+--------+----------+--------+--------+---------+------------+------+------+

| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL |

| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 |

| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | NULL | 74 |

| s25305 | 诸葛丽丽 | 女 | 23 | 7 | 河南 | 72 | 56 |

+--------+----------+--------+--------+---------+------------+------+------+

4 rows in set (0.00 sec)

查找学号是s25301,s25302,s25303的学生

mysql> select * from stu where stuno in ('s25301','s25302','s25303');

+--------+---------+--------+--------+---------+------------+------+------+

| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |

+--------+---------+--------+--------+---------+------------+------+------+

| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL |

| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 |

| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 |

+--------+---------+--------+--------+---------+------------+------+------+

# `3 rows in set (0.00 sec)`

查找年龄是18~20的学生

mysql> select * from stu where stuage between 18 and 20;

+--------+---------+--------+--------+---------+------------+------+------+

| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |

+--------+---------+--------+--------+---------+------------+------+------+

| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL |

+--------+---------+--------+--------+---------+------------+------+------+

1 row in set (0.00 sec)

group by [分组查询]

概念

将查询的结果分组,分组查询目的在于统计数据

如果是分组查询,查询字段是分组字段和聚合函数

查询字段是普通字段,只取第一个值

group_concat()将同一组的数据连接起来

-- 查询男生和女生的各自语文平均分

mysql> select stusex,avg(ch) '平均分' from stu group by stusex;

+--------+---------+

| stusex | 平均分 |

+--------+---------+

| 女 | 72.2500 |

| 男 | 77.0000 |

+--------+---------+

# `2 rows in set (0.00 sec)`

-- 查询男生和女生各自多少人

mysql> select stusex,count(*) 人数 from stu group by stusex;

+--------+------+

| stusex | 人数 |

+--------+------+

| 女 | 4 |

| 男 | 5 |

+--------+------+

# `2 rows in set (0.00 sec)`

-- 查询每个地区多少人

mysql> select stuaddress,count(*) from stu group by stuaddress;

+------------+----------+

| stuaddress | count(*) |

+------------+----------+

| 上海 | 1 |

| 北京 | 3 |

| 天津 | 2 |

| 河北 | 2 |

| 河南 | 1 |

+------------+----------+

# `5 rows in set (0.00 sec)`

-- 每个地区的数学平均分

mysql> select stuaddress,avg(math) from stu group by stuaddress;

+------------+-----------+

| stuaddress | avg(math) |

+------------+-----------+

| 上海 | 76.0000 |

| 北京 | 74.5000 |

| 天津 | 83.0000 |

| 河北 | 72.0000 |

| 河南 | 56.0000 |

+------------+-----------+

# `5 rows in set (0.00 sec)`

group_concat() 函数

将同一组的值连接起来显示

mysql> select group_concat(stuname),stusex,avg(math) from stu group by stusex;

+-------------------------------------+--------+-----------+

| group_concat(stuname) | stusex | avg(math) |

+-------------------------------------+--------+-----------+

| 李斯文,诸葛丽丽,梅超风,Tabm | 女 | 70.5000 |

| 张秋丽,李文才,欧阳俊雄,争青小子,Tom | 男 | 77.2500 |

+-------------------------------------+--------+-----------+

# `2 rows in set (0.00 sec)`

多列分组

mysql> select stuaddress,stusex,avg(math) from stu group by stuaddress,stusex;

+------------+--------+-----------+

| stuaddress | stusex | avg(math) |

+------------+--------+-----------+

| 上海 | 男 | 76.0000 |

| 北京 | 女 | 82.0000 |

| 北京 | 男 | 67.0000 |

| 天津 | 男 | 83.0000 |

| 河北 | 女 | 72.0000 |

| 河南 | 女 | 56.0000 |

+------------+--------+-----------+

# `6 rows in set (0.00 sec)`

order by [排序]

asc 升序 [默认]

desc 降序

MariaDB [sel]> select * from grades order by math desc;

+-------+---------+------+

| name | chinese | math |

+-------+---------+------+

| Sunny | 93 | 96 |

| Marry | 95 | 94 |

| Tommy | 98 | 94 |

| Jerry | 97 | 91 |

+-------+---------+------+

# `4 rows in set (0.001 sec)`

-- 按总分降序排列

MariaDB [sel]> select *,chinese+math from grades order by math+chinese desc;

+-------+---------+------+--------------+

| name | chinese | math | chinese+math |

+-------+---------+------+--------------+

| Tommy | 98 | 94 | 192 |

| Sunny | 93 | 96 | 189 |

| Marry | 95 | 94 | 189 |

| Jerry | 97 | 91 | 188 |

+-------+---------+------+--------------+

# `4 rows in set (0.001 sec)`

MariaDB [sel]> select *,chinese+math '总分' from grades order by math+chinese desc;

+-------+---------+------+------+

| name | chinese | math | 总分 |

+-------+---------+------+------+

| Tommy | 98 | 94 | 192 |

| Sunny | 93 | 96 | 189 |

| Marry | 95 | 94 | 189 |

| Jerry | 97 | 91 | 188 |

+-------+---------+------+------+

# `4 rows in set (0.000 sec)`

多列排序

前列为主,后列为辅

MariaDB [sel]> select * from grades order by math desc,chinese asc;

+-------+---------+------+

| name | chinese | math |

+-------+---------+------+

| Sunny | 93 | 96 |

| Marry | 95 | 94 |

| Tommy | 98 | 94 |

| Jerry | 97 | 91 |

+-------+---------+------+

# `4 rows in set (0.000 sec)`

having条件

概念

是在结果集上进行条件筛选

having和where的区别

where是对原始数据进行筛选

having是对记录集进行筛选

-- having与where相同

MariaDB [sel]> select * from grades where math=94;

+-------+---------+------+

| name | chinese | math |

+-------+---------+------+

| Marry | 95 | 94 |

| Tommy | 98 | 94 |

+-------+---------+------+

# `2 rows in set (0.000 sec)`

MariaDB [sel]> select * from grades having math=94;

+-------+---------+------+

| name | chinese | math |

+-------+---------+------+

| Marry | 95 | 94 |

| Tommy | 98 | 94 |

+-------+---------+------+

# 2 rows in set (0.000 sec)

-- having与where不同

MariaDB [sel]> select name from grades where math=94;

+-------+

| name |

+-------+

| Marry |

| Tommy |

+-------+

# `2 rows in set (0.000 sec)`

MariaDB [sel]> select name from grades having math=94;

# `ERROR 1054 (42S22): Unknown column 'math' in 'having clause'`

limit

语法

limit [起始位置],显示长度

-- 从第0个位置开始取,取3条记录

mysql> select * from stu limit 0,3;

-- 从第2个位置开始取,取3条记录

mysql> select * from stu limit 2,3;

+--------+----------+--------+--------+---------+------------+------+------+

| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |

+--------+----------+--------+--------+---------+------------+------+------+

| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 |

| s25304 | 欧阳俊雄 | 男 | 28 | 4 | 天津 | NULL | 74 |

| s25305 | 诸葛丽丽 | 女 | 23 | 7 | 河南 | 72 | 56 |

+--------+----------+--------+--------+---------+------------+------+------+

# `3 rows in set (0.00 sec)`

起始位置可以省略,默认是从0开始

mysql> select * from stu limit 3;

+--------+---------+--------+--------+---------+------------+------+------+

| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |

+--------+---------+--------+--------+---------+------------+------+------+

| s25301 | 张秋丽 | 男 | 18 | 1 | 北京 | 80 | NULL |

| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 |

| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 |

+--------+---------+--------+--------+---------+------------+------+------+

# `3 rows in set (0.00 sec)`

找出班级总分前三名

mysql> select *,ch+math total from stu order by (ch+math) desc limit 0,3;

+--------+----------+--------+--------+---------+------------+------+------+-------+

| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | total |

+--------+----------+--------+--------+---------+------------+------+------+-------+

| s25318 | 争青小子 | 男 | 26 | 6 | 天津 | 86 | 92 | 178 |

| s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 | 165 |

| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 | 153 |

+--------+----------+--------+--------+---------+------------+------+------+-------+

# `3 rows in set (0.00 sec)`

limit在update和delete语句中也是可以使用的

-- 前3名语文成绩加1分

mysql> update stu set ch=ch+1 order by ch+math desc limit 3;

# `Query OK, 3 rows affected (0.00 sec)`

# `Rows matched: 3 Changed: 3 Warnings: 0`

-- 前3名删除

mysql> delete from stu order by ch+math desc limit 3;

# `Query OK, 3 rows affected (0.00 sec)`

查询语句中的选项distinct

查询语句中的选项有两个

all 显示所有数据 [默认]

distinct 去除结果集中重复的数据

-- 显示列所有数据

MariaDB [sel]> select all math from grades;

+------+

| math |

+------+

| 96 |

| 91 |

| 94 |

| 94 |

+------+

# `4 rows in set (0.001 sec)`

-- 单列去除重复的项

MariaDB [sel]> select distinct math from grades;

+------+

| math |

+------+

| 96 |

| 91 |

| 94 |

+------+

# `3 rows in set (0.001 sec)`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值