MySQL知识点总结

MySQL大纲

数据库概述

 数据库(DATA BASE)指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。

 数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。

 两者之间,两者与客户端,与表之间的关系如下图所示:

图中,MySQL即是前面提到的DBMS,负责对真实的数据库进行管理操作,DB中用来存放数据集合,包括表,视图等等。表中用来存放数据信息,以二维行列存储数据。行(row)在sql中称作一条记录也叫实体,列(column)在sql中称作字段。在以后的java访问书记库编程中,在java中定义变量来与字段对应。

SQL:Structure Query Language。(结构化查询语言)

          各数据库厂商都支持ISO的SQL标准。普通话

          各数据库厂商在标准的基础上做了自己的扩展。方言

SQL的分类:

DDL数据定义语言

用来定义数据库对象:库、表、列等。包括创建表,修改表,删除表

DML数据操作语言 用来定义数据库记录:是对表中数据的操作。包括插入,更新,删除数据
DCL数控制语言 用来定义访问权限和安全级别
DQL数据查询语言 用来查询记录(数据):只有SELECT语句

*SQL语句以英文分号结尾。

DDL(包括:CREATE,ALTER,DROP关键字)

DDL操作数据库

  • 创建数据库

CREATE DATABASE 数据库名; -- 创建数据库

CREATE DATABASE 数据库名 SET GBK; -- 创建数据库并设置为gbk编码格式

CREATE DATABASE 数据库名 SET GBK COLLATE gbk_chinede_ci; -- 创建一个使用gbk字符集,并带校对规则的数据库

  • 查询数据库

SHOW DATABASES; -- 查看当前数据库服务器中的所有数据库

SHOW CREATE DATABASE 数据库名; --查看创建数据库时的定义信息

  • 删除数据库

DROP DATABASE 数据库名; -- 删除指定数据库

  • 修改数据库

       ALTER DATABASE 数据库名 CHARACTER SET utf8; -- 将数据库的字符集改为utf8

在创建表格之前需要先选择表格创建的数据库,所以需要选择数据库:

USE 数据库名; -- 使用数据库

SELECT DATABASE(); -- 选中数据库

DDL操作数据表

创建数据表

语法: CREATE TABLE 表名(

字段1  字段类型,

字段2  字段类型,

...

字段n  字段类型

);

常用数据类型:

                     int:整型

                     double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;

                     char:固定长度字符串类型; char(10)  'abc       '

                     varchar:可变长度字符串类型;varchar(10) 'abc'

                     text:字符串类型;

                     blob:字节类型;

                     date:日期类型,格式为:yyyy-MM-dd;

                     time:时间类型,格式为:hh:mm:ss

                     timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss  会自动赋值

                     datetime:日期时间类型 yyyy-MM-dd hh:mm:ss

基本操作(假设操作表employee)
显示当前数据库中所有表

SHOW TABLES;

查看表的字段信息 DESC employee;

在表中插入一个image列,此列为字节类型

*插入列的时必须指定列的类型

ALTER TABLE employee ADD image BOLB;

修改job列,使其长度为60

ALTER TABLE employee MODIFY job VARCHAR(60);

删除image列,一次只能删一列

ALTER TABLE employee DROP image;

表名改为user

RENAME TABLE employee TO user;

查看表格的创建细节      

SHOW CREATE TABLE employee;

修改表的字符集为gbk

ALTER TABLE employee CHARACTER SET GBK;

列名name修改为username

ALTER TABLE employee CHANGE name username VARCHAR(100);

删除表

DROP TABLE emoloyee;

 DML(包括INSERT,DELETE,UPDATE关键字)

 DML是对表中的数据进行增、删、改的操作

INSERT增加操作:

插入一条记录的语法:

INSERT INTO 表名(字段1,字段2,...) VALUES(值1,值2,...);

插入操作中要注意:字段和值要一一对应,字段相当java中的形参,值相当于实参,值数可以少于字段数,但不能多。插入空值使用null。插入字符串和日期需要使用单引号括起来。

