数据库最常用的查询方法详解,sql语句详解

—— 数据准备

—— 创建一个数据库

create database python_test charset=utf8;

 

—— 使用一个数据库

use python_test;

 

—— 显示使用的当前数据是哪个?

select database();

 

—— 创建一个数据表

—— students表

create table students(

id int primary key not null auto_increment,

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表

create table classes(

id int primary key auto_increment not null,

name varchar(30) not null

);

— 查询

— 查询所有字段

       —— select * from 表名;

select * from students;

select * from classes;

select id, name from students;

 

—— 查询指定字段

select 字段 … from 表名;

select name, age from students;

 

—— 使用as给字段起别名 查询指定字段

select 字段 as 别名… from 表名;

select name as 姓名, age as 年龄 from students;

 

—— select 表名.字段 … from 表名;

select students.name, students.age from students;

 

—— 可以通过as 给表起别名

select 别名.字段 。。。 From 表名 as 别名; 表起别名后 只能用别名

select s.name, s.age from students as s;

 

 

—— 消除重复行

distinct 字段

select distinct genter from students;

 

—— 条件查询

—— 比较运算符

select … from 表名 where …

—>

— 查询大于18岁的信息

select * from students where age>18;

select id,name,age students where age>18;

 

— <

查询小于18岁的信息

select * from students where age<18;

 

— >= 

— <= 查询小于或大于等于18岁的信息

select * from students where age>=18;

select * from students where age<=18;

 

— = 查询年龄为18岁的所有学生的名字

select * from students where age=18;

 

— != 或者 <>

select * from students where age!=18;

select * from students where age<>18;

—— 逻辑运算符

—— and 

—— 18到28之间的所有学生信息

select * from students where age>18 and age<28; 

 

—— 18以上的女性信息

select * from students where age>18 and gender=2

 

—— or 

—— 18以上或者身高超过180(包含)以上

select * from students age>18 or height>=180;

 

—— not

—— 不在18以上的女性 这个范围内的信息

select * from students where not (age >=18 and gender=2);

 

—— 年龄不是小于或者等于18 并且是女性

select * from students where not age<=18 and gender=2;

 

—— 模糊查询

—— like

— % 替换1个或者多个

— _替换1个

— 查询姓名中 以’小’开始的名字

select name from students where name like '%';

 

—- 查询姓名中 包含‘小’所有的名字

select name from students where name like ‘%%’;

 

— 查询有2个字的姓名

select name from students where name like '__';

 

— 查询有3个字的姓名

select name from students where name like '__';

 

—- 查询至少有3个字以上的姓名

select name from students where name like ‘___%’;

 

— rlike 正则

— 查询以 周 开始的姓名

select name from students where name rlike ‘^周.*’;

 

— 查询以 周开始、伦结尾的姓名

select name from students where name rlike ‘^周.*伦¥’;

 

—— 范围查询

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

— 查询年龄为18、34的姓名

select * from students where age=18 and age=34;

select name, age from students where age in(18, 34);

 

 

— not in 不非连续的范围之内

— 年龄不是18、34 岁之间的信息

select name, age from students where age not in(18, 34); 

 

— between … and … 表示在一个连续的范围内

— 查询年龄在18 到34 之间的信息

select * from students where age between 18 and 34;

 

— not between … and … 表示不再一个连续的范围内

— 查询 年龄不再18到34之间的信息

select * from students where age not between 18 and 34;

select * from students where not age between 18 and 34;

 

—— 空判断

— 判空 is null

— 查询身高为空的信息

select * from students where height is null;

 

— 判非空 is not null

select * from students where height is not null;

 

—— 排序

— order by 字段

— asc 从小到大排序  即升序

— desc 从大到小排序  即降序

 

— 查询年龄在10到60之间的男性, 按照年龄从小到大排序

select * from students where (age between 10 and 60) and gender=1 order by age;

select * from students where (age between 10 and 60) and gender=1 order by age asc;

 

— 查询年龄在18到34岁之间的女性,身高从高到矮排序

select * from students where (age between 18 and 34) and gender=2 order by height desc;

 

— order by 多个字段

— 查询年龄在18到34之间的女性,身高从高到矮排序,如果身高相同的情况下按照年龄从小到大排序

select * from students where (age between 18 and 34) order by height desc, age asc;

 

— 如果年龄也相同 那么按照id从大到小排序

select * from students where (age between 18 and 34) and gender=2 order by height desc, age asc, id desc;

 

 

— 按照年龄从小到大、身高从高到矮的排序

select * from students order by age asc, height desc;

 

—— 聚合函数

— 总数

— count

— 查询男性有多少人,女性有多少人

select count(*) as 男性人数 from students where gender=1;

select count(*) as 女性人数 from students where gender=2;

 

— 最大值

— max

— 查询最大的年龄

select max(age) as 年龄最大是 from studentes;

 

— 查询女性的最高 身高

select max(height) as 女性的最高身高是 from students  where gender=2;

 

— 最小值

— min

select min(height) from students where gender=2;

 

— 求和

— sum

— 计算所有人的年龄总和

select sum(age) from students;

 

— 平均值

—avg

— 计算平均年龄

select avg(age) from students;

 

— 计算平均年龄 sum(age)/count(*)

select sum(age)/count(*) from students;

 

— 四舍五入 round(123,23, 1) 保留1位小数

— 计算所有人的平均年龄,保留2位小数

select round(avg(age), 2) from students;

 

— 计算男性的平均身高,保留2位小数

select round(avg(height), 2) from students where gender=1;

 

—— 分组

— group by

— 按照性别分组,查询所有的性别

select gender from students group by gender;

 

— 计算每种性别中的人数

select gender, count(*) from students group by gender;

 

— 计算男性的人数

select gender, count(*) from students where gender=1 group by gender;

 

- 查询男性姓名,id,age

select gender, group_concat(name, id, age) from students where gender=1 group by gender

select gender, group_concat("姓名:",name, "id:",id, "年龄:",age) from students where gender=1 group by gender;

 

 

— group_concat(…)

— 查询同种性别中的姓名

select gender, group_concat(name) from students group by gender;

 

— having

— 查询平均年龄超过30岁的性别 以及 姓名 having avg(age) > 30

select gender, group_concat(name), avg(age) 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

— 限制查询出来的数据个数

select * from students where gender=1 limit 2;

 

— 查询前5个数据

select * from students limit 0, 5;

 

— 查询id6-10(包含)的书序

select * from students limit 5, 5;

 

— 每页显示2个,第一个页面

select * from students limit 0, 2;

 

— 每页显示2个,第2个页面

select * from students limit 2, 2;

 

— 每页显示2个,第三个页面

select * from students limit 4, 2;

 

— 每页显示2个,第四个页面

select * from students limit 6, 2; ——> limit (第n页-1)*每页的个数, 每页的个数;

 

— 每页显示2个,显示第6页信息,按照年龄从小到大排序

select * from students order by age limit 10, 2;

 

—— 连接查询

— 内连接 inner  join … on

— select * from 表1 inner join 表2 on 条件; 

— 查询 有能够对应班级的学生以及班级信息

select * from students inner join classes on students.cls_id=classes.id;

 

— 按照要求显示姓名、班级

select students.name, classes.name from students inner join classes on students.cls_id=classes.id;

 

— 给数据表起名字

select s.name, c.name from students as s inner join classes as c on s.cls_id=c.id;

 

— 查询 有能够对应班级的学生以及班级信息,显示学生的所有信息,只显示班级名称

select s.*,c.name from students as s inner join classes as c on s.cls_id=c.id

 

— 在以上的查询中,将班级姓名显示在第1列

select c.name, s.* from students as s inner join classes as c on s.cls_id=c.id;

 

— 查询 有能够对应班级的学生以及班级信息,按照班级进行排序

select c.name, s.* from students as s inner join classes as c on s.cls_id=c.id order by c.name;

select c.name, s.* from students as s inner join classes as c on s.cls_id=c.id order by c.name,s.id;

 

 

—- left join

—- 查询每位学生对应的班级信息

select * from students as s left join classes as c on s.cls_id=c.id;

 

— 查询没有对应班级信息的学生

select * from students as s left join classes as c on s.cls_id=c.id having c.id is null;

 

— right join on

— 将数据表名互换位置,用left join完成

 

—— 自关联

— 省级联动

— 查询所有省份

select * from area_info where pid in null;

— 查询出山东省有哪些城市

select * from area_info as province inner join area_info as city on province.aid=city.pid having province.atitle='山东省';

 

—- 查出青岛市有哪些县城

select * from area_info as city inner join area_info as country on city.aid= country.pid having city.atitle=‘青岛市’;

 

 

—— 子查询

—- 标量子查询

— 查询出高于平均身高的信息

select * from students where height>(select avg(height) from students);

 

 

 

原文地址:https://www.cnblogs.com/peijz/p/12360346.html