您的位置:首页 > 数据库 > MySQL

mysql入门知识

2017-05-02 19:07 411 查看
五一之旅还算开心,然后今天开始继续学习。


关于mysql的问题

一、mysql查询的五种子句

where(条件查询)、having(筛选)、group by(分组)、order by(排序)、limit(限制结果数)


1、where常用运算符:

比较运算符

> 大于,<小于,>=大于等于,<=小于等于,!=不等于,in(v1,v2,v3) 在v1,v2,v3中 ,between v1 and v3 在v1到v3中(包含v1,v3),

逻辑运算符

not ( ! )  逻辑非
or ( || )    逻辑或
and ( && )  逻辑与

where id>=30 and id <= 50 or id >=50 and id <=100
取id在30~50或者50~100的值

where id not between 30 and 50
取id不在30与50之间的值


模糊查询

like
通配符:
%  任意字符
_  单个字符
where uname like "廖依_"; 单个字符匹配
where uname like "廖依%"; 多个字符匹配


2、group by 分组

group by 会根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。
select子句中的列名必须为分组列或者列函数,列函数对于group by 子句定义的分组,每个组返回一个结果。


解释下上面说的那句话。

select name,sum(score) from student_subject_score group by name;

这个查询select子句的列名,name为分组列,所以name可以保证唯一性,每一个name会是一个分组。

而所谓的列函数则是,注入上面的sum(score),这样列行数最后也能基于每个分组,得到计算的结果。

如 select score from student_subject_score group by name;

这样就会报错,因为基于每个分组,这样的查询得到的确实多个score,所以,上面才说是需要列函数或者分组列才可以。

一般应用就是基于分组进行列函数操作,就如下面having例子的查询两门不合格功课的同学为例,得到他们的姓名和平均成绩

sql 就是

select name,avg(score) as pj, sum(score<60) as s from student_subject_score group by name having s >1;

测试用的表建表语句
CREATE TABLE `student_subject_score` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
`subject` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
`score` TINYINT(4) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8'
ENGINE=InnoDB
;
测试用的数据
INSERT INTO `student_subject_score` (`id`, `name`, `subject`, `score`) VALUES
(1, 'yu', '语文', 100),
(2, 'yu', '数学', 45),
(3, 'yu', '英语', 70),
(4, 'xx', '语文', 59),
(5, 'xx', '数学', 100),
(6, 'xx', '英语', 45),
(7, 'yy', '语文', 23),
(8, 'yy', '数学', 45),
(9, 'yy', '英语', 57);


列函数有下面几种

(1)max:求最大值

(2)min:求最小值

(3)sum:求总数和

(4)avg:求平均值

(5)count:求总行数

3、having 与where 的异同点

having与where类似,可以筛选数据,where后的表达式怎么写,having后就怎么写
where针对表中的列发挥作用,查询数据
having对查询结果中的列发挥作用,筛选数据


查询两门及两门以上科目不及格的学生的平均分

思路:
#先计算所有学生的平均分
select name,avg(score) as pj from stu group by name;
#查出所有学生的挂科情况
select name,score<60 from stu;
#这里score<60是判断语句,所以结果为真或假,mysql中真为1假为0
#查出两门及两门以上不及格的学生
select name,sum(score<60) as gk from stu group by name having gk > 1;
#综合结果
select name,sum(score<60) as gk,avg(score) as pj from stu group by name having gk >1;


4、order by

(1)order by price  //默认升序排列
(2)order by price desc //降序排列
(3)order by price asc //升序排列,与默认一样
(4)order by rand() //随机排列,效率不高
#按栏目号升序排列,每个栏目下的商品价格降序排列
select * from goods where cat_id !=2 order by cat_id,price desc;


5、limit

limit [offset,] N
offset 偏移量,可选,不写则相当于limit 0,N
N     取出条目
select * from studentscore limit 1,3;
#查出学生的成绩,从第二条开始,取出三条


良好的理解模型:

1、where后面的表达式,把表达式放在每一行中,看是否成立

2、字段(列),理解为变量,可以进行运算(算术运算和逻辑运算)

3、 取出结果可以理解成一张临时表

二、mysql子查询

1、where型子查询

(把内层查询结果当作外层查询的比较条件)

select name from studentscore where id in (select id from studentscore group by name );
#里面输出的字段必须和前面的一致,里面输出两列,则报错,输出不一致的查询结果为空。


