MySql的查询总结

来源:互联网 发布:比原子小的物质知乎 编辑:程序博客网 时间:2024/06/06 01:03

Num01–>mysql基本查询

1、查询所有字段------select * from 表名;例:select * from students;2、查询指定字段------在select后面的列名部分,可以使用as为列起别名,这个别名出现在结果集中select 列1,列2,... from 表名;例:select id,name,gender from students;3、消除重复行-------在select后面列前使用distinct可以消除重复的行select distinct 列1,... from 表名;例:select distinct gender from students;

Num02–>mysql条件查询

1、使用where子句对表中的数据筛选,结果为true的行会出现在结果集中-------------------------------------语法如下:select * from 表名 where 条件;例:select * from students where id=1;2where后面支持多种运算符,进行条件的处理,如下---------------------------比较运算符逻辑运算符模糊查询范围查询空判断2.1比较运算符--------等于=大于>大于等于>=小于<小于等于<=不等于!=或<>例1:查询编号大于3的学生select * from students where id>3;例2:查询编号不大于4的科目select * from subjects where id<=4;例3:查询姓名不是“黄蓉”的学生select * from students where name!='黄蓉';4:查询没被删除的学生select * from students where isdelete=0;2.2逻辑运算符--------andornot5:查询编号大于3的女同学select * from students where id>3 and gender=0;例6:查询编号小于4或没被删除的学生select * from students where id<4 or isdelete=0;2.3模糊查询-------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 '%靖';2.4范围查询-------in表示在一个非连续的范围内例10:查询编号是138的学生select * from students where id in(1,3,8);between ... and ...表示在一个连续的范围内例11:查询编号为38的学生select * from students where id between 3 and 8;例12:查询学生是38的男生select * from students where id between 3 and 8 and gender=1;2.5空判断------注意:null与'' 是不同的判空is null例13:查询没有填写地址的学生select * from students where hometown is null;判非空is not null例14:查询填写了地址的学生select * from students where hometown is not null;例15:查询填写了地址的女生select * from students where hometown is not null and gender=0;3、优先级-----优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符andor先运算,如果同时出现并希望先算or,需要结合()使用

Num03–>mysql聚合函数

为了快速得到统计数据,经常会用到如下5个聚合函数1、count(*)表示计算总行数,括号中写星与列名,结果是相同的例1:查询学生总数select count(*) from students;2、max(列)表示求此列的最大值例2:查询女生的编号最大值select max(id) from students where gender=0;3、min(列)表示求此列的最小值例3:查询未删除的学生最小编号select min(id) from students where isdelete=0;4、sum(列)表示求此列的和例4:查询男生的编号之和select sum(id) from students where gender=1;5、avg(列)表示求此列的平均值例5:查询未删除女生的编号平均值select avg(id) from students where isdelete=0 and gender=0;

Num04–>mysql分组

按照字段分组,表示此字段相同的数据会被放到一个组中分组后,分组的依据列会显示在结果集中,其他列不会显示在结果集中可以对分组后的数据进行统计,做聚合运算语法:select1,列2,聚合... from 表名 group by1,列2...例1:查询男女生总数select gender as 性别,count(*) from students group by gender;例2:查询各城市人数select hometown as 家乡,count(*) from students group by hometown;分组后的数据筛选语法:select1,列2,聚合... from 表名 group by1,列2,列3...             having 列1,...聚合...having后面的条件运算符与where的相同例3:查询男生总人数方案一select count(*) from students where gender=1;-----------------------------------方案二:select gender as 性别,count(*) from students group by genderhaving gender=1;where与having的区别---------------where是对from后面指定的表进行数据筛选,属于对原始数据的筛选having是对group by的结果进行筛选

Num05–>mysql排序

为了方便查看数据,可以对数据进行排序语法:select * from 表名order by1 asc|desc,列2 asc|desc,...;将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推默认按照列值从小到大排列asc从小到大排列,即升序desc从大到小排序,即降序例1:查询未删除男生信息,按学号降序select * from students where gender=1 and isdelete=0 order by id desc;例2:查询未删除科目信息,按名称升序select * from subjects where isdelete=0 order by name;

Num06–>mysql分页

当数据量过大时,在一页中查看数据是一件非常麻烦的事情语法:select * from 表名 limit start,countstart开始,获取count条数据start索引从0开始例1:查询前3行男生信息select * from students where gender=1 limit 0,3;示例:已知:每页显示m条数据,当前显示第n页求总页数:此段逻辑后面会在python中实现查询总条数p1使用p1除以m得到p2如果整除则p2为总数页如果不整除则p2+1为总页数求第n页的数据select * from students where isdelete=0 limit (n-1)*m,m;

Num07–>mysql连接查询

当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回mysql支持三种类型的连接查询,分别为:1、内连接查询:查询的结果为两个表匹配到的数据2、左连接查询:查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充3、右连接查询:查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充语法:select * from1innerleftright join2 on1.列=表2.列例1:使用内连接查询班级表与学生表此处使用了as为表起别名,目的是编写简单select * from classes as clsinner join students as stu on sub.id=stu.cls.id例2:使用左连接查询班级表与学生表select * from classes as clsleft join students as stu on sub.id=stu.cls.id例3:使用右连接查询班级表与学生表select * from classes as clsright join students as stu on sub.id=stu.cls.id例4:查询学生姓名及班级名称select stu.name as stuname,cls.name as clsname from classes as clsinner join students as stu on sub.id=stu.cls.id

Num08–>mysql自关联

设计省信息的表结构provincesidptitle设计市信息的表结构citysidctitleproidcitys表的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 cityinner join areas as province on city.pid=province.aidwhere province.atitle='山西省';例2:查询市的名称为“广州市”的所有区县select dis.* from areas as disinner join areas as city on city.aid=dis.pidwhere city.atitle='广州市';

Num09–>mysql子查询

在一个select语句中,可以嵌套另一个select语句,这种查询语句被称为子查询子查询主要用到三个位置作为select子名作为from子句作为where子句例1:查询学生姓名及班级名称select stu.name as stuname,(select cls.name from classes where cls.id=stu.clsid) as clsname from students as stu;例2:查询学生与班级对应的信息select * from (select stu.*,cls.name as clsname from students as stu inner join classes as cls on stu.clsid=cls.id) as t1;例3:查询班级名称为'python1'的所有学生姓名select stu.name from students as stuwhere stu.clsid=(select id from classes where name='python1')说明:发现很多子查询的语句,都是可以使用连接查询实现的,此时推荐使用连接查询,因为连接查询的语句更简洁,逻辑更清晰

Num10–>mysql完整select语句

select distinct* from 表名 innerleftright join  ...on...where...group by... having...order by...limit start,count;
原创粉丝点击