#--01-数据库进阶操作-材料准备-- 创建数据库createdatabase python_test_1 charset=utf8;-- 使用数据库use python_test_1;-- students表createtable students(
id intunsignedprimarykeyauto_incrementnotnull,
name varchar(20)default'',
age tinyintunsigneddefault0,
height decimal(5,2),
gender enum('男','女','中性','保密')default'保密',
cls_id intunsigneddefault0,
is_delete bitdefault0);-- 如果自己有数据,可以运行如下语句,xxx替换成sql文件的名字,可以直接导入文件
source xxx.sql;-- classes表createtable classes (
id intunsignedauto_incrementprimarykeynotnull,
name varchar(30)notnull);-- 向students表中插入数据insertinto 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),(0,'凌小小',28,180.00,2,1,0),(0,'司马二狗',28,120.00,1,1,0);-- 向classes表中插入数据insertinto classes values(0,"python_01期"),(0,"python_02期"),(8,'Python_03期');
简单的查询练习:
use python_test_1;select name as"姓名"from students;select students.name from students;select s.name from student as s;select gender from students;# 去重selectdistinct gender from students;
where语句查询:
· select * from TABLENAME where CONDITION;
· eg. select * from students where id=1;
· 运算符:=,>,>=,<,<=,!=或<>
use python_test_1;-- age > 18select*from students where age >18;-- others
逻辑运算符:
and
or
not
-- andselect*from students where age >18and age <28;-- orselect*from students where age >18or height >=180;-- notselect*from students wherenot(age >18and gender='男');
模糊查询:
like
% 表示任意多个字符
_ 表示任意一个字符
-- %select*from students where name like"小%";select*from students where name like"%小%";-- _select*from students where name like"__";select*from students where name like"__%";
范围查询:
between-and 连续范围查询
in 非连续范围查询
-- inselect name,age from students where age in(18,34);select name,age from students where age notin(18,34);-- between andselect*from students where id between18and34;select*from students where id notbetween18and34;
空值判断:
is null 空
is not null 非空
-- height nullselect*from students where height isnull;select*from students where height isnotnull;
排序查询:
select * from TABLE order by 列1 asc|desc [, 列2 asc|desc]
默认asc
-- male 18-34 height ascselect*from students
where age between18and34and gender =1orderby height asc;
-- countselectcount(*)from students where gender =1;-- maxselectmax(age)from students;-- minselectmin(height)from students;-- sumselectmax(age)from students;-- avgselectavg(age)from students;-- 四舍五入selectround(avg(age),2)from students;
分组查询:
· 划分区域,分成几个小组
group by
group_concat(……) 想要显示数据就必须得用这个函数
-- 正确写法select gender from students groupby gender;-- 错误写法-- select name,gender from students group by gender; -- 可用聚合函数select gender,count(*)from students groupby gender;--select group_concat(name),gender from students groupby gender;-- selectavg(age),gender from students groupby gender;
having --注意一般是与group by连用
with rollup --进行汇总,类似统计总数,用在group by后
select group_concat(name),gender
from students
groupby gender
havingavg(age)>30;--selectcount(*),gender
from students
groupby gender
with rollup;
分页查询:
· 数据过大,不进行分页,很可能系统崩溃
limit 起始记录,记录数
-- 要写在sql语句的最后
-- 展示五个数据select*from students
limit0,5;-- 展示第一页select*from students
limit0,2;-- 直接展示第二页select*from students
limit2,2;-- 按年龄排序的分页查询select*from students
orderby age asclimit6,2;
连接查询:
· 使用场景:数据来源于多张表时,需要进行连接
内连接查询:
两个表的交集
select 字段 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2
· 内连接会涉及到两个表的连接
· 但是表连接的顺序会影响到语句的执行速度
--select*from students innerjoin classes;--select*from students innerjoin classes
on students.cls_id = classes.id;--select students.name,classes.name
from students
innerjoin classes
on students.cls_id = classes.id;--select s.name,c.name
from students as s
innerjoin classes as c
on s.cls_id = c.id;
外连接查询:
左连接,右连接
-- 保留交集的左边或者右边,就是无匹配的话也会展示数据
-- left joinselect*from students
leftjoin classes
on students.cls_id = classes.id;-- right joinselect*from classes
leftjoin students
on students.cls_id = classes.id;
自连接查询:
· 同一个表进行连接
select * from table as t1
inner join table as t2
on t1.xxx = t2.xxx
where t1.xxx = xxx;
子查询:
select *
from (select *
from t2);
select*from(select*from classes
where id in(1,2,3)) t1;