MySQL数据库-2

MySQL数据库-2

第09章子查询

#第09章子查询
SELECT last_name,salary
FROM employees
WHERE salary>(
		SELECT salary
		FROM employees
		WHERE last_name = 'Abel'
		);

#2.单行子查询

SELECT employee_id,manager_id,department_id
FROM employees
WHERE (manager_id,department_id)=(
					SELECT manager_id,department_id
					FROM employees
					WHERE employee_id=141
					)
AND employee_id<>141;


#3.多行子查询
#题目:返回其它job_id中比job_id为'IT_PROG'部门所有工资低的员工的员工号、
#姓名、job id以及salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary< ALL(
			SELECT salary
			FROM employees
			WHERE job_id='IT_PROG'
			);


#题目:查询平均工资最低的部门id
#MySQL中聚合函数是不能嵌套使用的。
#方式1
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)=(
			SELECT MIN(avg_sal)
			FROM(
				SELECT AVG(salary) avg_sal
				FROM employees
				GROUP BY department_id
				) t_dept
			);

#方式2
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)<=ALL(
			SELECT AVG(salary) avg_sal
			FROM employees
			GROUP BY department_id
			) 
		

6.相关子查询
#题目:查询员工中工资大于本部门平均工资的员工的last name,salary和其department id
SELECT last_name,salary,department_id
FROM employees e1
WHERE salary>(
		SELECT AVG(salary)
		FROM employees e2
		WHERE department_id=e1.department_id
		);
#from型的子查询:子查询是作为from的一部分,子查询要用(引起来,并且要给这个子查询取别名,把它当成一张“临时的虚拟的表”来使用。

#结论:在sELECT中,除了GROUP BY 和LIMIT之外,其他位置都可以声明子查询!

子查询的编写技巧(或步骤):

从里往外写o从外往里写
如何选择?

  • 如果子查询相对较简单,建议从外往里写。一旦子查询结构较复杂,则建议从里 往外写
  • 如果是相关子查询的话,通常都是从外往里写。

第10章_创建和管理表

#第10章_创建和管理表

#l.创建和管理数据库
CREATE DATABASE IF NOT EXISTS mytest1 CHARACTER SET 'utf8';

SHOW DATABASES;

#切换数据库
USE atguigudb;
#查看当前数据库中保存的数据表
SHOW TABLES

#查看当前使用的数据库
SELECT DATABASE()

#查看指定数据库下保存的数据表
SHOW TABLES FROM mysql;

#1.4册删除数据库
DROP DATABASE IF EXISTS mytest1;



#2.如何创建数据表
USE mytest1

CREATE TABLE IF NOT EXISTS myempl(#需要用户具备创建表的权限。
id INT, 
emp_name VARCHAR(15),#使用VARCHAR来定义字符串,必须在使用VARCHAR时指明其长度。
hire_date DATE
);


SELECT *
FROM myempl

#查看表结构
DESC myempl


#方式2:基于现有的表,同时导入数据
CREATE TABLE myemp2
AS
SELECT employee_id xxid, last_name xxName, salary
FROM employees;

SELECT *
FROM myemp2


#3.修改表
#3.1 添加一个字段
ALTER TABLE myempl
ADD salary DOUBLE(10,2);#默认添加到表中的最后一个字段的位置

DESC myempl

#3.2修改一个字段:数据类型、长度、默认值(略)
ALTER TABLE myempl
MODIFY emp_name VARCHAR(15) DEFAULT 'aaa';


#3.3重命名一个字段
ALTER TABLE myempl
CHANGE salary monthly_salary DOUBLE ( 10,2);


#3.4册除一个字段
ALTER TABLE myempl 
DROP COLUMN monthly_salary;


#4.重命名表
RENAME TABLE myempl
TO myempX

#5.册除表
#不光将表结构删除掉,同时表中的数据也删除掉,释放表空间
DROP TABLE IF EXISTS myempl2;

