MySQL基础

MySQL默认情况下在查询和操作数据库对象时,不区分大小写:

  1. 对于表名、列名和数据库名,MySQL不会区分大小写。例如,"mytable"、"MyTable"和"MYTABLE"都被视为相同的表名。

  2. 在SQL语句中,关键字和函数名不区分大小写。例如,"SELECT"、"select"和"Select"都是等效的。

  3. 在默认情况下,MySQL对于字符串比较是不区分大小写的。例如,"abc"和"ABC"被认为是相等的。

请注意,虽然MySQL不区分大小写,但在比较字符串时,它仍然遵循二进制字符集的规则。这意味着在某些字符集中,它可能会区分大小写(例如,对于拉丁字符集)。


DML(数据操作语言)

新增

指定列添加单行数据 VALUE

INSERT INTO staff(id,`code`,`name`,salary) VALUE
(2,'1002','李四',9000);

添加多行数据 VALUES

其中id为自动递增列,可以不指定:

INSERT INTO staff(code,name,salary) VALUES
('1003','王五',10000),
('1004','赵六',11000);

注:自动递增列递增的值在删除后不会回撤,也不会补齐,从该列和已记录的最大值继续递增

NOT NULL 的列必须指定数据:code列要求非空

也可以不指定列,但需要将全部列(包括自增列)指定数据

-- 可以不指定列,但是需要将全部列指定数据
INSERT INTO staff VALUE(6,'1006','杜甫',12000);

删除

删除表用 DROP

删除记录用 DELETE

-- 删除		delete
delete from staff where id=6

修改

修改/编辑 UPDATE

-- 修改/编辑	UPDATE
UPDATE staff set name='李清照' where id=5
UPDATE staff SET salary=salary+2000 WHERE name='赵六'

UPDATE staff SET name='苏轼',salary=salary-2000 WHERE id=4

清空表

delete from staff;   -- 删除掉每一行数据
TRUNCATE staff; 	 -- 清空表,数据量比较大的时候truncate快,性能更快一些

DQL(数据查询语言)

简单查询

查询 SELETE

不止可以查询表中数据,也可以查询获取一个常量,或调用返回一个方法的值,如当前时间:

查询表格:指定列名查询,也可以使用星号 * 指代所有的列

-- 指定列名查询
SELECT name,salary from staff
-- 可以使用*代替所有的列
SELECT * from staff

可以使用 AS 对列、方法结果、表、视图等指定别名

-- 使用as 指定别名,对列,方法结果,表,视图
SELECT name as `姓名` from staff

使用 WHERE 指定条件语句,   !=  和 <> 都是不等于

-- where 指定条件语句
SELECT * from staff where id=4
-- 不等于
SELECT * from staff WHERE id != 1
SELECT * from staff WHERE id <> 1
-- 大于小于
SELECT * from staff WHERE id > 3;
select * from staff WHERE id >=3;
select * from staff WHERE id < 4;
SELECT * from staff WHERE id <= 4;

对null值的判断:不可以直接用某个数据=null表示

-- 对null值的判断
#SELECT * from staff WHERE salary=null; --不可以
SELECT * from staff WHERE salary is null;
SELECT * FROM staff WHERE salary <=> null;    -- 等于null
SELECT * FROM staff WHERE salary is NOT null;

多条件判断 使用 AND OR

-- 多条件
SELECT * FROM staff WHERE id<5 AND salary>10000;
SELECT * FROM staff WHERE salary>10000 OR salary<9000;

某个值在不在...当中 IN...

-- in  not in 在不在...当中
#SELECT * FROM staff WHERE id=1 OR id=3...
SELECT * FROM staff WHERE id in(1,3,5,7,8,10,12);
SELECT * FROM staff WHERE id not in(1,3,5,7,8,10,12);

范围判断在...之间(包括边界值)BETWEEN ... AND...

-- BETWEEN AND 范围判断在..之间,包括边界
SELECT * FROM staff WHERE salary BETWEEN 8000 AND 10000;