这是一个INSERT插入的Demo:

-- 创建emp表格
CREATE TABLE emp(
id INT,
NAME VARCHAR(100),
gender VARCHAR(10),
birthday DATE,
salary FLOAT(10,2),
entry_date DATE,
RESUME TEXT
);

-- 插入3条记录
INSERT INTO emp(id,NAME,gender,birthday,salary,entry_date,RESUME)
VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');

INSERT INTO emp(id,NAME,gender,birthday,salary,entry_date,RESUME)
VALUES(2,'lisi','male','1995-5-10',10000,'2015-5-5','good boy');

INSERT INTO emp(id,NAME,gender,birthday,salary,entry_date,RESUME)
VALUES(3,'wangwu','male','1995-5-10',10000,'2015-5-5','good boy');

SELECT *FROM emp;

 上面使用的是单条插入,下面使用批量插入继续插入如下内容:

INSERT INTO emp VALUES
(4,'zs','m','2015-09-01',10000,'2015-09-01',NULL),
(5,'li','m','2015-09-01',10000,'2015-09-01',NULL),
(6,'ww','m','2015-09-01',10000,'2015-09-01',NULL);

结果如下:

 UPDATE更新操作:

语法: UPDATE 表名 SET 列名1=列值1,列名2=列值2,... WHERE 列名=列值;

基本操作
将所有员工薪水修改为5000元 UPDATE emp SET salary=5000;
将姓名为’zs’的员工薪水修改为3000元 UPDATE emp SET salary=3000 WHERE name=zs;
将姓名为’aaa’的员工薪水修改为4000元,job改为ccc UPDATE emp SET salary=4000,job='ccc' WHERE name='aaa';

将wu的薪水在原有基础上增加1000元

*MySQL中没有+=运算符

UPDATE emp SET salary=salary+1000 WHERE name='wu';

 

DELETE删除操作:

语法:DELETE FROM 表名 (WHERE 列名=值);

基本操作(操作emp)
删除表中名称为‘zs’的记录 DELETE FROM emp WHERE name='zs';
删除表中所有记录 DELETE FROM emp;

使用TRUNCATE彻底删除表中记录

(不常用,太危险!)

TRUNCATE TABLE emp;

TRUNCATE操作与DELETE的不同在于:TRUNCATE删除操作是DROP掉数据表,然后重新创建新表,这样做的好处是执行速度快,不好的是删除的数据无法恢复;DELETE删除的是表中数据,表结构还在,数据可以找回。

DQL(SELECT关键字)

数据库执行DQL语句不会对数据进行改变,二十让数据库发送结果集给客户端。查询发挥的结果集是一张虚拟表。

基本语法: SELECT 列名 FROM 表名

语法:

SELECT selection_list /*要查询的列名称*/

  FROM table_list /*要查询的表名称*/

  WHERE condition /*行条件*/

  GROUP BY grouping_columns /*对结果分组*/

  HAVING condition /*分组后的行条件*/

  ORDER BY sorting_columns /*对结果分组*/

  LIMIT offset_start, row_count /*结果限定*/

 

 

给查询提供一张表:

1.基础查询

查询所有列

结果如上图↑

SELECT * FROM emp;

查询指定列

结果如下图↓

SELECT empno,ename FROM emp ;

2.条件查询

条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:

  1. =、!=、<>、<、<=、>、>=;
  2. BETWEEN…AND;
  3. IN(set);
  4. IS NULL; IS NOT NULL
  5. AND;
  6. OR;
  7. NOT;

 说明:

<>的作用与!=的作用完全相同,只是<>出现的比较早。

BETWEEN...AND 还可以查日期的范围

IN中的参数为查询范围,各值之间用逗号隔开

IS NULL 是进行非空判断,与之相对的是IS NOT NULL

3.模糊查询(LIKE)