#6.清空表
#清空表,表示清空表中的所有数据,但是表结构保留。
TRUNCATE TABLE  myempl2

#7.DCL中COMMIT 和ROLLBACK
# CONMIT:提交数据。一旦执行cONMIT,则数据就被永久的保存在了数据库中,意味着数据不可以回滚。
# ROLLBACK:回滚数据。一旦执行ROLLBACK,则可以实现数据的回滚。回滚到最近的一次coNMIT之后。


#8.对比TRUNCATE TABLE 和DELETEFROM
#相同点:都可以实现对表中所有数据的删除,同时保留表结构。#不同点:
#TRUNCATE TABLE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。
#DELETE FROM:一旦执行此操作,表数据可以全部清除(不带wHBRE)。同时,数据是可以实现回滚


/*9. DDL和DML的说明
0DDL的操作一旦执行,就不可回滚。指令SET autocommit = FALSE对DDL操作失效。自动提交,不受操作影响

DML的操作默认情况,一旦执行,也是不可回滚的。但是,如果在执行DM之前,执行了
SET autocommit = FALSE,则执行的DML操作就可以实现回滚。
*/
#演示:DELETE FROM
COMMIT;

SELECT *
FROM myemp2;

SET autocommit=FALSE;

DELETE FROM myemp2;

ROLLBACK;


#9.测试MysQL8.0的新特性:DDL的原子化


第11章_数据处理之增删改

#第11章_数据处理之增删改

#0.创建表
CREATE TABLE IF NOT EXISTS emp1(
id INT,
`name` VARCHAR(15),
hire_date DATE,
salary DOUBLE(10,2)
);
DESC emp1;

SELECT *
FROM emp1;

#l.添加数据
#方式l:一条一条的添加数据

#o没有指明添加的字段
INSERT INTO emp1
VALUES (1,'tom','2000-12-21',3400);#注意:一定要按照声明的字段的先后顺序添加

#o指明要添加的字段(推荐)
INSERT INTO emp1(id,hire_date,salary,`name`)
VALUES(2,'1999-09-9',4000,'Jerry');
#说明:没有进行赋值的hire_date 的值为null

#o同时插入多条记录
INSERT INTO emp1 (id,`name`,salary)
VALUES
(3,'张俊杰',5500) ,
(4, 'Jim' ,5000) ;


#方式2:将查询结果插入到表中

INSERT INTO emp1(id,hire_date,salary,`name`)
#查询语句
SELECT employee_id,hire_date,salary,last_name#查询的字段一定要与添加到的表的字段一一对应
FROM  employees
WHERE department_id IN(60,70);

#说明: empl表中要添加数据的字段的长度不能低于employees表中查询的字段的长度。
#如果empi表中要添加数据的字段的长度低于employees表中查询的字段的长度的话,就有添加不成功的风险

SELECT *
FROM emp1;


#2.更新数据(或修改数据)
#UPDATE .... SET .... WHERE...
#可以实现批量修改数据的。

UPDATE emp1
SET hire_date=CURDATE()
WHERE id=3;

#同时修改一条数据的多个字段
UPDATE emp1
SET hire_date=CURDATE(),salary=9000
WHERE id=4;

#在删除数据时,也有可能因为约束的影响,导致删除失败

#小结:DML操作默认情况下,执行完以后都会自动提交数据。
#如果希望执行完以后不自动提交数据,则需要使用SET autocommit = FALSE.



#4。MySQL8的新特性:计算列
CREATE TABLE test2(
a INT,
b INT,
c INT generated always AS(a+b) VIRTUAL #字段c即为计算列
);

INSERT INTO test2(a,b)
VALUE(10,20);

SELECT * FROM test2;

UPDATE test2
SET a=100;


60-整型数据类型讲解

f3 INT(5) ZEROFILL