模糊查询

模糊查询用 LIKE

%指代任意个数的字符, 下划线 _ 代表有且只有一个字符

-- 模糊查询	LIKE  %任意个数字符  _代表有且只有一个字符
SELECT * from staff where name LIKE '%李%';
-- 姓张的员工
SELECT * from staff where name LIKE '张%';
-- 张某
SELECT * from staff where name LIKE '张_';

是否存在 EXISTS

EXISTS 类似于一把锁,后面能查出结果,前面的语句才会给结果


 

SELECT * FROM staff WHERE 
EXISTS(SELECT * FROM staff WHERE id=1)

ANY 指任意一个数值

ALL 指全部数值

-- any all 
SELECT * from staff 
WHERE salary> ANY(SELECT code from staff)	-- 大于任意一个数值,不同类型另有比较规则

SELECT * from staff 
WHERE salary> ALL(SELECT code from staff)	-- 大于全部数值

当比较的前后类型不一致时可能另有比较规则而导致实际结果和理想结果有偏差


排序 ORDER BY

正序 ASC,倒序 DESC

注意,需要排序的每一列都需要单独指定排序方式,没指定则默认正序ASC

-- 排序 ORDER BY

SELECT * FROM staff ORDER BY salary
-- 正序 asc 倒序 DESC

SELECT * FROM staff ORDER BY salary ASC;

SELECT * FROM staff ORDER BY salary DESC;

SELECT * FROM staff ORDER BY salary ASC,code DESC;
-- 每一个列都需要指定排序顺序,没指定就默认asc
SELECT * FROM staff ORDER BY salary,code DESC;

拼接(合并)查询结果

UNION 会将重复的结果去除

UNION ALL 将完整结果全部合并,不会去重

-- 拼接(合并)查询结果
select name,salary FROM staff UNION
SELECT code,name FROM staff

-- UNION 会将重复的结果去除
select name,salary FROM staff UNION
SELECT name,salary FROM staff
-- UNION ALL 没有去重,全部合并
select name,salary FROM staff UNION ALL
SELECT name,salary FROM staff

去掉重复数据 DISTINCT 

-- 去重	对整个查询结果去重
SELECT DISTINCT salary,name FROM staff;

部分查询 LIMIT

-- 部分查询 LIMIT 3 查询前三名
SELECT * from staff ORDER BY salary DESC LIMIT 3;
-- 查询第三到五名	limit start,count
SELECT * FROM staff ORDER BY salary DESC LIMIT 2,3;

limit的取值类似于数组,跟一个参数3表示保留查询结果的前三个;

两个参数 2,3 表示,从下标为2的(第三个)数据开始,取三个数据。


在SQL语句中,CASE WHEN THEN是一种条件表达式,用于根据不同的条件返回不同的结果

可以使用AS为返回的结果起一个别名

-- case when THEN
SELECT * ,case
when salary<10000 then '薪资较低'
WHEN salary>=10000 and salary<=20000 then '薪资正常'
ELSE '薪资较高'
end as `LEVEL` from staff;

SELECT *,case salary when 12000 then '还行'
WHEN 15000 THEN '还可以'
WHEN 18000 then '挺高'
when 20000 then '哇哦'
when 26000 then '好厉害'
END as `level`
from  staff;

聚合函数

最大值MAX、最小值MIN、平均数AVG、求和SUM、个数COUNT

-- 分组 聚合函数
-- 最大值
SELECT MAX(salary) from staff;
-- 最小值
SELECT MIN(salary) FROM staff;
-- 平均数
SELECT AVG(salary) FROM staff;
-- 求和
SELECT SUM(salary) from staff;
-- 个数
SELECT COUNT(salary) FROM staff;

分组查询 GROUP BY

分组查询的 select 后面只能是分组的列以及聚合函数

-- 分组查询
-- SELECT 后面只能是分组的列以及聚合函数
SELECT department,AVG(salary) as 平均薪资,
SUM(salary) as 薪资总和 
FROM staff GROUP BY department;