模糊查询使用通配符补充模糊地方。通配符有两个:'_'表示一个任意字符,'%'表示任意多个字符。使用模糊查询需要用到关键字:LIKE。

举例:(比如我们要找的是s开头后面两位任意,第四位为0后面任意长度的学生姓名~)

SELECT * FROM emp WHERE sname LIKE 's__0%';

4.字段控制查询(DISTINCT)

比如我们要查emp表中sal,想了解一下员工的薪水档次都有那些,就不想看每个人的薪水,字段控制不要查询重复的薪水:

SELECT sal DISTINCT FROM emp;

 比如我们要查询每个员工的薪水与奖金之和,因为有的人补贴为null,所以简单加法运算得到的总和为null,所以需要用IFNULL(a,b),再给和起个别名叫total吧:

SELECT *,sal+IFNULL(comm,0) AS total FROM emp ;

就得到如下表:

 5.排序(ORDER BY)

ASC:升序(默认值)

DESC:降序

SELECT * FROM emp ORDER BY sal DESC,empno;-- sal按照升序排序,sal相同empno按照降序排序

6.分组查询

比如说我们需要按照部门来查询每个部门的工资和,就需要按照部门来分组。

子句:GROUP BY 

查询每个部门的编号,人数以及每个部门的工资和:

SELECT deptno,COUNT(*) num,SUM(sal) SUM FROM emp GROUP BY deptno ;

子句:HAVING    作用是分组后对数据进行过滤,区别于WHERE

查询工资总和大于9000的部门编号以及工资和:

SELECT deptno,SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal)>9000;

HAVING子句的作用是从分组的结果中进行筛选,筛掉了deptno 10。

聚合函数

聚合函数是用来做纵向运算的函数。

  1. COUNT():统计指定列不为NULL的记录行数;
  2. MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;(字典比较)
  3. MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;(字典比较)
  4. SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
  5. AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

 MySQL方言——LIMIT

LIMIT 用来限定查询结果的起始行以及总行数。

与编程语言相同,这里的起始行索引也是从0开始的。

从0行开始查询5行记录:

SELECT * FROM emp LIMIT 0,5;

查询结果:

应用:使用LIMIT限制结合java控制可以实现分页查询功能,将起始页和查询页数设为变量由java控制。

查询代码的书写顺序和执行顺序

查询语句的书写顺序:SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY-LIMIT

查询语句的执行顺序:FROM-WHERE-GROUP BY-HAVING-SELECT-ORDER BY-LIMIT

数据的完整性

作用:保证用户输入的数据保存到数据库中是正确的。

实现方法:在创建表时表中添加约束(也可以使用alter语句添加)。

完整性分类:

①实体完整性     ②域完整性     ③引用完整性

实体完整性

实体(entity):表中的一行(一条记录)。

主键的值不能为空或部分为空的约束条件称为实体完整性。实体完整性要求每一个表中的主键字段都不能为空或者重复的值。实体完整性指表中行的完整性。要求表中的所有行都有唯一的标识符,称为主关键字。主关键字是否可以修改,或整个列是否可以被删除,取决于主关键字与其他表之间要求的完整性。

作用:表示每一行数据不重复。

分类:主键约束(PRIMARY KEY) 唯一约束(UNIQUE) 自动增长列(AUTO-INCREMENT)

一个列表可以有多个约束,约束之间用空格隔开。

PRIMARY KEY主键约束:数据唯一(数据不能重复),且不能为null

一个表中只能有一个PK约束,联合PK约束算是一个PK约束。

主键约束的格式:[CONSTRAINT <约束名>] PRIMARY KEY [字段名]

方式一:

CREATE TABLE student(
sid INT PRIMARY KEY,
sname VARCHAR(20)
);

方式二:这种方式的优点在于可以创建联合主键——同时参照所有主键,都完全相同视为数据不唯一,所有键联合为一个主键。

-- 创建单主键表
CREATE TABLE student1(
sid INT,
sname VARCHAR(20),
PRIMARY KEY(sid)
);
-- 创建联合主键表
CREATE TABLE student1_1(
sid INT,
sname VARCHAR(20),
score DOUBLE,
PRIMARY KEY(sid,score)
);

