1.MySQL的安装
2.SQL语句的分类
1.DQL:
查询语句 select
select version();
select database();
select *from …
desc …
1.简单查询
SQL语句不区分大小写。
取别名 select name dename,flag from …
select name ‘de name’,flag ‘标志’ from …
2.条件查询
select +查询内容
from + 具体数据库
where
sal between 2450 and 2500;
不等于:!= ,<>;
and 并且
例子:
select empno,ename,job
from emp
where job =‘SALESMAN’ and sal>810 ;
or 或者
例子:
查询工作岗位是manager或salesman的员工
select empno,ename,job
from emp
where job =‘manager’ or job =‘salesman’ ;
and 和or同时出现,and优先级大于or;
in 包含
in (800,5000);相对于枚举,不是范围
not in()
is null ,is not null
大于,小于,等于
like
例子:
找出含有0的
select ename
form emp
where ename like ‘%0%’;
‘%t’(t结尾d);‘k%’(k开头的);‘_a%’(第二个字母是a的);‘__h%’(第三个字母是h的);
3.排序
eg:
按薪资排序
select
ename sal
from
emp
order by
sal;// 默认升序
select
ename sal
from
emp
order by
sal desc;**// 降序* ;asc//升序;
薪资升序,若薪资一样再按名字升序排列
select
ename sal
from
emp0
(where
sal between 1250 and 3000)
order by
sal asc,ename asc;
关键字顺序不能变:
select …from … where …order by …
执行顺序 :
from,where,select,order by
4.数据处理函数/单行处理函数
- str_to_date 将字符串转换为日期
- data_format 格式化日期
- format 设置千分位
- round 四舍五入
- rand() 生成随机数
- ifnull 可以将null转换成一个具体值
5.分组函数(多行处理函数)
输入多行,最终输出一行
- 计数 count 找出不为null的个数
- 和 sum
- 平均 avg
- 最大值 max
- 最小值 min
先分组再执行。
输入顺序:
- select …
- form …
- where …
- group by …
- order by …
执行顺序
- form
- where
- group by
- select
- order by
6.分组查询
- 找出每个工作岗位的工资和?
select job,sum(sal)
from emp
group by job;
2.找出每个部门的最高薪资
select deptno ,max(sal) from emp group by deptno;
3.找出每个部门,每个工作岗位的最高薪资?
select deptno,job,max(sal) from emp group by deptno,job;
4.找出每个部门的最高薪资,显示最高薪资大于3000?
selcet deptno,max(sal) from emp where sal>3000 group by deptno;(效率高)
select deptno ,max(sal) from emp group by deptno having sal >3000;
5.找出每个部门的平均薪资,显示平均薪资大于2500?
(where无法使用的情况用having)
select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;
大总结输入和执行顺序
输入顺序
- select
- from
- where
- group by
- having
- order by
执行顺序
-
from
-
where
-
group by
-
having
-
select
-
order by
7.distinct关键词
去除重复的。distinct//(还有 可以用去重复)
select distinct job from emp;
select count(distinct job) from emp;
select job from emp group by job;
8.连接查询
- 单独查询概念:从一张表中单独查询,称为单表查询。
- emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept中取部门名字,这种叫连接查询。
- 连接查询分类:内连接和外连接,全连接(不重要)。
8.1内连接
-
等值查询
查询每个员工所在部门名称,显示员工名和部门名?
sql92语法:
select e.name,d.dname
from emp e,dept d
where e.deptno =d.deptno;
select e.name,d.name
from emp e,dept d
where e.deptno = d.deptno;
select e.name,d.dname
from emp e
join dept d
on e.name =d.name
sql99语法:
select e.name,d.dname
from emp e
(inner) join dept d
on e.deptno =d.deptno;
where …
-
非等值查询
找出每个员工的…sal,s.grade
from emp e join salgrade s
on e.sal between elosal and s.hisal;
-
自连接
查询员工的上级领导,要求显示员工名和对应的领导名?
8.2外连接
- 左连接
- 右连接
笛卡尔积现象
当两张表进行连接查询,没有任何条件限制下,最终查询结果条数是两张表的乘积。
eg:14*4=56
如何避免笛卡尔现象?加限制条件///where emp.deptno =dept.deptno;
select ename,dname
from emp ,dept
where emp.deptno =dept.deptno;
改进:select emp.ename,dept.dname
from emp ,dept
where emp.deptno =dept.deptno;
进一步优化:select e.ename,d.dname
from emp e ,dept d //起别名
where e.deptno =d.deptno;
降低表连接的次数
2.DML(事务语句):
对表中数据的增删改
insert updata delete
DML(数据操纵语言)用于在数据库中添加、更新或删除数据。
start transaction(事务)
事务
提交事务:commit
回滚事务:rollback;
事务特性
A:原子性
事务是最小工作单元
C:一致性
所以事务要求,同一个事务当中,所以操作必须同时成功,或者同时失败。
I:隔离性
A事务操作一张表时,B事务不能操作这张表
D:持久性
事务最终结束的一个保障。事务提交才把数据保存到指定位置
常用的 DML 命令:
-
INSERT:用于向表中插入新的行。
INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);
例如,将新员工的信息插入到名为
employees
的表中:INSERT INTO employees (name, age, salary) VALUES ('John Doe', 30, 5000);
-
UPDATE:用于更新表中现有行的数据。
UPDATE 表名 SET 列1 = 值1, 列2 = 值2, ... WHERE 条件;
例如,将 ID 为 1 的员工的薪资增加 10%,可以执行以下更新语句:
UPDATE employees SET salary = salary * 1.1 WHERE id = 1;
-
DELETE:用于从表中删除指定的行。
DELETE FROM 表名 WHERE 条件;
例如,删除名为 ‘John Doe’ 的员工信息:
DELETE FROM employees WHERE name = 'John Doe';。
3.DDL:
对表的结构进行修改
create 创建
drop 删除
alter 修改
DDL(数据定义语言)用于在数据库中创建、修改或删除数据库对象(如表、索引、视图等)。以下是常用的 DDL 命令:
-
CREATE:用于创建数据库对象。
-
创建表:
CREATE TABLE 表名 ( 列1 数据类型, 列2 数据类型, ... );
创建一个名为
employees
的表:CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50), age INT, salary DECIMAL(10,2) );
-
创建索引:
CREATE INDEX 索引名 ON 表名 (列1, 列2, ...);
为
employees
表的name
列创建索引:CREATE INDEX idx_name ON employees (name);
-
-
ALTER:用于修改数据库对象。
-
修改表结构(添加列、修改列类型等):
ALTER TABLE 表名 ADD COLUMN 列名 数据类型; ALTER TABLE 表名 MODIFY COLUMN 列名 新数据类型;
向
employees
表添加一个新的email
列:ALTER TABLE employees ADD COLUMN email VARCHAR(100);
-
修改表名:
ALTER TABLE 原表名 RENAME TO 新表名;
将
employees
表重命名为staff
:ALTER TABLE employees RENAME TO staff;
-
-
DROP:用于删除数据库对象。
-
删除表:
DROP TABLE 表名;
删除
employees
表:DROP TABLE employees;
-
删除索引:
DROP INDEX 索引名 ON 表名;
删除
employees
表的idx_name
索引:DROP INDEX idx_name ON employees;
-
4.TCL:
事务控制语言
事物提交:commit;
事物回滚:rollback;
5.DCL:
数据控制语言
授权 grant,撤销权限 revoke …
6.\c 命令终止
MySQL不见”;“不执行。
SQL语句不区分大小写。
取别名 select name dename,flag from …
select name ‘de name’,flag ‘标志’ from …
3.约束
非空 not null
独特 unique
主键 primary key
外键 foreign key
4.做题感悟
1.MySQL 中判断奇数的 6 种方法
mod(x, 2) = 1 ,如果余数是 1 就是奇数。
power(-1, x) = -1 , 如果结果是 -1 就是奇数
x % 2 = 1 ,如果余数是 1 就是奇数。
x & 1 = 1 ,如果是 1 就是奇数
- not in在使用时候,后面小括号中记得排除null
not in (select max(sal) ....)
select maxa(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null)
3.计算两个日期之间的时间差
timestampdiff(间隔类型,前一个日期,后一个日期)
datediff(后一个日期,前一个日期)///默认为结果为天
eg.
avg(timestampdiff(year,hiredate,now())
间隔类型
年year
季度 quarter
月mounth
星期 week
天day
时hour
分minute
秒second
目前时间
now()
curdate() 无小时分秒
curtime() 无年月日
4.if(a<100,0,1)
解释:如果a<100成立,则a为0
反之为1
5.between 0 and 6
包含边界