分组筛选 HAVING

对分好的组在筛选出符合条件的组

-- 分组筛选
-- HAVING 对分组之后数据再筛选
SELECT department FROM staff GROUP BY department
HAVING AVG(salary)<12000;

使用列名传入聚合函数,当计算的数据中包含null值时,会直接把null值忽略,不计算在内。

传入星号* 和常量,则计算包括null值的整列所有数据

-- null值忽略
-- 列名忽略null
SELECT department,AVG(salary),COUNT(salary),COUNT(*) FROM staff GROUP BY department;
-- 用*和常量计算整列所有数据,包括null值
SELECT COUNT(*),count(1) FROM staff;


在SQL语句中,层层筛选的优先级逻辑是指按照特定的顺序和条件对数据进行筛选和过滤的规则。这些规则决定了SQL语句的执行顺序和筛选结果。

以下是SQL语句中层层筛选的优先级逻辑的一般规则:

  1. FROM子句:首先,根据FROM子句指定的表来确定查询的数据源。这是查询的基础,决定了可用的列和数据。

  2. WHERE子句:在FROM子句确定数据源后,WHERE子句将应用筛选条件。它过滤掉不符合条件的行,只保留满足条件的行

  3. GROUP BY子句:如果存在GROUP BY子句,数据会按照指定的列进行分组。这将影响聚合函数的计算和结果集的形式。

  4. HAVING子句:在GROUP BY子句确定分组后,HAVING子句将应用筛选条件。它过滤掉不符合条件的分组,只保留满足条件的分组

  5. SELECT子句:在所有筛选和聚合操作完成后,SELECT子句将指定要返回的列。它可以包含聚合函数,计算衍生列,指定别名等。

  6. ORDER BY子句:最后,ORDER BY子句将根据指定的列对结果进行排序,可以按升序或降序排列。


多表连查

所用数据库表内容参考:

 Mysql经典练习题50题icon-default.png?t=N7T8https://blog.csdn.net/original_recipe/article/details/91958663连接查询

分为外连接、内连接以及交叉连接

外连接1.左外连接    LEFT JOIN

-- 老师的姓名以及教授的课程
-- teacher tname 	course cname
-- teacher.tid=course.tid
SELECT tname,cname from teacher left JOIN 
course ON teacher.TId=course.TId;
-- as 起别名
SELECT a.Tname,b.Cname from teacher as a 
LEFT JOIN	-- 左表为主表
course as b on a.TId=b.TId;

              2.右外连接    RIGHT JOIN


              3.全外连接    FULL JOIN

左连接以左表为主表,会显示所有的数据,右表为附表,只会显示和主表有对应关系的数据;右连接相反全外连接mysql默认不支持,但可以通过合并查询UNION实现相同的效果。

内连接INNER JOIN    也可以直接简写成 JOIN,只显示有对应关系的数据

SELECT a.Tname,b.Cname from teacher as a 
INNER JOIN
course as b on a.TId=b.TId;

交叉连接 CROSS JOIN    会产生很大的数据量占用内存,尽量不要用

SELECT * FROM teacher a ,course b WHERE a.TId=b.TId

子查询

在增删改查的SQL语句中,包含的另一个查询语句叫做子查询。子查询可以当作一个表进行查询。

-- 子查询
SELECT sname FROM student WHERE sid in (
	SELECT sid FROM sc WHERE score<60
)
-- 将子查询当做表进行查询
SELECT sname from (SELECT * from student WHERE sid=01) as b 

练习:

1.查询学过「张三」老师授课的同学的信息

SELECT a.* from student as a LEFT JOIN
sc b on a.sid=b.sid
left JOIN course c on c.cid=b.CId
LEFT JOIN teacher d on c.tid=d.tid
WHERE d.tname='张三'

2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

SELECT a.sid,sname,b.avgs from student as a
join (SELECT sid,AVG(score) as avgs FROM sc GROUP BY sid HAVING avg(score)>=60) b on a.sid=b.sid 

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值