目录
👌 棒棒有言:生活不可能一帆风顺,总会有波折,总会有险阻。生活是个爱开玩笑的孩子,也许今天给你所有,明天又会让你一无所有,无需烦恼,该来的总会来,再黑的夜晚也会有黎明到来的那一刻。不管生活有多么曲折,只要拥有幸福的态度就能挺过漫漫长夜,就能迎来美好的明天。
👌 本章简介:
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。
👍 作者:get棒棒给个关注呗
👍 重要:请给个关注哦!
一、数据库概述
数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可
以被各种用户或应用共享的数据集合。
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的
大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全
性和完整性。用户通过数据库管理系统访问数据库中的数据。
数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。
数据库:存储、维护和管理数据的集合。
二、MySQL数据库概述
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公
司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数
据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL 是开源的,目前隶属于 Oracle 旗下产品。
MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
MySQL 使用标准的 SQL 数据语言形式。
MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、
Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
MySQL 对 PHP 有很好的支持,PHP 是很适合用于 Web 程序开发。
MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持
4GB,64 位系统支持最大的表文件为8TB。
MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。
运行机制:
结构化查询语句分类:
DDL:数据定义语言,用来定义数据库对象:库、表、列等;
DML:数据操作语言,用来定义数据库记录(数据);
DCL:数据控制语言,用来定义访问权限和安全级别;
DQL:数据查询语言,用来查询记录(数据)。
============================================================
******重要
#创建数据库Java221803
CREATE DATABASE IF NOT EXISTS `Java221803`;
#创建表emp
CREATE TABLE `emp`(
`id` INT,
`name` VARCHAR(100),
`gender` VARCHAR(10),
`birthday` DATE,
`salary` FLOAT(10,2),
`entry_date` DATE,
`resume` TEXT
);
#插入数据语法
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,'你好','male','1995-5-10',10000,'2015-5-5','good boy');
INSERT INTO emp VALUES(4,'wangwu','male','1998-9-9',12500,'2022-3-4','very good');
#批量向表中插入多条数据
INSERT INTO emp
VALUES
(5,'wangwu','male','1998-9-9',12500,'2022-3-4','very good'),
(6,'wangwuer','male','1998-9-2',12500,'2022-3-4','very good'),
(7,'wangwusan','male','1998-11-9',12500,'2022-3-4','very good'),
(8,'wangwusi','male','1998-6-9',12500,'2022-3-4','very good');
#修改数据
UPDATE emp SET salary=15000;
UPDATE emp SET salary=18000 WHERE id=2;
UPDATE emp SET salary=salary+200 WHERE gender='male';
UPDATE emp SET gender='female',salary=15500 WHERE `name`='wangwu';
#删除数据
DELETE FROM emp;
DELETE FROM emp WHERE `name`='你好';
二.创建一个表并且插入数据
CREATE TABLE `stu` (
`sid` CHAR(6),
`sname` VARCHAR(50),
`age` INT,
`gender` VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
CREATE TABLE `emp1`(
`empno` INT,
`ename` VARCHAR(50),
`job` VARCHAR(50),
`mgr` INT,
`hiredate`DATE,
`sal` DECIMAL(7,2),
`comm` DECIMAL(7,2),
`deptno` INT
);
INSERT INTO emp1 VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp1 VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp1 VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp1 VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp1 VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp1 VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp1 VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp1 VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp1 VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp1 VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp1 VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp1 VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp1 VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp1 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');
#基础查询
#查询stu表中sid字段和sname字段
SELECT sid,sname FROM stu;
#查询stu表中sid字段、sname字段和age字段
SELECT sid,sname,age FROM stu;
#查询stu表中所有的字段信息
SELECT * FROM stu;
#===============================================================
#条件查询
#查询性别为女,并且年龄大于50的记录
SELECT * FROM stu WHERE gender='female' AND age>50;
#查询学号为S_1001,或者姓名为liSi的记录
SELECT * FROM stu WHERE sid='s_1001' OR sname='lisi';
#查询学号为S_1001,S_1002,S_1003的记录
SELECT * FROM stu WHERE sid='S_1001' OR sid='S_1002' OR sid='S_1003';
SELECT * FROM stu WHERE sid IN('S_1001','S_1002','S_1003');
#查询学号不是S_1001,S_1002,S_1003的记录
SELECT * FROM stu WHERE sid!='S_1001'AND sid!='S_1002' AND sid!='S_1003';
SELECT * FROM stu WHERE sid NOT IN('S_1001','S_1002','S_1003');
#查询年龄为null的记录
SELECT * FROM stu WHERE age IS NULL;
#查询年龄在20到40之间的学生记录
SELECT * FROM stu WHERE age>=20 AND age<=40;
SELECT * FROM stu WHERE age BETWEEN 20 AND 40;#between x and y 是包含x和y这两个值
#查询性别非男的学生记录
SELECT * FROM stu WHERE gender='female';
SELECT * FROM stu WHERE gender!='male';
SELECT * FROM stu WHERE gender<>'male';
SELECT * FROM stu WHERE NOT gender='male';#not 写在字段的前面
#查询姓名不为null的学生记录
SELECT * FROM stu WHERE NOT sname IS NULL;
SELECT * FROM stu WHERE sname IS NOT NULL;
#===========================================================
#模糊查询,使用关键字like来实现,搭配2个通配符,_表示任意一个字符,%表示任意0-n个字符
#查询姓名由5个字母构成的学生记录
SELECT * FROM stu WHERE sname LIKE '_____';
#查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE '____i';
#查询姓名以“z”开头的学生记录
SELECT * FROM stu WHERE sname LIKE 'z%';
#查询姓名中第2个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE '_i%';
#查询姓名中包含“a”字母的学生记录
SELECT * FROM stu WHERE sname LIKE '%a%';
#==========================================================
#字段控制查询
#去除重复记录DISTINCT
SELECT * FROM emp1;
#查询emp表中的薪水,相同的数据也会显示
SELECT sal FROM emp1;
#查询emp表中的薪水,去除重复数据
SELECT DISTINCT sal FROM emp1;
#=============================================================
#查看雇员的月薪与佣金之和
#一个数与null进行算术运算,结果为null,可以使用函数将null值转换为0
SELECT * ,sal+comm FROM emp1;
#ifnull(字段名,数据):使用函数ifnull来判断字段是否为null,如果字段为null,转换为指定的数据,如果字段不为null,不做转换,直接使用字段的值
SELECT * ,sal+IFNULL(comm,0) FROM emp1;
#给列名添加别名
SELECT *,sal+IFNULL(comm,0) AS '月薪和佣金之和' FROM emp1;
SELECT empno AS '员工编号',ename AS '员工姓名' FROM emp1;
#as可以省略不写
SELECT empno '员工编号',ename '员工姓名' FROM emp1;
#===========================================================
#排序,使用order by进行排序,升序ASC,默认排序方式,可以不写,降序DESC
#查询所有学生记录,按年龄升序排序
SELECT * FROM stu ORDER BY age ASC;
SELECT * FROM stu ORDER BY age;
#查询所有学生记录,按年龄降序排序
SELECT * FROM stu ORDER BY age DESC;
#查询所有雇员,按月薪降序排序,如果月薪相同时,按编号降序排序
SELECT * FROM emp1 ORDER BY sal DESC,empno DESC;
#==============================================================
#函数
#获取当前系统的时间
SELECT CURTIME();
SELECT TIMESTAMPDIFF(DAY,'2000-11-19','2022-10-18') AS '天数';
#聚合函数:用来进行纵向统计
#count():统计指定列不为NULL的记录行数;
#查询emp表中记录数
SELECT COUNT(*) AS '表中数据数量' FROM emp1;
#查询emp表中有佣金的人数:
SELECT COUNT(comm) FROM emp1;
SELECT comm FROM emp1 WHERE comm IS NOT NULL;
#查询emp表中月薪大于2500的人数
SELECT COUNT(*) AS '月薪大于2500的人数' FROM emp1 WHERE sal>2500;
#统计月薪与佣金之和大于2500元的人数
SELECT COUNT(*) FROM emp1 WHERE sal+IFNULL(comm,0)>2500;
#查询有佣金的人数,以及有领导的人数
SELECT COUNT(comm) AS '有佣金的人数',COUNT(mgr) AS '有领导的人数' FROM emp1;
#===================================================================
#SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
#AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
#查询所有雇员月薪和
SELECT SUM(sal) AS '所有雇员月薪和' FROM emp1;
#查询所有雇员月薪和,以及所有雇员佣金和
SELECT SUM(sal) AS '所有雇员月薪和',SUM(comm) AS '雇员佣金合' FROM emp1;
#查询所有雇员月薪+佣金和
SELECT SUM(sal+IFNULL(comm,0)) AS '所有雇员月薪+佣金和' FROM emp1;
#统计所有员工平均工资
SELECT AVG(sal) AS '所有员工平均工资' FROM emp1;
#MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
#MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
#查询最高工资和最低工资
SELECT MAX(sal) '最高工资' FROM emp1;
SELECT MIN(sal) '最低工资' FROM emp1;
#分组查询
#查询每个部门的部门编号和每个部门的工资和:
SELECT deptno ,SUM(sal) FROM emp1 GROUP BY deptno;
#查询每个部门的部门编号以及每个部门的人数:
SELECT deptno,COUNT(*) FROM emp1 GROUP BY deptno;
#查询每个部门的部门编号以及每个部门工资大于1500的人数:
SELECT deptno,COUNT(*) FROM emp1 WHERE sal>1500 GROUP BY deptno;
#====================================================
#HAVING子句
#查询工资总和大于9000的部门编号以及工资和:
SELECT deptno,SUM(sal) FROM emp1 GROUP BY deptno HAVING SUM(sal)>9000;
#LIMIT
#LIMIT用来限定查询结果的起始行,以及总行数。
#查询5行记录,起始行从0开始
SELECT * FROM emp1 LIMIT 0,2;
SELECT * FROM emp1 LIMIT 3,2;
SELECT * FROM emp1 LIMIT 5,2;
##创建tb1,并添加主键
CREATE TABLE `tb1`(
`id` INT PRIMARY KEY,
`name` VARCHAR(50)
)
CREATE TABLE `tb2`(
`id` INT ,
`name` VARCHAR(50),
PRIMARY KEY(id)
)
CREATE TABLE `tb3`(
`id` INT ,
`name` VARCHAR(50),
PRIMARY KEY(id ,NAME)
)
#创建tb4表完成后,添加主键
CREATE TABLE `tb4`(
`id` INT,
`name` VARCHAR(50)
);
ALTER TABLE tb4 ADD PRIMARY KEY(id);
#唯一约束unique:给字段添加了唯一约束后,该字段中的数据具有唯一性
CREATE TABLE `tb5`(
`id` INT PRIMARY KEY,
`name` VARCHAR(50) UNIQUE
);
#域完整性-非空约束 not null 就是不能为空
CREATE TABLE `tb6`(
`id` INT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL,
`sex` VARCHAR(10)
);
#引用完整性:一个表中某个字段的数据来源于另外一个表中某个字段的数据
#外键除了和主键的内容顺序不一样,其他的必须一样
CREATE TABLE `student`(
`sid` INT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL,
`sex` VARCHAR(10) DEFAULT '男'
);
CREATE TABLE `score`(
`id` INT,
`score` INT,
`sid` INT, -- 外键列的数据类型一定要与主键的类型一致
CONSTRAINT fk_score_sid FOREIGN KEY (sid) REFERENCES student(sid)
);
CREATE TABLE `score2`(
`id` INT,
`score` INT,
`sid` INT -- 外键列的数据类型一定要与主键的类型一致
);
ALTER TABLE score2 ADD CONSTRAINT fk_score2_sid FOREIGN KEY (sid) REFERENCES student(sid)
#1 合并结果集
#1.作用:合并结果集就是把两个select语句的查询结果合并到一起!
#2.合并结果集有两种方式:
#UNION:去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2;
#UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。
#3.要求:被合并的两个结果:列数、列类型必须相同
#合并结果集,去除重复记录
CREATE TABLE `t1`(
`a` INT,
`b` VARCHAR(4)
)
CREATE TABLE `t2`(
`c` INT,
`d` VARCHAR(4)
)
#必须一行全部一样才能去除重复记录
SELECT * FROM t1
UNION
SELECT * FROM t2
SELECT * FROM t1
UNION ALL
SELECT * FROM t2
#连接查询 (非常重要)
#连接查询:连接查询会产生笛卡尔积,从而产生一些不争取的记录,需要进行筛除
SELECT * FROM emp1,dept;
#如果两个表中有相同的字段,可以用来做筛除信息
SELECT * FROM emp1,dept WHERE emp1.`deptno`=dept.`deptno`;
#上面的查询语句是将两个表中的所有字段全部查询出来,也可以查询指定的列
SELECT emp1.`ename`,emp1.`sal`,emp1.`comm`,dept.`dname` FROM emp1,dept WHERE emp1.`deptno`=dept.`deptno`;
#给表取别名
SELECT e.ename,e.sal,e.comm,d.dname FROM emp1 e,dept d WHERE e.`deptno`=d.`deptno`;
#内连接查询:内连接的特点:查询结果必须满足条件
SELECT * FROM emp1 e INNER JOIN dept d ON e.`deptno`=d.`deptno`;
SELECT e.empno,e.ename,e.deptno,d.dname FROM emp1 e INNER JOIN dept d ON e.`deptno`=d.`deptno`;
#外连接查询
#左外连接:先将左边表的所有数据全部查询出来,然后去查询右边的表,满足条件的显示出来,如果右边表中没有左边表中的数据,则全部显示为null
SELECT * FROM emp1 e LEFT OUTER JOIN dept d ON e.`deptno`=d.`deptno`;
#先将右边表的所有数据全部查询出来,然后去查询左边的表,,满足条件的显示出来,如果左边表中没有右边表中的数据,则全部显示为null
SELECT * FROM emp1 e RIGHT OUTER JOIN dept d ON e.`deptno`=d.`deptno`;
#自然连接:系统自动的找出去除笛卡尔积无用记录的关系,要求两个表中存在相同名称相同类型的字段
#自然内连接
SELECT * FROM emp1 NATURAL JOIN dept
#自然左外连接
SELECT * FROM emp1 NATURAL LEFT JOIN dept
#自然右外连接
SELECT * FROM emp1 NATURAL RIGHT JOIN dept