MySQL学习

一、基础语法学习

1.1 select

select * from 表名

1.2 update

UPDATE 表名 SET field1=value1,field2=value2,.. WHERE 条件;

1.3 insert

insert into 表名 (field1,field2,..) values (value1,value2,...)

1.4 delete

DELETE FROM 表名 WHERE field = value

1.5 group by

  • 默认只显示分组后的第一个成员信息,如果需要显示全部信息需要使用group_concat。对显示的字段添加group_concat。
SELECT s.sex,GROUP_CONCAT(s.name) FROM students s   JOIN course c ON s.course_id = c.id GROUP BY s.sex;

在这里插入图片描述

  • 多个分组参数
    前一个分组参数条件相同,才会进行下一个分组。

1.6 聚合函数

  • COUNT
  • SUM
  • MAX
  • MIN
  • AVG

1.7 mysql语句执行顺序

Mysql中查询语句的执行顺序

  • 先执行on筛选条件,然后join,避免产生大量数据
  • 接着where,group by,having,select,distinct,order by,limit。
  • 过滤条件排序:on,where,having

1.8 其他关键字

SELECT DISTINCT age FROM students;
//这是多个字段的去重,只有多个字段完全一致才会被去重。
SELECT DISTINCT age,id FROM students;

在这里插入图片描述

  • having
    条件筛选,在聚合函数后执行,而where是在聚合函数之前执行的,having要写在group by后面。
    MySQL中having的用法
SELECT COUNT(age) nums,GROUP_CONCAT(NAME)  FROM students GROUP BY age HAVING nums >=2 ;
SELECT * FROM students LIMIT 1,5;

1.9 符号

  • <>:表示不包含

1.10 时间查询

  • Date(arg) = “xxxx”
    arg是时间参数

二、复杂查询

2.1 多表联查之内外连接查询

2.1.1 交叉连接

  • 返回连接表的笛卡尔积
  • SELECT * FROM students CROSS JOIN course;
    在这里插入图片描述

2.1.2 内连接

  • 通过on后面设置连接条件移除不符合条件的数据行,不设置条件和交叉链接一样的。
  • 也可以使用where设置条件,但是on是标准写法。
  • SELECT s.name,c.course_name FROM students s INNER JOIN course c ON s.course_id=c.id;
    在这里插入图片描述

2.1.3 外连接

外连接将表分为基表和参考表,在基表的基础上返回符合条件的记录。有左外连接和右外连接。

2.1.3.1 左外连接
  • 左边的表为基表,左边的表的数据都会展示,若左表数据对应的右表数据为空则右表对应数据显示nul,若左表的数据对应右表的数据有多行,则数据会多条展示。
INSERT INTO students  (NAME,age,sex,height) VALUES ("jack",23,"男",189);
SELECT * FROM students;
SELECT s.name,c.course_name FROM students s LEFT JOIN course c ON s.course_id = c.id;

在这里插入图片描述

2.1.3.2 右外连接
  • 右边的表为基表,右边的表的数据都会展示,若右表数据对应的左边表数据为空则左表对应数据显示null,若右表的数据对应左表的数据有多行,则数据会多条展示。
INSERT INTO course (course_name) VALUES ("c#");
SELECT * FROM course;
SELECT c.course_name,s.name FROM students s RIGHT  JOIN course c ON s.course_id = c.id;

在这里插入图片描述

2.1.4 内连接和外连接的区别

内连接只包含符合条件的数据行,数据为null就不可以,但是外连接可以,数据为null依然可以展示。

2.2 多表查询之子查询

2.2.1 操作符

  • IN,NOT IN
    只要查询的值在/不在子查询的值范围中,就返回true
  • EXISTS,NOT EXISTS
    子查询语句结果集不为null就返回true

2.2.2 子查询语句

  • 单个字段
SELECT * FROM students WHERE id IN (SELECT id FROM students WHERE id > 9) AND sex = (SELECT sex FROM students WHERE NAME = "tom");
  • 多个字段
SELECT * FROM students WHERE (id,age) > (SELECT id,age FROM students WHERE id = 4);
  • any:和子查询中所有结果逐一比较,只要符合就成功返回
//查询男生中身高比只要比任意一个女生都低的男生的所有信息
SELECT * FROM students WHERE height < ANY(SELECT height FROM students WHERE sex= "女") AND sex = "男"
  • all:和子查询中所有结果逐一比较,必须都满足才行
//查询男生中身高比所有女生都低的男生的所有信息
SELECT * FROM students WHERE height < ALL(SELECT height FROM students WHERE sex= "女") AND sex = "男"

2.2.3 例题

  • 查询平均身高最低的年龄段学生
//查询平均身高最低的年龄段学生
SELECT MIN(res), age FROM (SELECT AVG(height) res, age FROM students GROUP BY age) AS a;
//查询平均身高最低的年龄段学生
SELECT age,AVG(height) FROM students GROUP BY age HAVING AVG(height) = 
	(SELECT MIN(res)FROM 
		(SELECT AVG(height) res FROM students GROUP BY age)AS a);

2.2.4 相关子查询

2.2.4.1 概述

参考:
MySQL子查询

一文让你彻底理解SQL关联子查询

  • 如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询。
    相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。
2.2.4.2 示例
  • 查询每个年龄段身高大于平均身高的学生信息
SELECT * FROM students s1 WHERE height >= 
	(SELECT AVG(height) FROM students s2 WHERE s2.age = s1.age);
  • 执行步骤
    1.SELECT * FROM students
    2.SELECT AVG(height) FROM students s2 WHERE s2.age = s1.age,找到该年龄段的所有学生并求平均
    3.将该行学生的height 与2的结果进行比较,结束转入第二行重复上述步骤。

三、注意

3.1 中间表

中间产生的表需要重新命名才行

3.2 模糊查询

  • _匹配一个字符,汉字或者英文
  • %匹配多个字符
SELECT * FROM students WHERE NAME LIKE "__m"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值