– 添加一张表,快速添加,结构跟t_student一样,数据么有;
create table t_student_3
as
select * from t_student where 1=2;
– 快速添加,只要部分列,部分数据
create table t_student_4
as
select sno,sname from t_student where sno=2;
然后向表中插如一些数据以供我们学习和操作!(以下操作属于DML)
– DML
– 在t_student 表中插入数据
– 整型数据超出位数,系统会自动补全
insert into t_student values (1,‘张三’,‘男’,18,‘2022-5-8’,‘软件一班’,‘123@126.com’);
insert into t_student values (1,‘张三’,‘男’,18,now(),‘软件一班’,‘123@126.com’);
insert into t_student values (4,‘张三’,‘男’,18,‘2022-5-8’,‘软件一班’,‘123@126.com’);
insert into t_student values (1,‘李四’,‘男’,18,now(),‘软件一班’,‘123@126.com’);
insert into t_student values (4,‘张三’,‘男’,18,now(),‘python一班’,‘123@126.com’);
insert into t_student values (6,‘张三’,‘男’,18,now(),‘python一班’,‘123@126.com’);
– 如果不是全字段插入数据的话,需要加入字段的名字
insert into t_student (sno,sname,enterdata) values (3,‘李四’,‘2021-7-5’);
– 修改表中数据
– 修改一整列
update t_student set sex = ‘女’;
– 修改确定的
update t_student set sex = ‘男’ where sno = 1;
– 表名,关键字,字段,内容不区分大小写
UPDATE T_STUDENT SET AGE = 20 WHERE SNO = 1;
– 删除操作
– 全表删除
delete from t_student;
– 加条件删除
delete from t_student where sno = 1;
然后我们进行对表进行删除和修改(注意:对表进行删除和修改属于DDL操作,对表中数据进行删除和修改属于DML操作)。
– 查看数据
select * from t_student;
– 修改表的结构
– DDL
/*
(1)修改表名称
rename table 旧名称 to 新名称;
alter table 旧名称 rename 新名称;
(2)增加一个字段,即给某个表增加一列
alter table 表名称 add 【column】 字段名称 数据类型; #默认在最后
alter table 表名称 add 【column】 字段名称 数据类型 after 另一个字段名; #指定特定位置
alter table 表名称 add 【column】 字段名称 数据类型 first; – 在最前面
(3)删除一个字段,即给某个表删除一列
alter table 表名称 drop 【column】 字段名称;
(4)修改字段的数据类型
alter table 表名称 modify 【column】 字段名称 数据类型;
(5)修改字段的名称
alter table 表名称 change 【column】 旧字段名称 新字段名称 数据类型;
(6)修改字段的位置
alter table 表名称 modify 【column】 字段名称 数据类型 after 另一个字段名; #指定特定位置
alter table 表名称 modify 【column】 字段名称 数据类型 first; – 放在最前面 */
– 修改表名称
rename table t_student to t;
alter table t rename t_student;
– 增加一列 add column
alter table t_student add sex char(2);
alter table t_student add score double(5,2); – 5,总位数 2,小数位数
update t_student set score = ‘123.5678’ where sno = 1;
– 增加一列(放在最前边)
alter table t_student add score double(5,2) first;
– 增加一列(放在sex后面)-- column 可以省略
alter table t_student add column score double(5,2) after sex;
– 删除一列 – drop column
alter table t_student drop column score; – column 可以省略
– 修改一列 – alter column + 新的列名+新的数据类型(在mysql中不能用该语法) mysql中用modify 和 change
alter table t_student modify column score float(4,1); #modify 修改的是列的类型的定义,但是不会改变列的名字 – column 可以省略
alter table t_student change column score scores double(5,1); # change改变列名和列的类型定义 – column 可以省略,score是旧的列名,scores是新的列名
– 删除表
drop table t_student – drop为DDL操作
– 删除数据:清空数据
truncate t_student; – truncate 属于DDL操作.即保留了这个表的结构,重新创建了这个表,效率高,隐式提交,不能回滚,自增从1开始
delete from t_student; – delete属于DML操作,一条一条的删除,效率低,但可以回滚,删除后自增依旧从以前按序号开始
– 效率drop>truncate>delete
这里只放两张照片,其他操作请自行验证!
1.1.1.表的完整性约束
数据库的数据完整性是指数据的正确性和数据的相容性。关系数据库的完整性可以分为实体完整性,参照完整性和用户自定义完整性。
实体完整性在创建表时用 primary key 定义,是指在基本表中主属性不能取空值,主键值不能重复。
参照完整性在创建表时用 foreign key 定义哪些列为外码,用 references 指明这些外码参照哪些表的主码。参照完整性是指在基本表中外码可以是空值或者另一个关系竹主码的有效值。
用户自定义完整性就是针对某一具体应用的数据必须满足的语义要求,包括属性上的约束条件和元组上的约束条件,主要有 not null, unique, check, default等。
1.1.1.1.非外建约束
将上面创建的t_student 表删掉,下面重新创建与插入数据:
创建表 – 用列级约束
– 创建表 – 用列级约束
– 表的完整性约束 , 非外建约束
create table t_student(
sno int(6) primary key auto_increment, – 主键约束与自增
– auto_increment 使得插入的sno自动从1递增,此时sno可以插入空值,如果没有auto_increment,则不能插入空值,因为主键不能为空
sname varchar(5) not null, – 非空约束
sex char(1) default ‘男’ check(sex=‘男’ || sex=‘女’) , – 默认约束与检查约束
age int(3) check(age>=18 && age<=50),
enterdata date,
classname varchar(10),
email varchar(15) unique – 唯一约束
);
select * from t_student;
insert into t_student values (1,‘张三’,‘男’,18,‘2021-9-3’,‘python-1班’,‘zs@126.com’);
insert into t_student (sname,age,enterdata,classname,email)values(‘李四’,18,‘2021-9-4’,‘python-1班’,‘ls@126.com’);
insert into t_student values (null,‘王五’,‘男’,19,‘2021-9-9’,‘python-1班’,‘wu@126.com’);
– email重复报错,但sno依然会自增,所以后面插入的不连续了
insert into t_student values (null,‘王五’,‘男’,19,‘2021-9-9’,‘python-1班’,‘wu@126.com’);
insert into t_student values (null,‘王六’,‘男’,19,‘2021-9-10’,‘python-1班’,‘wl@126.com’);
select * from t_student;
创建表 – 用表级约束
drop table t_student;
create table t_student(
sno int(6) auto_increment , – 列级约束
sname varchar(5) not null,
sex char(1) default ‘男’,
age int(3),
enterdata date,
classname varchar(10),
email varchar(15),
– 表级约束 – 并且为约束起别名
constraint pk_stu primary key (sno), – pk_stu 主键约束的名字
constraint ck_stu_sex check (sex=‘男’ || sex=‘女’),
constraint ck_stu_age check (age>=18 and age<=50),
constraint uq_stu_email unique (email)
);
select * from t_student;
insert into t_student values (1,‘张三’,‘男’,18,‘2021-9-3’,‘python-1班’,‘zs@126.com’);
insert into t_student (sname,age,enterdata,classname,email)values(‘李四’,18,‘2021-9-4’,‘python-1班’,‘ls@126.com’);
– 或者在表建成之后添加约束
alter table t_student add constraint pk_stu primary key (sno), – pk_stu 主键约束的名字
alter table t_student add constraint ck_stu_sex check (sex=‘男’ || sex=‘女’),
alter table t_student add constraint ck_stu_age check (age>=18 and age<=50),
alter table t_student add constraint uq_stu_email unique (email)
1.1.1.2.外建约束与外键策略
– 创建子表(学生表)
create table t_student(
sno int(6) primary key auto_increment, – 6,显示长度
sname varchar(5) not null,
classno int(4)
);
– 添加学生信息
insert into t_student values (null,‘张三’,1),(null,‘李四’,1),(null,‘王五’,3);
select * from t_student;
– 出现问题
– 1.添加一个学生对应班级编号为4
insert into t_student values (null,‘丽丽’,4);
– 2.删除班级2
delete from t_class where cno=2
– 出现问题的原因
– 外键约束未语法添加,只是逻辑上认为班级编号是外键,语法上未定义
– 解决办法,添加外键约束
– 注意:外键约束只有表级约束,没有列级约束
create table t_student(
sno int(6) primary key auto_increment, – 6,显示长度
sname varchar(5) not null,
classno int(4),
constraint fk_stu_classno foreign key (classno) references t_class (cno) – 外键约束
);
– 上面的两个错误信息已解决
– 添加学生信息
insert into t_student values (null,‘张三’,1),(null,‘李四’,1),(null,‘王五’,3);
– 删除班级1
delete from t_class where cno=1;
– 学生表删除
drop table t_student;
– 班级表删除
drop table t_class;
– 存在外键约束且约束未设置级联删除时要先删除主表t_student(子表),再删除从表t_class(父表)
create table t_class(
cno int(4) primary key auto_increment,
cname varchar(10) not null,
room char(4)
);
insert into t_class values (null,‘java001’,‘r803’),(null,‘java002’,‘r203’),(null,‘大数据001’,‘r416’);
select * from t_class;
– 创建子表(学生表)
create table t_student(
sno int(6) primary key auto_increment, – 6,显示长度
sname varchar(5) not null,
classno int(4),
constraint fk_stu_classno foreign key (classno) references t_class (cno) – 外键约束
);
– 添加学生信息
insert into t_student values (null,‘张三’,1),(null,‘李四’,2),(null,‘王五’,3);
select * from t_student;
– 直接删除班级2:如果直接删除的话不行,因为有外键约束
– 所以要加入外键策略
– 策略一:no action 不允许操作
– 可以先把班级2的学生班级改为null,然后删除班级2
update t_student set classno = null where classno=2;
delete from t_class where cno = 2;
– 策略二:cascade 级联操作:操作主表的时候影响从表的外键信息
– 删除外键
alter table t_student drop foreign key fk_stu_classno;
– 增加带有cascade的外键
alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class (cno) on update cascade on delete cascade;
– 更新操作:-- 班级3的学生的班级也会变为班级5,即t_student 表中的classno也会变成5
update t_class set cno = 5 where cno=3;
– 删除操作 – t_student 表中的classno=5的学生也会被删除
delete from t_class where cno=5;
– 策略三 :set null 置空操作
alter table t_student drop foreign key fk_stu_classno;
alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class (cno) on update set null on delete set null;
update t_class set cno = 8 where cno = 1;
– 注意:
– 1、策略二 级联操作 和 策略三 的置空操作可以混着使用
alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class (cno) on update cascade on delete set null;
下面是级联更新与级联删除的示例图片:
(一). 视图的概念:视图( view )是一个从单张或多张基础数据表或其他视图中构建出来的虚拟表。同基础表一样,视图中也包含了一系列带有名称的列和行数据,但是数据库中只是存放视图的定义,也就是动态检索数据的查询语句,而并不存放视图中的数据,这些数据依旧存放于构建视图的基础表中,只有当用户使用视图时才去数据库请求相对应的数据,即视图中的数据是在引用视图时动态生成的。因此视图中的数据依赖于构建视图的基础表,如果基本表中的数据发生了变化,视图中相应的数据也会跟着改变。
PS :视图本质上就是:一个查询语句,是一个虚拟的表,不存在的表,你查看视图,其实就是查看视图对应的 sql 语句。
(二). 视图的好处:简化用户操作:视图可以使用户将注意力集中在所关心地数据上,而不需要关心数据表的结构、与其他表的关联条件以及查询条件等。对机密数据提供安全保护,有了视图,就可在设计数据库应用系统时,对不同的用户定义不同的视图,避免机密数据(如,敏感字段“ salary ")出现在不应该看到这些数据的用户视图上。这样视图就自动提供了对机密数据的安全保护功能。
下面我们来实操:
先建立两张表并插入数据:
– dept(部门表)
create table DEPT(
DEPTNO int(2) not null,
DNAME VARCHAR (14),
LOC VARCHAR(13)
);
alter table DEPT add constraint PK_DEPT primary key(DEPTNO);
– empty(员工表)
create table EMP(
EMPNO int(4) primary key,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR int(4),
HIREDATE DATE,
SAL double(7,2),
COMM double(7,2),
DEPTNO int(2)
);
– 建立外键,将员工和部门联系起来
alter table EMP add constraint FK_DEPTNO foreign key (DEPTNO) references DEPT (DEPTNO);
– 向部门表中插入数据
insert into DEPT(DEPTNO,DNAME,LOC) values (10,‘ACCOUNTING’,‘NEW YORK’);
insert into DEPT(DEPTNO,DNAME,LOC) values (20,‘RESEARCH’, ‘DALLAS’);
insert into DEPT(DEPTNO,DNAME,LOC) values (30,‘SALES’, ‘CHICAGO’);
insert into DEPT(DEPTNO,DNAME,LOC) values (40,‘OPERATIONS’, ‘BOSTON’);
– 向员工表中插入数据
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,‘SMITH’,‘CLERK’,7902,‘1980-12-17’,800,null,20);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,‘ALLEN’,‘SALESMAN’,7698,‘1981-02-20’,1600,300,30);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,‘WARD’,‘SALESMAN’,7698,‘1981-02-22’,1250,500,30);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,‘JONES’,‘MANAGER’,7839,‘1981-04-02’,2957,null,20);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7782,‘CLARK’,‘MANAGER’,7566,‘1987-06-09’,2450,null,10);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7788,‘SCOTT’,‘ANALYST’,7566,‘1987-04-19’,3000,null,20);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7839,‘KING’,‘PRESIDNET’,null,‘1981-11-17’,5000,null,10);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7844,‘TURNER’,‘SALESMAN’,7698,‘1987-0419’,1500,0,30);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7876,‘ADAMS’,‘CLERK’,7788,‘1987-05-23’,1100,null,20);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7900,‘JAMES’,‘CLERK’,7698,‘1981-12-03’,5000,null,10);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7902,‘FORD’,‘ANALYST’,7566,‘1987-12-03’,950,null,30);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7934,‘MILLER’,‘CLERK’,7782,‘1982-01-23’,1300,null,10);
然后我们进行视图的练习
– 创建视图
– create [or replace ] view <视图名> [属性1,属性2,…] as select子句 [with check option];
– 1.创建单表视图
create view myview01
as
select empno,ename,job,deptno from emp
where deptno = 20;
– 等价于
create view myview01 (empno,ename,job,deptno) – 字段个数与select子句的字段个数要相同,属性名可以不同
as
select empno,ename,job,deptno from emp
where deptno = 20;
– 以上两个创建视图SQL对于创建同一名字相同的视图,一个SQL只可以运行一次,再次运行会报错视图已存在
– 使用下面方法可以修改创建视图的SQL,并替换旧视图
create or replace view myview01 – 这样这个sql就可以多次运行,修改视图只需要修改这个SQL,新视图会替换旧视图
as
select empno,ename,job,deptno from emp
where deptno = 20;
– 在视图中插入数据
– 我们建立视图的时候条件where deptno=20,所以插入dept=20的数据不会出错
insert into myview01 (empno,ename,job,deptno) values (22,‘lili’,‘clerk’,20);
insert into myview01 values (33,‘nana’,‘clerk’,20);
– 那么我们插入dept=30的数据语法上不会有错,但逻辑上我们是不允许插入成功的,而dept=30的这条数据确插入到了emp表中
insert into myview01 values (44,‘feifei’,‘clerk’,30);
select * from emp;
– 为了解决它,我们在建视图示时末尾加上with check option
– with check option 表示对视图进行update,delete,insert操作时都会检查是否满足试图定义时的谓词条件;
create or replace view myview01
as
select empno,ename,job,deptno from emp
where deptno = 20
with check option ; – 这样只有dept=20的数据才可以插进去
insert into myview01 values (44,‘feiei’,‘clerk’,30);
– 2.创建/替换多表视图
create or replace view myview02
as
select e.empno,e.ename,e.sal,d.deptno,d.dname
from emp e
join dept d
on e.deptno=d.deptno
where sal >2000
with check option;
– 注意
select e.empno,e.ename,e.sal,d.deptno,d.dname
from emp e
join dept d
on e.deptno=d.deptno
where sal >2000;
– 等价于
select e.empno,e.ename,e.sal,d.deptno,d.dname
from emp e, dept d
where e.deptno=d.deptno and sal >2000; – 在连接查询中有讲到,这种写法通用所有数据库
– 查看视图myview02
select * from myview02;
– 3.创建统计视图 – 带有聚集函数和groupby的叫分组视图,即这儿的统计视图
create or replace view myview03
as
select e.deptno,d.dname,avg(sal),min(sal),count(1)
from emp e join dept d
using(deptno) – 在连接查询中讲过,在mysql中using子句消除部分通名列,把你要消除的同名列放到using()括号中
group by e.deptno;
– 查看视图myview03
select * from myview03;
– 4.创建基于视图的视图
create or replace view myview04
as
select * from myview03 where deptno=20;
– 查看视图myview04
select * from myview04;
– 修改视图
alter view myview01
as
select * from emp where deptno = 20;
– 查看视图
SELECT * FROM myview01;
– 删除视图
drop view myview01;
下面贴部分照片
索引的介绍:索引是一种数据结构,例如B-Tree,这种数据结构是需要额外的写入和存储为代价来提高表上数据检索的速度。一旦建立了索引后,数据库中查询优化器使用索引来快速定位数据,然后就无需扫描表中给定查询的每一行了。
其中。当使用主键或唯一键创建表时,MySQL会自动创建名为PRIMARY的特殊索引, 该索引称为聚簇索引。PRIMARY索引是比较特殊的,这个索引本身与数据一起存储在同一个表中。另外除PRIMARY索引之外的其他索引称为二级索引或非聚簇索引。
(注意:通常,创建表的时候就能为表创建索引。但是要为列或一组列添加索引,可以使用 CREATE INDEX 索引名 ON 表名 <列名> 语句
– 通常,创建表的时候就能为表创建索引。 例如,以下语句创建一个新表,并创建了是由两列c2和c3组成的索引。
CREATE TABLE t(
c1 INT PRIMARY KEY,
c2 INT NOT NULL,
c3 INT NOT NULL,
c4 VARCHAR(10),
INDEX (c2,c3)
);
– 但是要为列或一组列添加索引,可以使用CREATE INDEX语句
#对t_student表的sno建立索引之前
– 我们要查看MySQL如何在内部执行此查询,可以在SELECT语句的开头添加EXPLAIN子句,
explain select * from t_student where sno = 6;
– 为之前的t_student表的sno字段添加名为index_1的索引
create index index_1 on t_student(sno);
– 等价于
alter table t_student add index index_1(sno);
– 修改索引
– 将t_student 表的 索引名index_1 改为 index_2
alter table t_student rename index index_1 to index_2;
– 删除索引
alter table t_student drop index index_2;
我们要查看MySQL如何在内部执行此查询,可以在SELECT语句的开头添加EXPLAIN子句,会得到下面的结果:
可以看到MySQL必须扫描包含7行的整个表,以查找sno = 7的人,当我们为这个表的sno字段建立索引之后,结果如下:
这时候看到,MySQL只需要在键列中指示的sno索引中找到1行而不扫描整个表,大大节省了时间。
事实上,关于索引的知识点还有很多(对于mysql我们自己创建索引不声明则默认为B_TREE类型索引),这里只写索引基础,感兴趣的同学可以自行去百度。
坚持住!!💗💗💗
==========================================================================
数据查询是数据库的核心操作,在这一块内容较多,主要的关键字有:select,where,group by, having, order by 等。
在学习这块内容之前,我们先创建四张比较经典的表,如下:
– 准备四张表:dept(部门表),empty(员工表),salgrade(薪资等级表),bonus(奖金表)
– dept(部门表)
create table DEPT(
DEPTNO int(2) not null,
DNAME VARCHAR (14),
LOC VARCHAR(13)
);
alter table DEPT add constraint PK_DEPT primary key(DEPTNO);
– empty(员工表)
create table EMP(
EMPNO int(4) primary key,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR int(4),
HIREDATE DATE,
SAL double(7,2),
COMM double(7,2),
DEPTNO int(2)
);
– 建立外键,将员工和部门联系起来
alter table EMP add constraint FK_DEPTNO foreign key (DEPTNO) references DEPT (DEPTNO);
– salgrade(薪资等级表)
create table SALGRADE(
GRADE int primary key,
LOSAL double(7,2),
HISAL double(7,2)
);
– bonus(奖金表)
CREATE TABLE bonus (
ENAME varchar(10) DEFAULT NULL,
JOB varchar(9) DEFAULT NULL,
SAL double(7,2) DEFAULT NULL,
COMM double(7,2) DEFAULT NULL
);
– 向三张表中插入数据
– 向部门表中插入数据
insert into DEPT(DEPTNO,DNAME,LOC) values (10,‘ACCOUNTING’,‘NEW YORK’);
insert into DEPT(DEPTNO,DNAME,LOC) values (20,‘RESEARCH’, ‘DALLAS’);
insert into DEPT(DEPTNO,DNAME,LOC) values (30,‘SALES’, ‘CHICAGO’);
insert into DEPT(DEPTNO,DNAME,LOC) values (40,‘OPERATIONS’, ‘BOSTON’);
– 向员工表中插入数据
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,‘SMITH’,‘CLERK’,7902,‘1980-12-17’,800,null,20);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,‘ALLEN’,‘SALESMAN’,7698,‘1981-02-20’,1600,300,30);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,‘WARD’,‘SALESMAN’,7698,‘1981-02-22’,1250,500,30);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,‘JONES’,‘MANAGER’,7839,‘1981-04-02’,2957,null,20);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7782,‘CLARK’,‘MANAGER’,7566,‘1987-06-09’,2450,null,10);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7788,‘SCOTT’,‘ANALYST’,7566,‘1987-04-19’,3000,null,20);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7839,‘KING’,‘PRESIDNET’,null,‘1981-11-17’,5000,null,10);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7844,‘TURNER’,‘SALESMAN’,7698,‘1987-0419’,1500,0,30);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7876,‘ADAMS’,‘CLERK’,7788,‘1987-05-23’,1100,null,20);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7900,‘JAMES’,‘CLERK’,7698,‘1981-12-03’,5000,null,10);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7902,‘FORD’,‘ANALYST’,7566,‘1987-12-03’,950,null,30);
insert into EMP(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7934,‘MILLER’,‘CLERK’,7782,‘1982-01-23’,1300,null,10);
– 向薪资表中插入数据
insert into SALGRADE (GRADE,LOSAL,HISAL) values (1,700,1200);
insert into SALGRADE (GRADE,LOSAL,HISAL) values (2,1201,1400);
insert into SALGRADE (GRADE,LOSAL,HISAL) values (3,1401,2000);
insert into SALGRADE (GRADE,LOSAL,HISAL) values (4,2001,3000);
insert into SALGRADE (GRADE,LOSAL,HISAL) values (5,3001,9999);
– 部门表 LOC-位置
select * from dept;
– 员工表 MGR-上级领导, COMM- 补助
select * from emp;
– 薪资表
select *from salgrade;
– 奖金表
select * from bonus;
– 对EMP 表查询
select * from emp;
– 显示部分列
select empno,ename,sal from emp;
– 显示部分行
select * from emp where sal>2000;
– 显示部分行部分列
select empno,ename,job,mgr from emp where sal>2000;
– 起别名
select empno 员工编号,ename 姓名,sal 工资 from emp; – 省略as和引号
– as (alias)别名
select empno as 员工编号,ename as 姓名,sal as 工资 from emp;
– 在别名中有特殊符号时,引号不可省略
select empno as ‘员工 编号’,ename as “姓名”,sal as 工资 from emp;
– 算数运算符
select empno,ename,sal,sal+1000 as ‘涨新后’,deptno from emp where sal<2000;
select empno,ename,sal,comm,sal+comm from emp; – null + int = null
– 去重操作
select distinct job from emp;
select distinct job,deptno from emp;
– 排序
select * from emp order by sal; – 默认是升序
select * from emp order by sal asc; – asc 升序
select * from emp order by sal desc; – desc 降序
select * from emp order by sal,deptno desc; – 在工资升序的情况下,deptno按照降序排列
2.1.1.where 子句
– 查看emp表
select * from emp;
– where 子句 + 关系运算符
select * from emp where deptno = 10;
select * from emp where deptno > 10;
select * from emp where deptno >= 10;
select * from emp where deptno < 10;
select * from emp where deptno <= 10;
select * from emp where deptno <> 10; – <> 不等于
select * from emp where deptno != 10;
select * from emp where deptno = ‘CLERK’; – 默认情况下,不区分大小写
select * from emp where binary job = ‘clerk’; – binary 区分大小写
select * from emp where hiredate <‘1981-12-25’;
– where 子句 + 逻辑运算符
select * from emp where sal > 1500 and sal < 3000;
select * from emp where sal > 1500 && sal < 3000 order by sal;
select * from emp where sal between 1500 and 3000; – 闭区间
select * from emp where sal = 1500 or sal = 3000;
select * from emp where sal > 1500 || sal < 3000;
select * from emp where deptno in (10,20);
select * from emp where job in (‘MANAGER’,‘CLERK’,‘ANALYST’);
– where 子句 + 模糊查询
– 查询名字中带A的员工 --%代表任意多个字符,0,1,2···
select * from emp where ename like ‘%A%’;
select * from emp where ename like ‘_A%’; – _代表任意一个字符
select * from emp where ename like '_A%'; – 两个
– 查询名字中不带A的员工
select* from emp where ename not like ‘%A%’;
– 注意:如果查询的字符串中包含通配符%和_,这时就要使用escape '<换码字符>'对通配符进行转义
– 假设有个员工叫mit_b,查询这个员工的信息
–select * from emp where ename like ‘mit_b’ escape’';
– 关于 null 的判断
select * from emp where comm is null;
select * from emp where comm is not null;
– 小括号的使用 – and 的优先级别大于or
select * from emp where job = ‘SALESMAN’ or job = ‘CLERK’ and sal >=1500;
select * from emp where job = ‘SALESMAN’ or (job = ‘CLERK’ and sal >=1500);
select * from emp where (job = ‘SALESMAN’ or job = ‘CLERK’) and sal >=1500;
2.1.2.函数
– 函数的分类
– lower(ename),upper(ename); – 改变每一条结果,每一条数据对应一条结果 – 单行函数
– max(sal),min(sal),count(sal),sum(sal),avg(sal); – 多条数据,最终显示一个结果 – 多行函数
– 单行函数包含
– 1.字符串函数
select ename,length(ename),substring(ename,2,3) from emp;
– substring(),提供三个参数,第一个为列名,第二个为从第几个字符截取(下标从一开始),第三个参数为截取位数
– 2.数值函数
select abs(-5) as 绝对值 ,ceil(5.3) 向上取整,floor(5.9) 向下取整,round(3.14) 四舍五入 from dual; – dual 实际上是一个伪表
select abs(-5) as 绝对值 ,ceil(5.3) 向上取整,floor(5.9) 向下取整,round(3.14) 四舍五入; – 如果没有where条件,from dual 可以省略不写
select ceil(sal) from emp;
– 3.日期
select curdate(),curtime(); – curdate()年月日 – curtime()时分秒
select now(),sysdate(),sleep(3),now(),sysdate() from dual; – now()当前时间 – sysdate()函数执行时间
– 4.流程函数
– if 相关
select empno,ename,sal,if (sal >= 2500,‘高新’,‘低薪’) as ‘薪资等级’ from emp; – if -else 双分支结构
select empno,ename,sal,comm,sal+ifnull(comm,0) from emp; – 如果comm 为null,则comm取值为0 – 单分支结构
select nullif(1,1), nullif(1,2) from dual; – 如果value1等于value2,则返回null,否则返回1;
– case 相关
select empno,ename,job,
case job
when “CLERK” then “店员”
when “SALESMAN” then “销售”
when “MANAGER” then “经理”
else “其他”
end as ‘岗位’,
sal from emp;
– case 区间判断
select empno,ename,sal,
case sal
when sal<= 1000 then ‘A’
when sal<= 2000 then ‘B’
when sal<= 3000 then ‘C’
else ‘D’
end ‘工资等级’,
deptno from emp;
– 5.json 函数
– 6.其他函数
select database() ,user(),version() from dual;
– 多行函数(聚集函数) – 注意聚集函数只能放在select 或者group by的having子句后
select max(sal),min(sal),count(sal),sum(sal),sum(sal)/count(sal),avg(sal) from emp;
– 多行函数自动忽略null值;
select * from emp;
select max(comm),min(comm),count(comm),sum(comm),sum(comm)/count(comm),avg(comm) from emp;
– max(),min(),count()针对所有类型, sum(),avg()只针对数值类型有效
select max(ename),min(ename),count(ename),sum(ename),avg(ename) from emp;
– count() – 计数
– 统计表的记录数:方式一
select count(ename) from emp;
select count(*) from emp;
– 统计表的记录数:方式二
select 1 from dual; – dual 实际上是一个伪表
select 1 from emp;
select count(1) from emp;
2.1.3.分组group by 和 having
– 统计各个部门的平均工资;
select deptno,avg(sal) from emp; – 字段和多行函数不能同时使用,这要分组
select deptno,avg(sal) from emp group by deptno; – 字段和多行函数不能同时使用,除非这个字段属于分组
select deptno,avg(sal) from emp group by deptno order by deptno desc;
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
color_FFFFFF,t_70,g_se,x_16)
2.1.3.分组group by 和 having
– 统计各个部门的平均工资;
select deptno,avg(sal) from emp; – 字段和多行函数不能同时使用,这要分组
select deptno,avg(sal) from emp group by deptno; – 字段和多行函数不能同时使用,除非这个字段属于分组
select deptno,avg(sal) from emp group by deptno order by deptno desc;
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-uUUiXy8u-1715809995943)]
[外链图片转存中…(img-0Qb5Nfeb-1715809995944)]
[外链图片转存中…(img-bVT2P7RK-1715809995944)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!