方式三:这种方式的优点是可以给已经存在的表添加主键且可以添加联合主键

-- 在表格外部给表添加单主键
CREATE TABLE student2(
sid INT,
classid INT,
sname VARCHAR(20)
);
ALTER TABLE student2 ADD CONSTRAINT PRIMARY KEY(sid);
-- 在表格外部给表格添加联合主键
CREATE TABLE student2_1(
sid INT,
classid INT,
sname VARCHAR(20)
);
ALTER TABLE student2_1 ADD PRIMARY KEY(sid,classid);
--CONSTRAINT 关键字可以省略

三种方式的视图模式:

 UNIQUE唯一约束:数据唯一,可以有null

唯一约束在MySQL中可以有多个null(可以看成bug了),在ORACLE中只能有一个null,否则报错。

创建UNQUE约束的方法:

CREATE TABLE student3(
sid INT ,
sname VARCHAR(20) UNIQUE
);
CREATE TABLE student3_1(
sid INT ,
sname VARCHAR(20) UNIQUE,
sage VARCHAR(5) UNIQUE
);
CREATE TABLE student3_2(
sid INT ,
sname VARCHAR(20),
sage VARCHAR(5)
);
ALTER TABLE student3_2 ADD UNIQUE (sname);

目前不知道怎么用方法三创建多个唯一约束键,后面知道了补上。

删除唯一约束的方法:

ALTER TABLE student3_2 DROP INDEX sname; -- 这样可以删除sname作为的唯一约束

AUTO-INCREMENT自动增长列

sqlserver数据库 (identity)  oracle数据库( sequence)

自动增长列的约束是用来给添加自动增加(只针对整数)的。如果没有定义键使用AUTO-INCREMENT,会报出一下错误:

Incorrect table definition; there can be only one auto column and it must be defined as a key

CREATE TABLE student4(
sid INT UNIQUE AUTO_INCREMENT,
sname VARCHAR(20)
);
CREATE TABLE student4_1(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20)
);

只需要填入sname就行,sid会因为自动增长列的约束而自动添加。

需要注意的是:我们在插入数据的时候sid因为被自动增长约束而整数加加,那么,如果在插入记录的时候,如果删除了插入的记录,那么编号会继续随着删除的记录的号加加,不会因为删除记录而退回重新加加。

域完整性

 域完整性是针对某一具体关系数据库的约束条件,它保证表中某些列不能输入无效的值。域完整性指列的值域的完整性。如数据类型、格式、值域范围、是否允许空值等。

域完整性约束:数据类型   非空约束(NOT NULL)默认约束(DEFAULT) 检查约束(CHECK这个MySQL不支持)。

数据类型

数值类型,日期类型,字符串类型

非空约束NOT NULL

约束添加在一个字段的定义中,约束这个字段红不能有null。

默认值约束DEFAULT

约束添加在一个字段的定义中,约定这个字段的默认填充为DEFAULT 后的内容。后面在插入数据时,如果插入的值与默认值相同,那么值处填写DEFAULT,否则填写希望的值:

可以在创建表的时候直接给字段添加默认值,也可以在创建表后使用下面的方法:

ALTER TABLE USER ADD COLUMN gender CHAR(3) DEFAULT '男';

插入的值与默认值相同:

INSERT INTO USER 
VALUES(5,'高七','012','[email protected]','2000-5-1',DEFAULT);

插入值与默认值不同:

 

引用完整性(参照完整性)——外键约束

外键约束关键字: FOREIGN KEY

外键约用来在两个表之间建立连接,它可以是一列或者多列。一个表可以有一个或者多个外键。外键对应的是参照完整性,一个表的外键为空值,若不为空值,则每个外键值必须等于另一个表中主键的某个值。

