【python MySQL 笔记】MySQL 查询
目录
1.数据准备和基本查询
1.1. 数据准备
创建数据库、两个数据表,用于语句的验证学习。
-- 数据的准备
-- 创建一个数据库
create database python_test charset=utf8;
-- 使用一个数据库
use python_test;
-- 显示使用的当前数据是哪个?
select database();
-- 创建一个数据表
-- students表
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表
create table classes (
id int unsigned auto_increment primary key not null,
name varchar(30) not null
);
向数据表中插入数据:
-- 向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班"), (0, "python_03班");
1.2.基本查询
-- 基本查询--------------------------------------
-- 查询所有字段
-- select * from 表名;
select * from students;
select * from classes;
select id, name from classes;
-- 查询 【指定字段】
-- select 列1,列2,... 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 students.name, students.age from students;
select s.name, s.age from students as s;
-- 注:起了别名后,用原表名会查询失败,如下:
-- 失败:select students.name, students.age from students as s;
-- 消除重复行,【去重】,相同的结果只显示一次
-- distinct 字段
-- select distinct 列1,... from 表名;
select distinct gender from students;
2. 条件查询
使用where子句对表中的数据筛选,结果为true的行会出现在结果集中
- 语法如下:select * from 表名 where 条件;
where后面支持多种运算符,进行条件的处理
- 比较运算符
- 逻辑运算符
- 模糊查询
- 范围查询
- 空判断
2.1. 比较运算符
-- 比较运算符-------------
-- select .... from 表名 where .....
-- >
-- 查询大于18岁的信息
select * from students where age>18;
select id,name,gender 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;
-- != 或者 <> 不等于
2.2. 逻辑运算符
-- 逻辑运算符-------------
-- 与【and】
-- 18到28之间的所以学生信息
select * from students where age>18 and age<28;
-- 失败select * from students where age>18 and <28;
-- 18岁以上的女性
select * from students where age>18 and gender="女";
select * from students where age>18 and gender=2;
-- 或【or】
-- 18以上或者身高查过180(包含)以上
select * from students where age>18 or height>=180;
-- 非【not】
-- 不在 18岁以上的女性 这个范围内的信息
-- select * from students where not age>18 and gender=2;
select * from students where not (age>18 and gender=2);
-- 年龄不是小于或者等于18 并且是女性
select * from students where (not age<=18) and gender=2;
2.3. 模糊查询
-- 模糊查询----------------
-- 【like】
-- % 表示0个或者多个字符
-- _ 表示1个字符
-- 查询姓名中 以 "小" 开始的名字
-- select name from students where name="小"; --只能查出name="小"的
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 "___";
-- 查询至少有2个字的名字
select name from students where name like "__%";
-- 【rlike】 正则表达式
-- 查询以 周开始的姓名
select name from students where name rlike "^周.*";
-- 查询以 周开始、伦结尾的姓名
select name from students where name rlike "^周.*伦$";
2.4. 范围查询
-- 范围查询-----------------
-- 【in】(1, 3, 8)表示在一个非连续的范围内
-- 查询 年龄为18、34的姓名
select name,age from students where age=18 or age=34;
select name,age from students where age=18 or age=34 or age=12;
select name,age from students where age in (12, 18, 34);
-- 【not in】 不非连续的范围之内
-- 年龄不是 12、18、34岁之间的信息
select name,age from students where age not in (12, 18, 34);
-- 【 between ... and ... 】表示在一个连续的范围内
-- 查询 年龄在18到34之间的的信息
select name, age 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;
-- 失败:select * from students where age not (between 18 and 34);
2.5. 空判断
-- null 空判断----------------------
-- 注意:null与''是不同的
-- 判空【 is null 】
-- 查询身高为空的信息
select * from students where height is null;
select * from students where height is NULL;
-- 判非空【 is not null 】
select * from students where height is not null;
3. 排序
为了方便查看数据,可以对数据进行排序
语法:select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]
说明:
- 将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
- 默认按照列值从小到大排列(asc)
- asc从小到大排列,即升序
- desc从大到小排序,即降序
-- 【 order by 】 字段
-- 【 asc 】从小到大排列,即升序
-- 【 desc 】从大到小排序,即降序
-- 查询年龄在18到34岁之间的男性,按照年龄从小到到排序
-- 默认排序
select * from students where (age between 18 and 34) and gender=1;
-- 按照年龄排序
select * from students where (age between 18 and 34) and gender=1 order by age;
select * from students where (age bet