网站备案怎么那么麻烦,网站买源代码,知名网络软文推广平台,阳西网站seo数据库设计规范 58到家数据库30条军规解读查询 创建数据库、数据表 -- 创建数据库
create database python_test_1 charsetutf8; -- 使用数据库 use python_test_1; -- students表 create table students( id int unsigned primary key auto_increment not null, name varchar(… 数据库设计规范 58到家数据库30条军规解读查询 创建数据库、数据表
-- 创建数据库
create database python_test_1 charsetutf8; -- 使用数据库 use python_test_1; -- 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期); 查询所有字段select * from 表名;
例
select * from students; 查询指定字段select 列1,列2,... from 表名; 例: select name from students; 使用 as 给字段起别名select id as 序号, name as 名字, gender as 性别 from students; 可以通过 as 给表起别名
-- 如果是单表查询 可以省略表明
select id, name, gender from students; -- 表名.字段名 select students.id,students.name,students.gender from students; -- 可以通过 as 给表起别名 select s.id,s.name,s.gender from students as s; 消除重复行 在select后面列前使用distinct可以消除重复的行select distinct 列1,... from 表名; 例 select distinct gender from students; 条件 使用where子句对表中的数据筛选结果为true的行会出现在结果集中 语法如下select * from 表名 where 条件;
例
select * from students where id1; where后面支持多种运算符进行条件的处理 比较运算符逻辑运算符模糊查询范围查询空判断比较运算符 等于: 大于: 大于等于: 小于: 小于等于: 不等于: ! 或 例1查询编号大于3的学生 select * from students where id 3; 例2查询编号不大于4的学生 select * from students where id 4; 例3查询姓名不是“黄蓉”的学生 select * from students where name ! 黄蓉; 例4查询没被删除的学生 select * from students where is_delete0; 逻辑运算符 andornot例5查询编号大于3的女同学 select * from students where id 3 and gender0; 例6查询编号小于4或没被删除的学生 select * from students where id 4 or is_delete0; 模糊查询 like%表示任意多个任意字符_表示一个任意字符例7查询姓黄的学生 select * from students where name like 黄%; 例8查询姓黄并且“名”是一个字的学生 select * from students where name like 黄_; 例9查询姓黄或叫靖的学生 select * from students where name like 黄% or name like %靖; 范围查询 in表示在一个非连续的范围内例10查询编号是1或3或8的学生 select * from students where id in(1,3,8); between ... and ...表示在一个连续的范围内例11查询编号为3至8的学生 select * from students where id between 3 and 8; 例12查询编号是3至8的男生 select * from students where (id between 3 and 8) and gender1; 空判断 注意null与是不同的判空is null例13查询没有填写身高的学生 select * from students where height is null; 判非空is not null例14查询填写了身高的学生 select * from students where height is not null; 例15查询填写了身高的男生 select * from students where height is not null and gender1; 优先级 优先级由高到低的顺序为小括号not比较运算符逻辑运算符and比or先运算如果同时出现并希望先算or需要结合()使用排序 为了方便查看数据可以对数据进行排序 语法 select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...] 说明 将行数据按照列1进行排序如果某些行列1的值相同时则按照列2排序以此类推默认按照列值从小到大排列ascasc从小到大排列即升序desc从大到小排序即降序例1查询未删除男生信息按学号降序 select * from students where gender1 and is_delete0 order by id desc; 例2查询未删除学生信息按名称升序 select * from students where is_delete0 order by name; 例3显示所有的学生信息先按照年龄从大--小排序当年龄相同时 按照身高从高--矮排序 select * from students order by age desc,height desc; 聚合函数 为了快速得到统计数据经常会用到如下5个聚合函数 总数 count(*)表示计算总行数括号中写星与列名结果是相同的例1查询学生总数 select count(*) from students;最大值 max(列)表示求此列的最大值例2查询女生的编号最大值 select max(id) from students where gender2; 最小值 min(列)表示求此列的最小值例3查询未删除的学生最小编号 select min(id) from students where is_delete0; 求和 sum(列)表示求此列的和例4查询男生的总年龄 select sum(age) from students where gender1; -- 平均年龄 select sum(age)/count(*) from students where gender1; 平均值 avg(列)表示求此列的平均值例5查询未删除女生的编号平均值 select avg(id) from students where is_delete0 and gender2; 分组 group by group by的含义:将查询结果按照1个或多个字段进行分组字段值相同的为一组group by可用于单个字段分组也可用于多个字段分组group by group_concat() group_concat(字段名)可以作为一个输出字段来使用表示分组之后根据分组结果使用group_concat()来放置每一组的某字段的值的集合group by 集合函数 通过group_concat()的启发我们既然可以统计出每个分组的某字段的值的集合那么我们也可以通过集合函数来对这个值的集合做一些操作group by having having 条件表达式用来分组查询后指定一些条件来输出查询结果having作用和where一样但having只能用于group bygroup by with rollup with rollup的作用是在最后新增一行来记录当前列里所有记录的总和获取部分行 当数据量过大时在一页中查看数据是一件非常麻烦的事情 语法 select * from 表名 limit start,count 说明 从start开始获取count条数据例1查询前3行男生信息 select * from students where gender1 limit 0,3; 示例分页 已知每页显示m条数据当前显示第n页求总页数此段逻辑后面会在python中实现 查询总条数p1使用p1除以m得到p2如果整除则p2为总数页如果不整除则p21为总页数求第n页的数据 : select * from students where is_delete0 limit (n-1)*m,m 接查询 当查询结果的列来源于多张表时需要将多张表连接成一个大的数据集再选择合适的列返回 mysql支持三种类型的连接查询分别为 内连接查询查询的结果为两个表匹配到的数据 右连接查询查询的结果为两个表匹配到的数据右表特有的数据对于左表中不存在的数据使用null填充 左连接查询查询的结果为两个表匹配到的数据左表特有的数据对于右表中不存在的数据使用null填充select * from 表1 inner或left或right join 表2 on 表1.列 表2.列 例1使用内连接查询班级表与学生表 select * from students inner join classes on students.cls_id classes.id; 例2使用左连接查询班级表与学生表 此处使用了as为表起别名目的是编写简单select * from students as s left join classes as c on s.cls_id c.id; 例3使用右连接查询班级表与学生表 select * from students as s right join classes as c on s.cls_id c.id; 例4查询学生姓名及班级名称 select s.name,c.name from students as s inner join classes as c on s.cls_id c.id; 自关联 设计省信息的表结构provinces idptitle 设计市信息的表结构citys idctitleproid citys表的proid表示城市所属的省对应着provinces表的id值 问题 能不能将两个表合成一张表呢 思考 观察两张表发现citys表比provinces表多一个列proid其它列的类型都是一样的 意义 存储的都是地区信息而且每种信息的数据量有限没必要增加一个新表或者将来还要存储区、乡镇信息都增加新表的开销太大 答案 定义表areas结构如下 idatitlepid 说明: 因为省没有所属的省份所以可以填写为null城市所属的省份pid填写省所对应的编号id这就是自关联表中的某一列关联了这个表中的另外一列但是它们的业务逻辑含义是不一样的城市信息的pid引用的是省信息的id在这个表中结构不变可以添加区县、乡镇街道、村社区等信息创建areas表的语句如下 create table areas(aid int primary key, atitle varchar(20), pid int ); 从sql文件中导入数据source areas.sql;查询一共有多少个省select count(*) from areas where pid is null; 例1查询省的名称为“山西省”的所有城市select city.* from areas as city
inner join areas as province on city.pidprovince.aid where province.atitle山西省; 例2查询市的名称为“广州市”的所有区县select dis.* from areas as dis
inner join areas as city on city.aiddis.pid where city.atitle广州市; 子查询 子查询 在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句 主查询 主要查询的对象,第一条 select 语句 主查询和子查询的关系 子查询是嵌入到主查询中子查询是辅助主查询的,要么充当条件,要么充当数据源子查询是可以独立存在的语句,是一条完整的 select 语句子查询分类 标量子查询: 子查询返回的结果是一个数据(一行一列)列子查询: 返回的结果是一列(一列多行)行子查询: 返回的结果是一行(一行多列)标量子查询 查询班级学生平均年龄查询大于平均年龄的学生查询班级学生的平均身高 select * from students where age (select avg(age) from students); 列级子查询 查询还有学生在班的所有班级名字找出学生表中所有的班级 id找出班级表中对应的名字select name from classes where id in (select cls_id from students); 行级子查询 需求: 查找班级年龄最大,身高最高的学生行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素select * from students where (height,age) (select max(height),max(age) from students); 子查询中特定关键字使用 in 范围格式: 主查询 where 条件 in (列子查询)总结 查询的完整格式 ^_^ 不要被吓到 其实很简单 ! _ ! SELECT select_expr [,select_expr,...] [ FROM tb_name[WHERE 条件判断][GROUP BY {col_name | postion} [ASC | DESC], ...] [HAVING WHERE 条件判断] [ORDER BY {col_name|expr|postion} [ASC | DESC], ...] [ LIMIT {[offset,]rowcount | row_count OFFSET offset}] ] 完整的select语句select distinct *
from 表名
where ....
group by ... having ... order by ... limit start,count 执行顺序为 from 表名where ....group by ...select distinct *having ...order by ...limit start,count实际使用中只是语句中某些部分的组合而不是全部. 转载于:https://www.cnblogs.com/yinjiangchong/p/9404349.html