数据库(DATABASE DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户
或应用共享的数据集合。
简单点说就是;存储,维护和管理数据的集合。
数据库管理系统(DBMS):一种操作和管理数据库大型软件。
数据库是通过数据库管理系统创建和操作的。
数据库服务器,数据库和表的关系;
数据库服务器就是在机器上安装了一个数据库管理程序,这个程序可以管理多个数据库。
数据库会创建对个表来保存程序中实体的数据。
数据在数据库中的存储方式;
以表的形式存储。
表中的列叫字段,行叫一条记录。
一条记录对应一个java数据的对象。
SQL;结构化查询语言
主要功能就是同各种数据库建立联系,进行沟通。
SQL 分类;
1.DDL;数据定义语言,用来定义数据库对象:库,表,列等
关键字有 CREATE ALTER DROP
创建数据库;CREATE DATABASE mydb1;//创建数据库mydb1
CREATE DATABASE mydb2 CHARACTER SET gbk;//创建数据库mydb2,并且设置字符集为gbk
CREATE DATABASE mydb3 CHARACTER SET gbkCOLLATE gbk_chinese_ci;//创建数据库mydb3
,设置字符集为gbk,并且设置校对规则
查询;SHOW DATABASE; 查看当前数据库服务器中的所有数据库
SHOW CREATE DATABASE mydb2; 查看创建的数据库的定义信息
修改;ALTER DATABASE mydb2 CHARACTER SET utf8;把mydb2中的字符集修改为utf8
删除;DROP DATABASE mydb3;
其他;SELECT DATABASE(); 查看当前使用的数据库
USE mydb2;切换数据库
操作数据表;
常用的数据类型;
INT
DOUBLEDOUBLE(5,2)表示最多5位,其中必须有两位小数
CHAR固定长度的字符串类型
VARCHAR可变长度字符串类型
TEXT字符串类型
BLOB字节类型
DATE日期类型 yyyy--MM-dd
TIME时间类型 hh;mm;ss
DATETIME日期时间类型 yyyy-MM-dd hh;mm;ss
创建表:
CREATETABLE emp(
id INT,
NAME VARCHAR(50),
gender VARCHAR(10),
birthday DATE,
entry_date DATE,
job VARCHAR(50),
salary DOUBLE,
RESUME VARCHAR(200)
)
表的基本操作;
SHOWDATABASE; 查看当前数据库中所有表
DESCemp; 查看表的字段信息
ALTERTABLE emp ADD image BLOB; 在表上增加一列
ALTERTABLE emp MODIFY job VARCHAR(60); 修改job列,使其长度为60
ALTERTABLE emp DROP image; 删除image列一次只能删除一列
RENAMETABLE emp TO USER; 修改表名
SHOWCREATE TABLE USER;查看表格的创建细节
ALTERTABLE USER CHARACTER SET gbk; 修改表的字符集
ALTERTABLE USER changge NAME username VARCHAR(100); 修改列名
DROPTABLE USER; 删除表
2.DML;数据操作语言。是对表中的数据进行增删改的操作
关键字有; INSERT UPDATE DELETE
SELECT * FROM 表名; 查询表中中的所有数据
CREATE TABLE emp(
id INT,
NAME VARCHAR(50),
gender VARCHAR(10),
birthday DATE,
salary DOUBLE,
entry_date DATE,
RESUME VARCHAR(200)
)
INSERT ;
INSERT INTO emp(id,NAME,gender,birthday,salary,entry_date,RESUME)
VALUES(1,'zhangsan','male','1990-4-5',1000,'2015-1-2','good girl');
INSERT INTO emp VALUES(2,'lisi','male','1990-6-5',1000,'2015-1-2','goodgirl');
-- 批量插入
INSERT INTO emp VALUES
(3,'li','male','1990-6-5',1000,'2015-1-2','goodgirl'),
(4,'si','female','1990-6-5',1000,'2015-1-2',NULL),
(5,'lwang','female','1990-6-5',1000,'2015-1-2',NULL),
(6,'dashi','male','1990-6-5',1000,'2015-1-2','goodboy');
UPDATE ;
--将所有员工薪水修改为50000
UPDATEemp SET salary =5000;
--将姓名为li的员工薪水修改为50000
UPDATEemp SET salary =50000 WHERE NAME='li';
--将姓名为si的员工薪水修改为1000,resume改为girl
UPDATEemp SET salary=1000,RESUME='girl' WHERE NAME='si';
--将zhangsan的薪水在原有基础上增加1000
UPDATEemp SET salary=salary+1000 WHERE NAME='zhangsan';
DELETE:
--删除表中名称为'li'的数据
DELETEFROM emp WHERE NAME='li';
--删除表中所有数据
DELETEFROM emp;
--使用truncate 删除表中数据
TRUNCATETABLE emp;
DELETE:删除表中数据,表结构还在,删除后的数据可以找回
TRUNCATE;删除是把表直接DROP掉,然后再创建一个同样的新表。删除后的数据不能找回,执行速度比DELETE块
3.DQL;数据查询语言
查询返回的结果集是一张虚拟表
1).基础查询
--查询所有列
SELECT* FROM emp;
--查询指定列
SELECTNAME,gender FROM emp;
2).条件查询
条件查询就是砸在查询时,给出WHERE子句,在WHERE子句中使用如下关键字;
=、 !=、<>、<、<=、>、>=
BETWEEN AND
IN(SET);
ISNULL; IS NOT NULL;
AND;
OR;
NOT;
--查询性别为女,并且ID为4的记录
SELECT* FROM emp WHERE gender='female'AND id=4;
--查询生日为1994-04-05 ,或者name为lisi
SELECT* FROM emp WHERE birthday='1990-04-05'OR NAME='lisi';
--查询id 不是123的人
SELECT* FROM emp WHERE id NOT IN(1,2,3);
3).模糊查询
关键字 LIKE
通配符;_ 任意一个字符
%任意o-n个字符
--查询姓名由4个字母组成的学生姓名
SELECT* FROM emp WHERE NAME LIKE'____';
--查询姓名由4个字母组成,并且第四个字母为'i'
SELECT* FROM emp WHERE NAME LIKE'___i';
--查询姓名以'l'开头的学习学生记录
SELECT* FROM emp WHERE NAME LIKE 'l%';
--查询姓名中第二个字母为w的学生
SELECT * FROM emp WHERE NAME LIKE '_w%';
-- 查询姓名中包含'g'字母的学生记录·
SELECT * FROM emp WHERE NAME LIKE '%g%';
4).字段控制查询
-- 取除重复记录,
SELECT DISTINCT salary FROM emp;
-- 查看月薪与id之和,加上把null转换为数值0的函数
UPDATE emp SET salary=NULL WHERE NAME='si';
SELECT *,id+IFNULL(salary,0)FROM emp;
-- 给列名添加别名
SELECT *,id+IFNULL(salary,0)AS total FROM emp;
-- 也可以省略 as
SELECT *,id+IFNULL(salary,0) total FROM emp;
5).排序
ASC;升序排列,默认的
--查询所有学生记录,工资按升序排列
SELECT*FROM emp ORDER BY salary ASC;
DESC;降序排列
SELECT* FROM emp ORDER BY salary DESC;
--查询所有人,按照月薪降序排列,月薪相同,按照编号升序排列
SELECT* FROM emp ORDER BY salary DESC,id ASC;
6).聚合函数
用来做纵向运算的函数;
COUNT();统计指定列不为NULL的记录行数
MAX();计算指定列的最大值,如果指定列是字符串类型,使用字符串排序运算
MIN();计算指定列的最小值,如果指定列是字符串类型,使用字符串排序运算
SUM();计算指定列的数值和,如果指定列类型不是数值类型,计算值为0
AVG();计算指定列的平均值,如果指定列类型不是数值类型,计算值为0
--查看emp表中的行数(参照所有列)
SELECTCOUNT(*) FROM emp;
--查看emp表中的行数(参照salary列)
SELECTCOUNT(salary) FROM emp;
--查询emp表中有月薪的人数
SELECTCOUNT(salary) FROM emp;
--查看emp表中月薪大于5000的人数
SELECTCOUNT(*) FROM emp WHERE salary>5000;
--查询有salary和有resume的人数
SELECTCOUNT(salary),COUNT(RESUME) FROM emp;
--查询有salary以及有resume的人数
SELECTCOUNT(*)FROM emp WHERE salary IS NOT NULL AND RESUME IS NOT NULL;
--求所有人月薪和
SELECTSUM(salary) FROM emp;
--求所有人月薪和以及id 和
SELECTSUM(IFNULL(salary,0)),SUM(id)FROM emp;
--求所有人月薪加id和
SELECTSUM(IFNULL(salary,0)+id)FROM emp;
--统计所有人平均工资
SELECTAVG(salary)FROM emp;
--查询最大月薪和最小月薪
SELECTMAX(salary),MIN(salary) FROM emp;
7);分组查询
·关键字;GROUP BY
--表中男的人数和女的人数,就是根据gender来进行分组
SELECTCOUNT(*) FROM emp GROUP BY gender;
--如果里面有null值
SELECTCOUNT(*) FROM emp WHERE gender IS NOT NULL GROUP BY gender;
SELECTgender,COUNT(*) FROM emp GROUP BY gender;-- 凡和聚合函数同时出现的列命,一定要出现在groupby 之后
--查询id和每个人的月薪
SELECTid ,SUM(salary) FROM emp WHERE salary IS NOT NULL GROUP BY id;
--查询工资大于5000的人id以及工资
SELECTid, SUM(salary) FROM emp GROUP BY id HAVING SUM(salary)>5000;
HAVING 和 WHERE 的 区别 ;
1.having是在分组后对数据进行过滤
WHERE 是在分组前对数据进行过滤
2.having后面可以使用聚合函数(统计函数)
WHERE 后面不可以使用聚合函数
WHERE 是分组前的条件,如果某行记录不满足WHERE子句的条件,那么这行记录不会参加分组
HAVING 是对分组后数据的约束
8).LIMIT
用来限定查询结果的起始行,以及总行数
--查询3行记录,起始从0开始(也就是从第一行开始)
SELECT* FROM emp LIMIT 0,3;
--分页查询
INTcurrentPage=3;-- 当前页
INTpageSize=3; -- 每页显示的条数
SELECT* FROM emp LIMIT(currentPage-1)*pageSize,pageSize;
附加;
查询语句书写顺序;SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY-LIMIT
查询语句执行顺序;FROM-WHERE-GROUP BY-HAVING-SELECT-ORDER BY-LIMIT
数据的完整性;
作用;保证用户输入的数据保存在数据库中是正确的
确保数据的完整性也就是在创建表时给表中添加约束(类似于java中的泛型)
完整性的分类;
1.实体完整性
2.域完整性
3.引用完整性
1.实体完整性:
实体;表中的一行数据(一条记录)代表一个实体
实体完整性的作用;标识每一行数据不重复
约束类型;
1).主键约束(PRIMARYKEY)
2).唯一约束(UNIQUE)
3).自动增长列(AUTO_INCREMENT)
1).主键约束(PRIMARY KEY)
注;每个表里面要有一个主键
特点;数据唯一,且不能为NULL
第一种添加方式:
CREATE DATABASE day05;
USE day05;
CREATE TABLE student(
idINT PRIMARY KEY,
NAMEVARCHAR(50)
);
第二种添加方式;
CREATE TABLE student(
idINT,
NAMEVARCHAR(50),
PRIMARYKEY(id)
);
-- 上面这种方式可以形成联合主键
CREATE TABLE student(
idINT,
NAMEVARCHAR(50),
PRIMARYKEY(id,NAME)
);
第三种添加方式;
CREATE TABLE student(
idINT,
NAMEVARCHAR(50)
);
ALTER TABLE student ADD PRIMARY KEY(id);
2).唯一约束(UNIQUE)
-- 让他的姓名是唯一的
CREATE TABLE student(
idINT PRIMARY KEY,
NAMEVARCHAR(50) UNIQUE
);
3).自动增长列(AUTO_INCREMENT)
给主键添加自动增长的数值,列只能是整数类型,但是如果删除之前增长的序号,后面再添加的时候
序号不会重新开始,而是会接着被删除那一列的序号
CREATE TABLE student(
idINT PRIMARY KEY AUTO_INCREMENT,
NAMEVARCHAR(50) UNIQUE
);
2.域完整性
作用;限制此单元格的数据正确,不对照此列的其他单元格比较
域代表当前单元格
约束类型;1).数据类型 你设置一个INT,输入字符肯定就错了
2).非空约束(NOT NULL) 比如一个表中的姓名就是非空约束,没他不行
3).默认值约束(DEFAULT) 你不给值,它默认给你个值插入进去,你给值了,就是你设置的那个值
4).CHECK 约束(mysql不支持)CHECK(sex='男' OR sex='女')代表性别只能添加男或女
1).数据类型省略
2).非空约束(NOT NULL)
CREATE TABLE student(
idINT PRIMARY KEY AUTO_INCREMENT,
NAMEVARCHAR(50)UNIQUE NOT NULL
);
3).默认值约束(DEFAULT)
CREATE TABLE student(
idINT PRIMARY KEY AUTO_INCREMENT,
NAMEVARCHAR(50)NOT NULL UNIQUE,
adressVARCHAR(100) DEFAULT'北京'
);
INSERT INTO student (NAME)VALUES('ddd') ;
INSERT INTO student(NAME,adress)VALUES('dddrget',NULL); -- 会把null插入进来
INSERT INTO student(NAME,adress)VALUES('ddfsdg',DEFAULT);
INSERT INTO studentVALUES(NULL,'dfsdfsd',DEFAULT); --mysql中可以这样写
3.引用完整性(参照完整性)
-- 学生表
DROP TABLE student;
CREATE TABLE student(
studidVARCHAR(10) PRIMARY KEY,
stunameVARCHAR(50)
);
-- 分数表
DROP TABLE score;
CREATE TABLE score(
stuidVARCHAR(10),
scoreINT,
courseidINT
);
SELECT * FROM student;
INSERT INTO student VALUES('1001','撒贝宁');
INSERT INTO student VALUES('1002','畅旭阳');
INSERT INTO student VALUES('1003','周杰伦');
INSERT INTO student VALUES('1004','林俊杰');
SELECT * FROM score ;
INSERT INTO score VALUES('1001',98,1);
INSERT INTO score VALUES('1002',95,1);
INSERT INTO score VALUES('1002',67,2);
INSERT INTO score VALUES('1003',93,2);
INSERT INTO score VALUES('1003',57,3);
通过上面两个表可以看出,成绩表中的成绩可以通过stuid来查找到对应的学生姓名。
也就是以学生表作为主表,成绩表作为子表,子表参照主表。由于学生对应成绩,
所以学生表和成绩表之间肯定要有联系,不然你有成绩,没有学生对应,逻辑有问题。
这个联系就是外键约束。
--添加外键约束
CREATETABLE student(
sidINT PRIMARY KEY,
NAMEVARCHAR(50)NOT NULL
);
DROPTABLE score;
CREATETABLE score(
scoreDOUBLE,
sidINT,
CONSTRAINTfk_stu_score_sid FOREIGN KEY(sid) REFERENCES student (sid)
);
--第二种添加外键方式
CREATETABLE score(
scoreDOUBLE,
sidINT,
);
ALTERTABLE score ADD CONSTRAINT fk_stu_score_sid FOREIGN KEY(sid) REFERENCESstudent(sid);
4.表与表之间的关系
1).一对一:比如,qq登录的时候,只需要一个QQ密码和账号就可以了,也就是QQid和password,还需要设置一些QQ签名的一下东西,我们可以设置另外一张表,表名为QQDetail。
一个号码对应一个人的信息,如下图所示,我们可以将QQDetail中的qqid设置为主键,这样他就不能重复了。
CREATE TABLE QQ(
qqidINT PRIMARY KEY,
PASSWORDVARCHAR(50)
);
CREATE TABLE QQDetail(
qqidINT PRIMARY KEY,
NAMEVARCHAR(50),
addressVARCHAR(200)
);
ALTER TABLE QQDetail ADD CONSTRAINT fk_QQ_QQDetail_qqid FOREIGNKEY(qqid) REFERENCES QQ(qqid);
一对一最不常用,因为在这种情况下,完全可以把它合并在一个表中。
2).一对多(多对一);最为常见的就是一对多,一对多和多对一,这是从那个角度去看出来的。
3).多对多:一个学生可以有多个老师,而一个老师也可以有多个学生。
CREATE TABLE teacher(
tidINT PRIMARY KEY,
tnameVARCHAR(50)
);
CREATE TABLE stu2(
sidINT PRIMARY KEY,
snameVARCHAR(50)
);
CREATE TABLE tea_stu_rel(
tidINT,
sidINT
);
ALTER TABLE tea_stu_rel ADD CONSTRAINTfk_tid FOREIGN KEY(tid) REFERENCES teacher(tid);
ALTER TABLE tea_stu_rel ADD CONSTRAINT fk_sidFOREIGN KEY(sid) REFERENCES stu2(sid);
为什么要拆表?
如上表所示:为了存储一个人考了两个分数,出现了大量的重复数据。
多表查询(重要)
多表查询有如下几种:
1)合并结果集:UNION UNION ALL
2)连接查询:
内连接:INNER JOINON
外连接:OUTERJOIN ON
左外连接:LEFT[OUTER]JOIN
右外连接:RIGHT[OUTER]JOIN
全外连接:(mysql不支持)FULL JOIN
自然连接:NATURAL JOIN
3)子连接
1).合并结果集:
1.作用:把两个SELECT语句的查询结果合并的到一起。
2.合并结果集有两种方式:
UNION:去除重复查询
CREATETABLE A(
NAMEVARCHAR(50),
scoreINT
);
CREATETABLE B(
NAMEVARCHAR(50),
scoreINT
);
INSERTINTO A VALUES('a',10),('b',20),('c',30);
INSERTINTO B VALUES('a',10),('b',20),('d',40);
--合并结果集
SELECT* FROM A
UNION
SELECT* FROM B;
UNIONALL:不去除重复查询
SELECT * FROM A
UNIONALL
SELECT* FROM B;
3.要求:被合并的两个结果:列数、列类型必须相同
2).连接查询(非常重要)
连接查询就是求出多个表的乘积
SELECT* FROM A,B;
连接查询会产生笛卡尔积,假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0), (a,1), (a,2),(b,0),(b,1),(b,2) }。那么多表查询产生这样的结果,并不是我们想要的,那么怎么去除重复呢?我们可以通过关联关系去去除笛卡尔积。
SELECT * FROM A,B WHEREA.score=B.score;
内连接:
特点:查询结果必须满足条件。
SELECT* FROM A INNER JOIN B ON A.name=B.name;
外连接:
特点:查询出的结果存在不满足条件的可能
左连接:先查询左表,然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL
SELECT* FROM A LEFT OUTER JOIN B ON A.NAME=B.NAME;
右连接:先查询右表,然后查询左表,左表中满足条件的显示出来,不满足条件的显示NULL
SELECT* FROM A RIGHT OUTER JOIN B ON A.NAME=B.NAME;
自然连接:
大家也都知道,连接查询会产生无用笛卡尔积,我们通常使用主外键关系等式来去除他,而自然连接无需你给出
主外键等式,他会自动找到这一等式。
两张连接的表中名称和类型完全一致的列作为条件,会被自然连接找打到。
CREATE TABLE student1(
NAMEVARCHAR(30) PRIMARY KEY,
ageINT
);
CREATE TABLE score1(
NAMEVARCHAR(30) PRIMARY KEY,
scoreINT
);
INSERTINTO student1 VALUES('chang',19),('xu',20),('yang',21);
INSERTINTO score1 VALUES('chang',100),('xu',70),('yang',00);
ALTERTABLE score1 ADD CONSTRAINTfk_student1_score_name FOREIGN KEY(NAME) REFERENCES score1(NAME);
SELECT * FROM student1 NATURAL JOIN score1;
当然自然连接还有其他的查找条件的方式,按其他方式都可能存在问题。
SELECT * FROM student1 NATURAL left JOINscore1;
SELECT * FROM student1 NATURAL right JOINscore1;
子查询(非常重要)
一个select语句中包含一个完整的select语句。
子查询就是嵌套查询,如果一条语句中存在两个或者两个以上select,那么就是子查询。
子查询出现的位置:
where后,作为被查询的一条件的一部分
from后,作表
档子查询出现在where后面作为条件时,还可以使用如下关键字:
any
all
子查询结果集的形式:
单行单列(用于条件)
单行多列(用于条件)
多行单列(用于条件)
多行多列(用于表)
CREATE TABLE emp11(
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm DECIMAL(7,2),
deptno INT
) ;
INSERT INTO emp11VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp11VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp11VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp11VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp11VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp11VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp11 VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp11VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp11VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp11 VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp11VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp11VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp11VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp11VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
练习:
1.工资高于JONES的员工
分析:
查询条件:工资>JONES工资,其中JONES的工资需要一条子查询
第一步。查询JONES的工资
select sal froM emp11 where ename='JONES';
第二步。查询大于JONES的工资
select * from emp11 where sal>(SELECTsal FROM emp11 WHERE ename='JONES');
2.查询与SCOTT同一个部门的员工
子查询作为条件
子查询形式为单行单列
SELECT deptno FROM emp11 WHEREename='SCOTT';
SELECT * FROM emp11 WHERE deptno=(SELECTdeptno FROM emp11 WHERE ename='SCOTT');
3.工资高于30号部门所有人的员工信息
SELECT * FROM emp11 WHERE sal>(SELECTMAX(sal)FROM emp11 WHERE deptno=30 );
-- 查询30号部门所有人的工资
SELECT sal FROM emp11 WHERE deptno=30;
-- 查询高于30部门所有人工资的员工信息
SELECT * FROM emp11 WHERE sal>ALL(SELECTsal FROM emp11 WHERE deptno=30);
-- 子查询作为条件,子查询形式为多行单列
4.查询工作和工资与martin完全相同的员工信息
-- 查询出MARTIN的工作和工资
SELECT job,sal FROM emp11 WHEREename='MARTIN';
-- 查询出与他工作和工资相同的人
SELECT * FROM emp11 WHERE(job,sal)IN(SELECTjob,sal FROM emp11 WHERE ename='MARTIN');
5.有两个以上直接下属的员工信息
SELECT * FROM emp11 WHERE empno IN(SELECT mgrFROM emp11 GROUP BY mgr HAVING COUNT(mgr)>=2 );
6.自连接: 自己连接自己,起别名
求7369员工编号、姓名、经理编号和经理姓名
SELECT e1.empno,e1.ename,e2.mgr,e2.enameFROM emp11 e1,emp11 e2 WHERE e1.mgr=e2.empno AND e1.empno=7369;
7.查询员工编号为7788的员工名称、员工工资、部门名称、部门地址
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');
-- 去除多表,只查一张表,这里去除部门表,只查员工表
SELECT ename,sal FROM emp11 e WHEREempno=7788;
-- 让第一步与dept做内连接查询,添加主外键条件,去除无用笛卡尔积
SELECT e.ename,e.sal,d.dname,d.loc FROMemp11 e,dept d WHERE e.deptno=d.deptno AND empno=7788;
-- 第二步中的dept表表示所有行所有列的一张完整的表,这里可以把dept替换成所有行,但只有dname和loc列的表,这需要子查询
-- 查询dept表中dname和loc两列,因为deptno会被作为条件,用来去除无用笛卡尔积,所以需要查询他
SELECT dname ,loc,deptno FROM dept;
--替换第二步中的dept
SELECT e.ename,e.sal,d.dname,d.loc FROMemp11 e,(SELECT dname,loc,deptno FROM dept)d WHERE e.deptno=d.deptno ANDe.empno=7788;
MYSQL中的函数
Mysql数据库的备份与恢复
1. 生成sql脚本,导出数据
在控制台使用mysqldump命令可以生成值得ing数据库的脚本文件。
Mysqldump -u 用户名 –p密码 数据库名>生成的脚本文件路径
2. 执行sql,脚本恢复数据
在dos命令下登录数据库,然后选择指定数据库。
Source c:\mydb1.sql
还可以通过下面的方式执行脚本文件
Mysql –u 用户名–p 密码数据库< 要执行文件的脚本路径