数据的准备

  • 创建一个数据库
    1
    create database data_test charset=utf8;

创建数据表

  • students表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    create table students(
    id int unsigned primary key auto_increment not null,
    name varchar(20) default '',
    age tinyint unsigned default 0,
    height decimal(5,2),
    gender enum('男','女','中性','保密') default '保密',
    cls_id int unsigned default 0,
    is_delete bit default 0
    );
  • classes表

    1
    2
    3
    4
    create table classes (
    id int unsigned auto_increment primary key not null,
    name varchar(30) not null
    );
  • 准备数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    -- 向students表中插入数据
    insert into students values
    (0,'小明',18,180.00,2,1,0),
    (0,'小月月',18,180.00,2,2,1),
    (0,'彭于晏',29,185.00,1,1,0),
    (0,'刘德华',59,175.00,1,2,1),
    (0,'黄蓉',38,160.00,2,1,0),
    (0,'凤姐',28,150.00,4,2,1),
    (0,'王祖贤',18,172.00,2,1,1),
    (0,'周杰伦',36,NULL,1,1,0),
    (0,'程坤',27,181.00,1,2,0),
    (0,'刘亦菲',25,166.00,2,2,0),
    (0,'金星',33,162.00,3,3,1),
    (0,'静香',12,180.00,2,4,0),
    (0,'郭靖',12,170.00,1,4,0),
    (0,'周杰',34,176.00,2,5,0);

    -- 向classes表中插入数据
    insert into classes values (0, "python_01期"), (0, "python_02期");

查询语句的使用

查询所有字段

  • select * from 表名;
    1
    select * from students;

查询指定字段

  • select 列1,列2,… from 表名;
    1
    select name,age from students;

使用as给字段起别名

  • select 字段 as 名字 … from 表名;

    1
    select name as 姓名,age as 年龄 from students;
  • select 表名.字段 … from 表名

    1
    select students.name,students.age from students;
  • 可以通过as给表起别名

  • select 别名.字段 … from 表名 as 别名;

    1
    selecct s.name,s.age from students as s;
  • 消除重复行

  • distinct 字段
    1
    select distinct gender from students;

条件查询

  • 比较运算符
  • select … from 表名 where …;

    1
    2
    3
    4
    5
    6
    7
    8
    --查询大于18岁的信息
    select * from students where age>18;
    --查询小于18岁的信息
    select * from students where age<18;
    --查询小于或者等于18岁的信息
    select * from students where age<=18;
    --查询年龄为18岁的所有学生的信息
    select * from students where age=18;
  • 逻辑运算符

  • and

    1
    2
    3
    4
    --18到28之间的所有学生信息
    select * from students where age>18 and age<28;
    --18岁以上的女性
    select * from students where age>18 and gender="女";
  • or

    1
    2
    --18岁以上或者身高超过180以上
    select * from students where age>18 or height>180;
  • not

    1
    2
    3
    4
    --不在18岁以上的女性
    select * from students where not (age>18 and gender="女");
    --年龄不是小于或者等于18 并且是女性
    select * from students where (not age<=18) and gender="女";

模糊查询

  • like
  • %替换0个或者多个
  • _替换1个

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    --查询姓名中以 “小” 开始的名字
    select name from students where name like "小%";
    --查询姓名中有 “小” 所有名字
    select name from students where name like "%小%";
    --查询有两个字的名字
    select name from students where name like "__";
    --查询有三个字的名字
    select name from students where name like "___";
    --查询至少有两个字的名字
    select name from students where name like "__%";
  • rlike 正则表达式

    1
    2
    3
    4
    --查询以“周”开始的姓名
    select name from students where name rlike "^周.*";
    --查询以“周”开始 “伦”结尾的姓名
    select name from students where name rlike "^周.*伦$";

范围查询

  • in (1,3,8)表示在一个非连续的范围内

    1
    2
    --查询年龄为18,34的姓名
    select name,age from students where age in (18,34);
  • not in 不在此非连续范围内

    1
    2
    --查询年龄不是18,34岁的名字
    select name,age from students where age not in (18,34);
  • not between … and …表示不在一个连续的范围内

    1
    2
    --查询年龄不在18到34岁之间的信息
    select * from students where age not between 18 and 34;
  • 空判断

  • is null

    1
    2
    --查询身高为空的信息
    select * from students where height is null;
  • is not null

    1
    2
    --查询身高不为空的信息
    select * from students where height is not null;

排序

  • order by 字段
  • asc从小到大排序,即升序
  • desc从大到小排序,即降序
    1
    2
    3
    4
    --查询年龄在18到34岁之间的男性,按照年龄从小到大排序
    select * from students where age between 18 and 34 order by age asc;
    --按照年龄从小到大,身高从高到矮的排序
    select * from students order by age asc,height desc;

聚合函数

  • count 总数

    1
    2
    3
    --查询男性有多少人,女性有多少人
    select count(*) from students where gender="男";
    select count(*) from students where gender="女";
  • max 最大值

    1
    2
    --查询最大年龄
    select max(age) from students;
  • min 最小值

  • sum 求和

    1
    2
    --计算所有人的年龄总和
    select sum(age) from stundets;
  • avg 平均值

    1
    2
    --计算平均年龄
    select avg(age) from students;
  • round 四舍五入 round(123.12,1)保留一位小数123.1

    1
    2
    --计算所有人的平均年龄,保留2位小数
    select round(avg(age),2) from students;

分组

  • group by

    1
    2
    3
    4
    5
    6
    --按照性别分组,查询所有的性别
    select gender from students group by gender;
    --计算每种性别的人数
    select gender,count(*) from students group by gender;
    --计算男性的人数
    select gender,count(*) from students where gender="男" group by gender;
  • group_concat(…)

    1
    2
    --查询同种性别中的姓名,年龄,身高
    select gender,group_concat(name,",",age,",",height) from students group by gender;
  • having

    1
    2
    3
    4
    --查询平均年龄超过30岁的性别,以及姓名
    select gender,group_concat(name) from students group by gender having avg(age)>30;
    --查询每种性别中的人数多于2个的信息
    select gender,group_concat(name) from students group by gender having count(*)>2;

分页

  • limit start,count
    1
    2
    3
    4
    5
    6
    7
    8
    --限制查询出来的数据个数
    select * from students limit 5;
    --查询前5个数据
    select * from students limit 5;
    --查询id6-10的数据
    select * from students limit 5,5;
    --每页显示2个,显示第六页的信息,按照年龄从小到大排序
    select * from students order by age asc limit 10,2;