外键:首先外键是表中的一个字段,可以不是本表的主键,但对应另外一个表的主键。外键的主要作用是保证数据引用完整性,定义外键后,不允许删除在另外一个表种的具有关联关系的行,外键的作用是保持数据的一致性,完整性。

主表(父表):相关联字段中,主键所在的表。

从表(字表):相关联字段种,外键所在的表。

语法:[CONSTRAINT <外键名>] FOREIGN KEY 字段名1 [,字段名2,...] REFERENCES <主键列1> [,主键列2,...]

一个主外键sid约束的Demo:

CREATE TABLE connStudent(
sid INT PRIMARY KEY,
sname VARCHAR(20),
sbirthday DATE
);
CREATE TABLE connScore(
id INT,
sid INT,
sscore DOUBLE,
CONSTRAINT fk_connScore_connStudent FOREIGN KEY(sid) REFERENCES connStudent(sid)
);

可以看到主表与从表的关系

第二种添加外键的方式:

ALTER TABLE connScore ADD CONSTRAINT fk_connStudent_connScore FOREIGN KEY(sid) REFERENCES connStudent(sid);

表与表的关系

表与表的关系有三种:一对一,一对多(多对一),多对多。在确定表与表的关系的时候需要确定主表和从表,依赖性更强的是从表,必须存在的是主表,这样就可以知道外键该设置在那个表中了。

以下部分关系引自https://www.cnblogs.com/abeam/p/7406285.html       写的很好,便于理解

一对一

Ø  一对一是将数据表“垂直切分”,其实是不常见,或不常用的。也就是 A 表的一条记录对应 B 表的一条记录,为什么要这样的设计呢,不是增加了程度的复杂性吗,然而并不一定,举例说明:

 

1)   一个系统必然有 Employee(员工表)(包含字段:EmployeeId、姓名、性别、年龄、电话、地址等),每个员工都为一个用户,所以还有张 User 表(包含字段:UserId(关联 EmployeeId)、用户名、密码、角色等),这样你会发现,整合为一张表是否不太妥当?因为,User 的记录只会在登录时用到,感觉有点违背三大范式中的“确保每列都和主键列直接关联,而不是间接关联”。

 

2)   还有种情况,这就要根据具体的业务来决定了。如果,当一张表的字段过于太多,而很多字段可能只有在某些情况下,才会使用到,这时也可以考虑使用一对一设计。

 

Ø  优点

1.   便于管理、可提高一定的查询速度

2.   减轻 CPU 的 IO 读写,提高存取效率。

3.   符合数据库设计的三大范式。

4.   符合关系性数据库的特性。

 

Ø  缺点

1.   增加一定的复杂程度,程序中的读写难度加大。

多表查询

 

合并结果集

合并结果集是将两个或多个列类型、列数对应的表进行拼接查询。关键字:UNION,UNION ALL。下面演示一个Demo以解释:

-- 为什么要拆表?

-- 在显示中有许多一对多的关系,比如一个学生可以有多个成绩,那么在一张表中做这样的关系会产生大量冗余,拆表后建立表间关系可以减少冗余。

CREATE DATABASE day02;
USE day02;
SELECT DATABASE();

CREATE TABLE a(
  NAME VARCHAR(20),
  score INT
);
CREATE TABLE b(
  NAME VARCHAR(20),
  score INT
);
INSERT INTO A VALUES('a',10),('b',20),('c',30);
INSERT INTO B VALUES('a',10),('b',20),('d',40);

-- 合并结果集去重
SELECT * FROM a 
UNION 
SELECT * FROM b;

-- 只合并不去重
SELECT * FROM a
UNION ALL
SELECT * FROM b;
-- 注意: 被合并的表的列名可以不同,但列数和类型必须相同!

结果:

连接查询

连接查询就是求出多个表的乘积,例如t1连接t2,那么查询出的结果就是t1*t2。