0 显示宽度为5。当insert的值不足5位时,使用o填充。o当使用zEROFILL时,自动会添加UNSIGNED

fl INT UNSIGNED

无符号,不包括负数,正数变多

存在四舍五入

此时+0以后,可以以十进制的方式显示数据


第13章_约束

#第13章_约束
/*1.2什么叫约束? 对表中i字段的限制。
1.3 约束的分类:
角度l:约束的字段的个数
单列约束vs多列约束角度

2:约束的作用范围
列级约束:将此约束声明在对应字段的后面
表级约束:在表中所有字段都声明完,在所有字段的后面声明的约束

角度3:约束的作用(或功能)
not null (非空约束)
unique(唯一性约束)
primary key (主键约束)
foreign key (外键约束)
check(检查约束)
default (黑犬认值约束)

1.4如何添加/册除约束?
CREATE TABLE时添加约束
ALTER TABLE时增加约束、删除约束

*/


#3. not null (非空约束)
USE mytest1;

CREATE TABLE test1(
id INT NOT NULL,
last_name VARCHAR(15) NOT NULL,
email VARCHAR(25),
salary DECIMAL(10,2)
);

DROP TABLE test1

INSERT INTO test1
VALUES(1,'Toom','tom@66com' ,3455);
#错误
INSERT INTO test1
VALUES(2,NULL,'tom@66com' ,3455);

#3.3 在ALTERTABLE时册除约束
ALTER TABLE test1
MODIFY id INT NULL;

DESC test3

#4. unique(准一性约束)
CREATE TABLE test3(
id INT  NOT NULL,
last_name VARCHAR(15) ,
email VARCHAR(25) UNIQUE,
salary DECIMAL(10,2),
CONSTRAINT uk_test3_id UNIQUE(id)
);
#可以向声明为unique的字段上添加null值。而且可以多次添加null
INSERT INTO test3
VALUES(1,'Toom','tom@66com' ,3455);

SELECT *
FROM test3
INSERT INTO test3
VALUES(1,'Toom1','tom@661com' ,13455);

#4.3复合的唯一性约束
CREATE TABLE USER(
id INT,
`name` VARCHAR(15),
`password` VARCHAR(15),
#表级约束
CONSTRAINT uk_user_name_pwd UNIQUE(`name`,`password`)
);

#如何删除唯一性索引
ALTER TABLE USER
DROP INDEX uk_user_name_pwd 


#5. primary key (主键约束)
#—一个表中只能有一个主键约束。
#主键约束特征:非空且唯一,用于唯一的标识表中的一条记录。
#6.自增长列:AUTO INCREMENT

CREATE TABLE test4(
id INT  PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(15) ,
email VARCHAR(25) UNIQUE,
salary DECIMAL(10,2)
);

#7.foreign key (外健约束)
#主表和从表;父表和子表
#o先创建主表
CREATE TABLE dept1(
dept_id INT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(15)
);
#o再创建从表
CREATE TABLE emp1(
emp1_id INT PRIMARY KEY AUTO_INCREMENT,
emp1_name VARCHAR(15),
department_id INT,
#表级约束
CONSTRAINT fk_emp1_dept_id FOREIGN KEY (department_id) REFERENCES dept1 (dept_id)
);

INSERT INTO dept1
VALUE (NULL,'IT')

SELECT *
FROM dept1

INSERT INTO emp1
VALUE (NULL,'tom',1)

SELECT *
FROM emp1

#删除外键约束
ALTER TABLE empl
DROP FOREIGN KEY fk_empl_dept_id;

#8. check约束
#9.DEFAULT约束
CREATE TABLE test6(
id INT  DEFAULT 000,
last_name VARCHAR(15) ,
email VARCHAR(25) UNIQUE,
salary DECIMAL(10,2) CHECK(salary>2000)
);
DESC test6
posted @ 2023-12-22 16:09  新至所向  阅读(38)  评论(0)    收藏  举报