mysql简单查询操作

前面说了那么多,现在终于到了我们广大程序员最关心的”查询”操作了。

查询操作

-- 语法
select [select选项] 字段列表 [as] 字段别名 /* from 数据源 [where条件语句] [group by 子句] [having 子句] [order by 子句] [limit 子句];

select选项:

select 对查询出来的结果的处理方式

All:默认的,保留所有的结果

Distinct:将查出来的结果,去掉重复项(所有字段都相同)

字段别名

-- 语法
字段 [as] 别名
select studentid as "学生id",number as "学号", name "姓名" from my_student;

where子句

where子句:用来判断筛选数据。

where子句返回结果: 0或者1, 其中0代表false,1代表true。

  • 判断条件:

    比较运算符: >,<,>=,<=,<>,= ,like ,between and ,in ,not in

    逻辑运算符: &&(and) ,||(or) ,!(not)

where原理:从磁盘取出一条记录,开始进行where判断,判断的结果如果成立保存到内存,如果失败直接放弃。

-- 下面为了演示where语句,我先为my_student表格增加两个字段

-- 增加age和height字段
alter table my_student add age tinyint unsigned;
alter table my_student add height tinyint unsigned;

-- 增加值:
update my_student set age=floor(rand() * 20 + 20),height=floor(rand() * 20 + 170);

  • 查找学生id为1或者3的学生
select * from my_student where studentid in(1,3);

-- 或者
select * from my_student where studentid = 1 || studentid = 3;

  • 查找学生身高在180到190的学生
select * from my_student where height > 180 and height < 190;

-- 或者
select * from my_student where height between 180 and 190;

group by子句

group by:根据某个字段进行分组(相同的放到1组,不同的放到不同组)

-- 基本语法
group by 字段名

分组的意义:为了统计数据(按分组字段进行数据统计)

sql提供了一系列统计函数:

count() :统计分组后的记录数,每一组有多少记录
max() :统计每组中最大的值
min() : 统计最小值
Avg() : 统计平均值
Sum() : 统计和
-- 为了演示group by查询,这里我为my_student表,增加了gender字段alter table my_student add gender enum(‘boy‘,‘girl‘);

-- 按照性别分组统计:身高高矮,平均年龄和年龄总和
select gender,count(*),max(height),min(height),avg(age),sum(age) from my_student group by gender; 

需要注意的是,以上使用到的count函数:里面可以使用两种参数:”*”表示统计记录,”字段名”表示统计对应的字段(NULL不统计)

select gender,count(*),count(age),max(height),min(height),avg(age),sum(age) from my_student group by gender;

  • 多字段分组:先根据一个字段进行分组,然后对分组后的结果,再次按照其他结果进行分组。

-- 多字段分组:先按照班级分组,在按照性别分组
select c_id,gender,count(*) from my_student group by c_id,gender;   

  • group_concat(字段)

    group_concat(字段):该函数可以对分组的结果中某个字段进行字符串拼接

-- 使用group_contact() 函数
select c_id,gender,count(*),group_concat(name) from my_student group by c_id,gender;    

having 子句

having子句:进行条件判断的。

having与where的区别:where是针对磁盘数据进行判断,进入到内存之后,会进行分组操作,分组结果就需要having来处理。另外,having可以使用别名,而where不可以,这是因为where是从磁盘中读取数据的,此时只能使用字段名,别名是在字段进入内存后才会产生的。

-- 查询所有班级人数>2的学生人数
select c_id,count(*) from my_student group by c_id having count(*) >=2;

-- 上面的sql语句中多次使用了count(*)函数,我们可以对count(*)重新命名,做如下优化:
select c_id,count(*) as total from my_student group by c_id having total >=2;

order by子句

order by:根据某个字段进行升序或者降序排序

-- 语法:
order by 字段名 [asc |descc]

select * from my_student order by c_id;

 -- 先按照班级升序,在按照年龄降序
  select * from my_student order by c_id,age desc;

limit子句

limit:limit可以用来限制查询的结果数量

limit有两种使用方式:

  • 用来限制数据量: limit 数据量
  • 限制其实位置,限制数量: limit 其实位置,长度
-- 查询my_student表中的前两条记录
select * from my_student limit 2;

-- 从第2条记录开始,查询两条数据
select * from my_student limit 2, 2;

连接查询

连接查询:将多张表,进行记录的连接。连接查询分为以下四类:内连接,外连接,自然连接,交叉连接

-- 使用语法
左表 join 右表
-- 查询出所有的学生,并且显示学生所在的班级信息

交叉连接

交叉连接:从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配,匹配一定保留(无条件匹配)

-- 交叉连接语法: 左表 cross join 右表 === from 左表,右表
select * from my_student cross join my_class;
select * from my_student,my_class;

内连接

内连接:inner join,从左表中取出每一条记录,去右表中与所有的记录进行匹配,匹配必须是某个条件在左表中与右表中相同,最终才会保留结果。

-- 内连接基本语法:左表 inner join 右表 on 左表.字段 = 右表.字段
 select * from my_student inner join my_class on my_student.c_id = my_class.c_id;

另外,可以使用字段和表的别名来简化sql语句

-- 字段别名和表别名
select s.* ,c.c_name,c.c_room from my_student as s inner join my_class as c on s.c_id = c.c_id;

外连接

外连接:以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接,不管是否匹配,最终都会保留,能匹配,则正确保留,否则其他表的字段都值为空null。

外连接分为两种: 是以某张表为主

left join:左外连接,以左表为主表

right join: 右连接

-- 外连接基本语法:
坐标 left/right join 右表 on 左表.字段 = 右表.字段

-- 左连接
select s.*,c.c_name,c.c_room from my_student as s left join my_class as c on s.c_id = c.c_id; 

自然连接

自然连接:自动匹配连接条件:系统自动以字段名字作为匹配模式(同名字段作为条件,多个同名字段都作为条件)

-- 自然内连接:
左表 natural join 右表
select * from my_student natural join my_class;

时间: 2024-10-12 21:09:02

mysql简单查询操作的相关文章

MySQL简单查询详解

MySQL的查询操作 单表查询:简单查询 多表查询:连接查询 联合查询 布尔条件表达式操作符    = 等值比较    <=>:跟空值比较不会产生额外信息的等值比较    <>:不等值    <:     <=:    >    >=    IS NULL    IS NOT NULL        LIKE:        支持的通配符: %(任意长度的任意字符),_(任意单个字符)    RLIKE,REGEXP: 支持使用正则表达式    IN: 判断

MySQL简单查询和单表查询

MySQL记录操作 概览 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 使用SELECT查询数据以及. 插入数据insert 1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3-字段n) VALUES(值1,值2,值3-值n); 语法二: INSERT INTO 表名 VALUES (值1,值2,值

MySQL的查询操作

1. 基础的查询操作 #简单查询 select * from emp; //查询emp中所有的记录 select empno, job,ename from emp; //查询emp表中的某些字段 select ename as 名字 from emp; //使用字段别名 去重 distinct select distinct deotno from emp; //去除重复的行(针对字段而言) 排序 order by #默认是升序(asc),降序(desc) select * from emp

MySQL常用查询操作

下面是常用mysql数据库查询总结: 显示一个数据表的所有数据. mysql> SELECT * FROM [table name]; 返回指定数据表的各列信息. mysql> show columns from [table name]; 使用值"blog"过滤显示选定的某些行. mysql> SELECT * FROM [table name] WHERE user = "blog"; 显示所有包含name为"Bob"和ph

MySQL —— 简单查询与按条件查询

在MySQL中从数据表中查询数据的基本语句时select语句.  select语句基本语法格式:      select 查询内容       from 表名      where 表达式      group by 字段名      having 表达式      order by 字段名      limit 记录数每一个select语句由多个子句组成. 1. from 表名 指定是从那张表中查询 2. select 查询内容 查询所有字段 select * from 表名:*通配符表示所有

mysql之查询操作

1.查询所有 * select * from table_name; 2.查询指定的列 mysql> select myname from zhuzhu; +--------+ | myname | +--------+ | zhang3 | | li4    | | zhang3 | | li4    | | zhang3 | | li4    | | zhang3 | | li4    | | zhang3 | | li4    | | zhang3 | | li4    | | zhang

mysql数据库查询操作

数据查询语言 SELECT 列名1,列名2...FROM 表名 [WHERE条件] 查询所有字段用* 不带where条件就把表的所有记录查出来 =    //赋值和判断都是 !=   <> //两种不等于 <  >   <=    >= OR 或者 || AND 且 && BETWEEN 5 AND 10 IN NOT IN LIKE  '%值%' 一些简单的查询,以user表为例,sex->0表示男,1表示女 查询所有 sleect * from

MySQL简单查询语句练习

数据查询语法(DQL) DQL就是数据查询语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端. 语法: SELECT selection_list /*要查询的列名称*/ FROM table_list /*要查询的表名称*/ WHERE condition /*行条件*/ GROUP BY grouping_columns /*对结果分组*/ HAVING condition /*分组后的行条件*/ ORDER BY sorting_columns /*对结果分组*/

mysql 简单查询语句

1.根据小时分组 select DATE_FORMAT(Y_CDATETIME,'%Y%m%d %H') HOUR,count(*) as '总量' FROM orderdata WHERE Y_CDATETIME >='2017-04-27' and Y_CDATETIME < '2017-04-28' GROUP BY HOUR; 2.根据查询结果降序排列 SELECT * FROM( select DATE_FORMAT(Y_CDATETIME,'%Y%m%d %H') HOUR,cou