连接查询会产生笛卡尔积,假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。可以看到,虽然可以使用条件过滤去除无用数据,但是数据单表越大,笛卡尔积差生的无用数据就越多,影响速度。这根本不是开往优化数据库查询的车!至少我是这样想的,可是我一渣渣也没有什么解决办法,所以我们就使用条件过滤,哈哈哈哈哈哈嗝。

可以使用主外键作为条件来去除无用信息。

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno ;

这个查询会将两张表符合条件的记录全部都查询出来,因为两张表中难免有相同的,比如键就一定相同,还有我们可能不想查询表中的所有信息,那么我们可以将*换成我们想要查询的字段,字段格式必须是      表名.字段名

当然如果嫌弃表名太长,可以为表指定别名,格式为      表1名 [AS] 表1别名,表2名 [AS] 表2别名,...    。这样我们在使用应用列名的时候就可以使用别名。

SELECT e.ename,e.sal,e.comm,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno; 

内连接

上面的连接语句就是内连接,但它不是SQL标准中的查询方式,将上面内连接查询的语句使用SQL标准写为:

SELECT e.ename,e.sal,e.comm,d.dname FROM emp e INNER  JOIN dept d ON  e.deptno=d.deptno;

这里INNER 和 NO 关键字都是可以省略的。

内连接的特点:查询结果必须满足过滤条件。

外连接

外连接可以分为左连接右连接,两种连接方式大同小异,只是左连接按照条件查询时参照左边的表的值,右连接按照参照条件参照右边表的值。当两个表的查询条件都满足时,查询出来的结果与内连接相同;当查询只满足左边查询时,使用左查询可以查出表,右表部分使用null填充,使用右连接无法查询出这条记录;当查询只满足左边查询时道理相似。

例子来说明:表中emp表中“张三”这条记录中,部门编号为50,而dept表中不存在部门编号为50的记录,所以“张三”这条记录,不能满足e.deptno=d.deptno这条件。但在左连接中,因为emp表是左表,所以左表中的记录都会查询出来,即“张三”这条记录也会查出,但相应的右表部分显示NULL。

SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;

因为左表中没有40这个部门,所以没有查出deptno=40这条记录:

使用右连接:

SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno;

因为右表中没有50这个部门,所以没有查出deptno=50这条记录:

连接查询心得

连接不限与两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。

两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少有一个主外键条件,三张表连接至少有两个主外键条件

 自然连接

自然连接无需你去给出主外键等式,它会自动找到这一等式。找到这一等式需要两张连接的表中名称和类型完全一致的列作为条件,这样就可以被自然找到。

SELECT * FROM emp NATURAL JOIN dept; 
SELECT * FROM emp NATURAL LEFT JOIN dept; 
SELECT * FROM emp NATURAL RIGHT JOIN dept; 

 

子查询

一个select语句中包含另一个完整的select语句。

子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。

1.子查询出现的位置:

  • where后,作为条为被查询的一条件的一部分;
  • from后,作表;

2.当子查询出现在where后作为条件时,还可以使用如下关键字:

  • any
  • all

3.子查询结果集的形式:

  • 单行单列(用于条件)
  • 单行多列(用于条件)
  • 多行单列(用于条件)
  • 多行多列(用于表)

这里没有什么新的知识点,就是SELECT语句的嵌套练习,Demo:

CREATE TABLE emp(
	empno		INT,
	ename		VARCHAR(50),
	job		VARCHAR(50),
	mgr		INT,
	hiredate	DATE,
	sal		DECIMAL(7,2),
	comm		DECIMAL(7,2),
	deptno		INT
);
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);


CREATE TABLE dept(
	deptno		INT,
	dname		VARCHAR(14),
	loc		VARCHAR(13)
);
INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept VALUES(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept VALUES(30, 'SALES', 'CHICAGO');
INSERT INTO dept VALUES(40, 'OPERATIONS', 'BOSTON');



-- 查询JONES的工资
SELECT sal FROM emp WHERE ename="JONES";
-- 查询工资高于JONES的员工
SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename="JONES");
-- 查询与SCOTT同部门的员工
SELECT * FROM emp WHERE job IN (SELECT job FROM emp WHERE ename="SCOTT");
-- 工资高于30号部门的所有人的员工的信息
SELECT * FROM emp WHERE sal>(SELECT MAX(sal) FROM emp WHERE deptno=30);
-- 也可以这样写
SELECT * FROM emp WHERE sal>ALL(SELECT sal FROM emp WHERE deptno=30);
-- 查询工作和工资与MARTIN(马丁)完全相同的员工信息
SELECT * FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename="MARTIN");
-- 有2个以上直接下属的员工信息
SELECT * FROM emp WHERE empno IN (SELECT mgr FROM emp GROUP BY mgr HAVING COUNT(mgr)>=2);
-- 查询员工编号为7788的员工名称、员工工资、部门名称、部门地址
SELECT ename,sal,deptno FROM emp WHERE empno=7788;
-- 做内连接查询,将两张表主外键条件添加以去除无用笛卡尔积
-- step1
SELECT ename,sal FROM emp WHERE empno=7788;
-- step2
SELECT e.ename,e.sal,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno AND empno=7788;
-- step3查询dept表中dname和loc两列,因为deptno会被作为条件,用来去除无用笛卡尔积,所以需要查询它。
-- 这一步不是很懂
SELECT dname,loc,deptno FROM dept;
-- step4
SELECT e.ename,e.sal,d.dname,d.loc 
FROM emp e,(SELECT dname,loc,deptno FROM dept) d
WHERE e.deptno=d.deptno AND e.empno=7788;

-- 查询部门最高工资的员工的信息
SELECT deptno,MAX(sal) maxSal FROM emp GROUP BY deptno;
SELECT e1.* FROM emp e1,(SELECT deptno,MAX(sal) maxSal FROM emp GROUP BY deptno) e2 WHERE e1.sal=e2.maxSal AND e1.deptno=e2.deptno;

 MySQL中的函数

常用的函数有:

1. 字符串函数;主要用于处理字符串。

2. 数值函数;主要用于处理数字。

3. 日期和时间函数;主要用于处理日期和事件。

4. 系统信息函数;获取系统信息。

可以参照:https://www.cnblogs.com/xuyulin/p/5468102.html

也可以看MySQL的文档,个人局的数据处理功能大于等于javaSE中的函数。可以参考javaSE,当然使用时要多查文档。

MySQL数据库的备份与恢复

生成SQL脚本  导出数据

在控制台使用mysqldump命令可以用来生成指定数据库的脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创建数据库的语句!所以在恢复数据时,还需要自已手动创建一个数据库之后再去恢复数据。

  mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径

 

 

现在可以在C盘下找到mydb1.sql文件了!

注意,mysqldump命令是在Windows控制台下执行,无需登录mysql!!!

 

2 执行SQL脚本 恢复数据

前提:必须先创建数据库名

 

执行SQL脚本需要登录mysql,然后进入指定数据库,才可以执行SQL脚本!!!

执行SQL脚本不只是用来恢复数据库,也可以在平时编写SQL脚本,然后使用执行SQL 脚本来操作数据库!大家都知道,在黑屏下编写SQL语句时,就算发现了错误,可能也不能修改了。所以我建议大家使用脚本文件来编写SQL代码,然后执行之!

SOURCE C:\mydb1.sql

 

 

  注意,在执行脚本时需要先行核查当前数据库中的表是否与脚本文件中的语句有冲突!例如在脚本文件中存在create table a的语句,而当前数据库中已经存在了a表,那么就会出错!

 

还可以通过下面的方式来执行脚本文件:

mysql -uroot -proot mydb1<c:\mydb1.sql

mysql –u用户名 –p密码 数据库<要执行脚本文件路径

 

-proot中间没有空格,用空格就会出错。 

这种方式无需登录mysql

 

注意:在CMD命令不能加;

猜你喜欢

转载自blog.csdn.net/weixin_38930706/article/details/81157775