2。from型子查询

(把内层的查询结果供外层再次查询)

#用子查询查出挂科两门及以上的同学的平均成绩
select name,avg(score) from studentscore where name in(select name from (select id,name,sum(score>60) as n from studentscore group by name having n>2) as t)
#把内层的查询结果作为外层查询条件,输出字段没有限制


3、exists型子查询

(看内层查询是否存在,存在则返回外部查询结果,不存在则返回空)

select *  from test.studentscore where exists ( select id from picture.picinfo where picture.picinfo.id = test.studentscore.id);
内部子查询查询的是id,和外部的*不相匹配,为什么满足内层查询的时候,外部还能正常查询出结果呢?机制又是什么呢?

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。
EXISTS 指定一个子查询,检测行的存在。语法:EXISTS subquery。参数 subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。结果类型为 Boolean,如果子查询包含行,则返回 TRUE。

在子查询中使用 NULL 仍然返回结果集。
select *  from test.studentscore where exists (SELECT NULL)

结论就是exists字句的查询会返回一个boolean类型的结果,这个结果决定外层查询是否查询。如果为true,则外层查询结果为最终查询;如果为false,则返回空。
not exists 则完全相反。


三、union的用法

(把两次或多次的查询结果合并起来,要求查询的列数一致,推荐查询的对应的列类型一致,可以查询多张表,多次查询语句时如果列名不一样,则取第一次的列名(前面的字句的列名)!如果不同的语句中取出的行的每个列的值都一样,那么结果将自动会去重复,如果不想去重复则要加all来声明,即union all)

select * from studentscore union  select * from testunion;
# 去重的
select * from studentscore union all select * from testunion;
# 非去重的


四、join连接

JOIN的含义就如英文单词“join”一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接


笛卡尔积:

笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。


① Inner Join 内连接

将两个表中存在连接关系的字段,组成的记录集,叫做内连接。

没有Using子句的Inner Join相当于是求两个table的笛卡尔积。

select * from subject inner join teacher


② Cross Join 交叉连接

在Mysql中,Cross Join可以用逗号表达式表示,例如(table1, table 2)。在Mysql中,Cross Join 和 Inner Join 是等价的,但是在标准SQL中,它们并不等价,Inner Join 用于带有on表达式的连接,反之用Cross Join。以下两个SQL语句是等价的。

Cross Join 指的是两个table的笛卡尔积。

select * from table1 inner join table2;
select * from table1 cross join table2;
select * from (table1, table2);
select * from table1 nature join table2;


不难理解,下面两句SQL也是等价的。

select * from table1 left join (table2, table3) on (table2.id = table1.id and table2.author = table3.author);
select * from table1 left join (table2 cross join table3) on (table2.id = table1.id and table2.author = table3.author);


③ Natural Join 自然连接

NATURAL JOIN:这个句子的作用相当于INNER JOIN 使用using(公共字段)。如果使用的公共字段不存在,则会得到两表的笛卡尔积。

下面两个SQL是等价的。

select * from subject natural join teacher;
select * from subject inner join teacher using (id);
select * from subject natural left join teacher;
select * from subject left join teacher using(id);


④ Full join 全连接

只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。

MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法

left join + union(可去除重复数据)+ right join

select * from subject left join teacher on teacher.id = subject.id union  select * from subject right join teacher on teacher.id = subject.id


⑤ Straight Join

STRAIGHT_JOIN 和 JOIN相似,除了大部分情况下,在使用STRAIGHT_JOIN时候,先读右表后读左表。而在大部分情况下是先读左表的。STRAIGHT_JOIN仅用于少数情况下的表连接性能优化,比如右表记录数目明显少于左表。

⑥ Using子句

Using子句可以使用On子句重写。但是使用Select * 查询出的结果有差别。指定字段查,两者的结果是相同的。

以下两句话是等价的:
select * from subject join teacher using (id);
select * from subject join teacher on subject.id = teacher.id

第一个查询,相同字段id只会出现一次,第二个查询重复部分会被输出两次


⑦ left join

根据关联字段,查询,以左表为基础,右表不存在则置空。right join与之相反

下午把这个终于看完了,也实践了一遍。把五一的功课补上了。为自己加油!

最可怕的不是做不到,而是没有去尝试的勇气。

参考链接:原文戳这里。 十分感谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql