MySQL笔记
一.软件常识类
1.1-Windows中常用的快捷键
Alt+Tab:切换当前的窗口
Windows+e:打开 此电脑/资源管理器
Windows+d: 显示/隐藏桌面
Windows+r: 打开运行窗口 cmd/calc -计算机/mspaint-画图
1.2-软件
前端开发的产品是不是软件
浏览器/服务器
软件工程
(1)程序设计
Ada – Bug - Debug
(2)软件设计
软件作坊
IBM – Dos – Microsoft - Bill Gates - Windows
(3)软件工程
给定成本,进度的前提下,开发出具有有效性,可靠性,可维护,可追踪,可移植的软件产品。
1.3-软件生命周期(软件开发流程)
**1)**软件的定义期
(1)可行性研究阶段——《可行性研究报告》
技术、人力、设备、资金、时间、回报率、政策、风俗…
(2)需求分析阶段
功能性需求分析和非功能性需求分析
非功能性需求对功能性需求的实现
**2)**软件开发期
(3)概要设计阶段——架构师
子系统、模块、技术选型、数据库设计…
(4)详细设计阶段——模块负责人
页面、主体内容、属性、功能…
(5)编码实现阶段
UI设计——网页的效果图
前端工程师——把网页效果图转为html,css,js格式
后端工程师——为前端提供项目中所需要的数据 接口
(6)测试阶段——软件测试工程师
**3)**软件维护期
(7)部署阶段——运维工程师
将软件部署到服务器
(8)维护阶段
软件维护
1.5-服务器
- 硬件:就是一台功能强大的计算机
- 软件:可以提供多种服务,例如数据库服务、WEB服务、游戏服务、文件服务…
(1)访问服务器
找服务器:域名/IP地址
使用服务器下服务:端口
使用该服务需要对应的协议
(2)访问WEB服务
二.软件的生命周期
-
软件定义期
可行性研究阶段
需求分析阶段
-
软件开发期
概要设计阶段
详细设计阶段
编码实现阶段
测试阶段
-
软件维护期
部署阶段
维护阶段
-
服务器
访问服务器 IP/域名
具体的服务 端口
使用该服务 协议
2.1-数据的存储方式有哪些
文件/内存/第三方云服务器/数据库服务器
2.2-什么是数据库
数据库按照一定的形式来组织存储数据,目的为了更好的操作数据——增删改查
(1)数据库的发展历史
网状数据库 – 层次型数据库 – 关系型数据库 – 非关系型数据库(NoSQL)
(2)关系型数据库逻辑结构
Server – Database – Table - Row - Column
服务 数据库 数据表 行 列
三.mysql数据库
-
Oracle: mysql
-
Martin: MariaDB
XAMPP
服务器套装,包含多款服务器,包含mysql,apache…mysql部署结构**
(1)mysql部署结构
服务器端: 负责存储/维护数据 —— 银行数据库服务器
C:/xampp/mysql/bin/mysqld.exe 启动文件
占用3306端口
客户端: 负责连接服务器,对数据进行增删改查 —— ATM机
(2)使用客户端连接服务器端
-
mysql.exe -h127.0.0.1 -P3306 -uroot -p
-
-h host IP/域名 127.0.0.1/localhost
-
-P port 端口
-
-u user 用户名 root 管理员账户
-
-p password 密码 xampp下root的密码为空
-
mysql -uroot 简写形式 !注意:连接的结尾不能加分号
(3)常用管理命令
- quit; 退出服务器的连接
- show databases; 显示所有的数据库
- use 数据库名称; 进入指定的数据库
- show tables; 显示当前数据库所有的表
- desc 表名称; 描述表中都有哪些列
所有命令都是以英文的分号结尾
(4)SQL命令
-
结构化查询语言,用于操作关系型数据库服务器,主要是对数据执行增删改查。
-
SQL命令的两种执行方式
(1)交互模式:客户端输入一行,点击回车,服务器端就执行一行,适用于临时性的查看数据 (2)脚本模式:把所有要执行的命令写在一个脚本文件中,一次性的提交给服务器执行,适用于批量的操作数据
-
在建立连接前
mysql -uroot<拖拽要提交的脚本过来 回车
练习:编写脚本文件02.sql,在脚本中查看所有的数据库有哪些,进入数据库phpmyadmin,显示所有的数据表,描述数据表pma__recent有哪些列,提交给服务器。
(5)常用的SQL命令
(1)#设置客户端连接服务器端的编码为UTF-8
set names utf8;
(2)丢弃数据库,如果存在
drop database if exists jd;
(3)创建新的数据库 ,设置编码为utf-8
create database jd charset=utf8;
(4)进入数据库
use jd;
(5)创建保存数据的表
create table student(
sid INT,
name VARCHAR(8),
sex VARCHAR(1),
score INT
);
(6)插入数据
insert into student values(‘1’,’ran’,’F’,’59’);
(7)查询数据
select * from student;
(8)修改数据
update user SET phone='19988888888',isOnline='n' where uid='2';
(9)删除数据
delete from user where uid='3';
(10)插入数据表里面的数据结构
alter table student add salary int(11) not null;
练习:编写脚本文件04_tedu.sql,丢弃数据库,如果存在tedu,创建一个新的数据库tedu
练习:进入数据库tedu,创建保存员工数据的表emp,包含的列有编号eid,姓名name,地 址addr,电话phone
练习: 往员工表emp下插入若干条数据,查询结果。
练习作业
编写脚本文件xz.sql,先丢弃再创建数据库xz,进入数据库xz,创建保存用户数据的表user,包含有编号uid,用户名uname,密码upwd,邮箱email,电话phone,真实姓名userName,注册时间regTime,是否在线isOnline;插入若干条数据,查询结果
四.mysql中的列类型
4.1-计算机存储字符
-
如何存储英文字符
ASCII: 总共有128个,对所有的英文字母及其符号进行了编码
abc 979899
Latin-1: 总共有256个,兼容ASCII码,同时对欧洲符号进行了编码
-
如何存储中文字符
GB2312: 对6千多常用的汉字进行了编码,兼容ASCII码
GBK: 对两万多汉字进行了编码,兼容GB2312
BIG5: 台湾繁体字编码
Unicode: 对世界上主流国家常用的语言进行了编码,具体存储方案有UTF-8,UTF-16,UTF-32
mysql默认使用Latin-1编码,不兼容中文,所以出现乱码
4.2-解决mysql中文乱码
- 脚本文件另存为的编码为UTF8
- 客户端连接服务器端的编码为UTF8
- 服务器端创建数据库使用的编码为UTF8
练习:编写脚本文件01_sina.sql,先丢弃数据库sina,创建新的数据库sina,进入该数据库,创建保存新闻数据的表news,包含有编号nid,标题title,发布时间ctime,来源origin;插入若3条数据,删除1条,修改1条。 注意:解决中文乱码
4.3-mysql中的列类型
创建表的时候,指定的列可以存储的数据类型
CREATE TABLE t1( nid 列类型 );
(1)数值型——引号可加可不加
(tinyint) 微整型,占1个字节,范围-128~127
(smallint) 小整型,占2个字节,范围-32768~32767
(int) 整型,占4个字节,范围 -2147483648~2147483647
(bigint) 大整型,占8个字节,范围很大
(float) 单精度浮点型,占4个字节,范围比INT大的多,可能产生计算误差
(double) 双精度浮点型,占8个字节,范围比BIGINT大的多,可能产生计算误差
decimal(M,D) 定点小数,小数点不会变化,几乎不会产生计算误差,M表示总的有效位数,D表示小数点后的有效位数
bool(boolean) 布尔型,只有两个值,分别是TRUE/FALSE,不能加引号;真正存储的时候自动转为TINYINT,TRUE/FALSE自动转为1/0,所以也可以执行存储1/0.
(2)日期时间型——必须加引号
date 日期型 '2019-12-25'
time 时间型 '15:24:30'
datetime 日期时间型 '2019-12-25 15:24:30'
(3)字符串型——必须加引号
varchar(M) 变长字符串,不会产生空间浪费,操作速度相对慢,M最大值是65535
char(M) 定长字符串,可能产生空间浪费,操作速度相对快,M的最大值是255,常用于存储一些固定长度的数据,例如电话号码、身份证号等
text(M) 大型变长字符串,M的最大值是2G
variable character
123456.789*10^-1
12345.6789
1234.56789*10
123.456789*10^2
12.3456789*10^3
1.23456789*10^4
GB - MB - KB - BYTE - BIT (位)
1BYTE=8BIT
CREATE TABLE t1(
id INT,
age TINYINT,
phone CHAR(11),
price DECIMAL(6,2), #9999.99
sex BOOL, # 1-男 0-女
ctime DATETIME,
article VARCHAR(5000)
);
-
练习:编写脚本文件02_xuezi.sql,设置编码为UTF8,先丢弃再创建数据库xuezi,进入该数据库,创建保存笔记本数据的表laptop,包含编号lid,标题title,价格price,库存量stockCount,上架时间shelfTime,是否为首页推荐isIndex,插入若干条数据。
-
练习:编写脚本文件03_tedu.sql,设置编码为UTF8,先丢弃再创建数据库tedu,进入该数据库,创建保存部门数据的表dept,包含部门编号did、部门名称dname,插入以下数据
10 研发部 20 运营部 30 市场部 40 测试部
创建保存员工数据的表emp,包含编号eid,姓名ename,性别sex,生日birthday,工资salary,所属部门编号deptId,插入若干条数据。
-
练习:编写脚本文件xz.sql,设置编码为UTF8,先丢弃再创建数据库xz,进入该数据库,创建笔记本家族的表laptop_family,包含fid,名称fname,数量count,插入以下数据
10 联想 20 戴尔 30 小米
创建保存笔记本数据的表laptop,包含lid,title,price,规格spec,详情detail,上架时间shelfTime,是否在售isOnsale,所属家族编号familyId;插入若干条数据;
五.mysql中的列约束
5.0数据源码
#设置客户端连接服务器端的编码
SET NAMES UTF8;
#丢弃数据库,如果存在
DROP DATABASE IF EXISTS tedu;
#创建新的数据库,设置存储编码
CREATE DATABASE tedu CHARSET=UTF8;
#进入该数据库
USE tedu;
#创建保存部门数据的表
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(8) UNIQUE
);
#插入数据
INSERT INTO dept VALUES(10,'研发部');
INSERT INTO dept VALUES(20,'市场部');
INSERT INTO dept VALUES(30,'运营部');
INSERT INTO dept VALUES(40,'测试部');
#创建保存员工数据的表
CREATE TABLE emp(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(8),
sex BOOLEAN DEFAULT 1,
birthday DATE,
salary DECIMAL(7,2) NOT NULL, #99999.99
deptId INT,
FOREIGN KEY(deptId) REFERENCES dept(did)
);
#插入数据
INSERT INTO emp VALUES(NULL,'Tom',1,'1990-5-5',6000,20);
INSERT INTO emp VALUES(NULL,'Jerry',0,'1991-8-20',7000,10);
INSERT INTO emp VALUES(NULL,'David',1,'1995-10-20',3000,30);
INSERT INTO emp VALUES(NULL,'Maria',0,'1992-3-20',5000,10);
INSERT INTO emp VALUES(NULL,'Leo',1,'1993-12-3',8000,20);
INSERT INTO emp VALUES(NULL,'Black',1,'1991-1-3',4000,10);
INSERT INTO emp VALUES(NULL,'Peter',1,'1990-12-3',10000,10);
INSERT INTO emp VALUES(NULL,'Franc',1,'1994-12-3',6000,30);
INSERT INTO emp VALUES(NULL,'Tacy',1,'1991-12-3',9000,10);
INSERT INTO emp VALUES(NULL,'Lucy',0,'1995-12-3',10000,20);
INSERT INTO emp VALUES(NULL,'Jone',1,'1993-12-3',8000,30);
INSERT INTO emp VALUES(NULL,'Lily',0,'1992-12-3',12000,10);
INSERT INTO emp VALUES(NULL,'Lisa',0,'1989-12-3',8000,10);
INSERT INTO emp VALUES(NULL,'King',1,'1988-12-3',10000,10);
INSERT INTO emp VALUES(NULL,'Brown',1,'1993-12-3',22000,NULL);
5.1列约束
- mysql可以对要插入的数据进行特定的验证,只要满足条件才允许插入,否则被认为的非法的插入,例如一个人的性别只能是男或女,一个人的工资只能是正数。
(1)主键约束——PRIMARY KEY (primary key)
声明了主键约束的列上不允许插入重复的值;一个表中只能有一个主键约束,通常添加在编号列上,查询时候会按照编号列从小到大排序,会加快查找速度。
NULL表示空,在插入的时候,无法确定的数据通常用NULL,例如无法确定一个员工的性别,生日,无法确定商品的价格等;
注意:NULL使用的时候不能加引号。
主键列上禁止插入NULL。
练习:在商品表laptop中给编号添加主键约束,并插入数据测试。
(2)非空约束——NOT NULL (not null)
声明了非空约束的列上,禁止插入NULL
(3)唯一约束——UNIQUE (unique)
声明了唯一约束的列上,禁止插入重复的值,允许插入NULL,甚至是多个NULL
练习:给laptop表的title列,添加非空约束和唯一约束,并插入数据测试。
(4)默认值约束——DEFAULT (default)
可以使用DEFAULT关键字声明默认值,具体有两种方式可以应用默认值
INSERT INTO laptop_family VALUES(36,'神州',DEFAULT);
INSERT INTO laptop_family(fid,fname) VALUES(37,'惠普');
#创建数据库表
create table laptop(
lid int, #编码id
title varchar(8) not null default '西瓜', #标题
price varchar(16)#价格
);
#插入数据库
insert into laptop values (1,default,23);
insert into laptop(lid,title,price) values (2,'桃子',23);
insert into laptop(lid,price) values (3,23);
/*
| lid | title | price |
+------+-------+-------+
| 1 | 西瓜 | 23 |
| 2 | 桃子 | 23 |
| 3 | 西瓜 | 23 |
*/
/*
创建im表,将name字段设置为默认值'QQ'
*/
create table im (
id int(3) not null,
name varchar(25) not null default 'QQ'
);
/*
插入数据,不传name字段的值,MySQL会为其设置默认值的
您运行的 SQL 语句已经成功运行了。
*/
INSERT INTO im( id, name ) VALUES ( 2, 'MSN' ) ;
INSERT INTO im( id ) VALUES ( 3 ) ;
SELECT * FROM im LIMIT 0 , 30;
/*
id name
2 MSN
3 QQ
*/
练习: 给笔记本表laptop添加默认价格为2999,默认的是否在售为0,并应用两种方式插入数据。
(5)检查约束——CHECK (check)
检查约束可以对插入的数据进行自定义的验证
create table student(
score tinyint check(score>=0 AND score<=100)
);
mysql不支持检查约束,会影响数据的插入速度。对服务器造成较大的压力
后期可以使用JS替代此功能。
(6)外键约束——FOREIGN KEY (foreign key)
声明了外键约束的列上,取值必须在另一个表的主键列上出现过,两者的列类型要保持一致;一个表外键列允许使用多次,而且允许使用NULL
foreign key(外键列) references 另一个表(主键列)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7rPr2Q5f-1596851283259)(.\img\6.png)]
(6)自增列(auto_increment)
AUTO_INCREMENT: 自动增长,假如一个列上声明了自增列,则无需手动赋值,只需要赋值为NULL,就会自动获取当前的最大值,然后加1插入。
注意:自增列必须添加在主键列上,自增列允许手动赋值
#创建保存数据的表
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(8) UNIQUE
);
#插入数据
INSERT INTO dept VALUES(1,'研发部');
INSERT INTO dept VALUES(null,'市场部');
INSERT INTO dept VALUES(null,'运营部');
/*
| did | dname |
+------+-------+
| 1 | 研发部 |
| 2 | 市场部 |
| 3 | 运营部 |
*/
(7)练习
编写脚本文件01_tedu.sql,设置编码为UTF8,先丢弃再创建数据库tedu,进入数据库,创建保存部门数据的表dept,包括did,部门名称dname,插入以下数据
10 研发部 20 运营部 30 市场部 40测试部
创建保存员工数据的表emp,包含eid,姓名ename,性别sex,生日birthday,工资salary,所属部门编号deptId;插入若干数据;
在表中应用所学的列约束;主键约束,自增列,唯一约束…外键约束
六.mysql中的查询
1.简单查询
(0)数据库源码
#设置客户端连接服务器端的编码
SET NAMES UTF8;
#丢弃数据库,如果存在
DROP DATABASE IF EXISTS tedu;
#创建新的数据库,设置存储编码
CREATE DATABASE tedu CHARSET=UTF8;
#进入该数据库
USE tedu;
#创建保存部门数据的表
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(8) UNIQUE
);
#插入数据
INSERT INTO dept VALUES(10,'研发部');
INSERT INTO dept VALUES(20,'市场部');
INSERT INTO dept VALUES(30,'运营部');
INSERT INTO dept VALUES(40,'测试部');
#创建保存员工数据的表
CREATE TABLE emp(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(8),
sex BOOLEAN DEFAULT 1,
birthday DATE,
salary DECIMAL(7,2) NOT NULL, #99999.99
deptId INT,
FOREIGN KEY(deptId) REFERENCES dept(did)
);
#插入数据
INSERT INTO emp VALUES(NULL,'Tom',1,'1990-5-5',6000,20);
INSERT INTO emp VALUES(NULL,'Jerry',0,'1991-8-20',7000,10);
INSERT INTO emp VALUES(NULL,'David',1,'1995-10-20',3000,30);
INSERT INTO emp VALUES(NULL,'Maria',0,'1992-3-20',5000,10);
INSERT INTO emp VALUES(NULL,'Leo',1,'1993-12-3',8000,20);
INSERT INTO emp VALUES(NULL,'Black',1,'1991-1-3',4000,10);
INSERT INTO emp VALUES(NULL,'Peter',1,'1990-12-3',10000,10);
INSERT INTO emp VALUES(NULL,'Franc',1,'1994-12-3',6000,30);
INSERT INTO emp VALUES(NULL,'Tacy',1,'1991-12-3',9000,10);
INSERT INTO emp VALUES(NULL,'Lucy',0,'1995-12-3',10000,20);
INSERT INTO emp VALUES(NULL,'Jone',1,'1993-12-3',8000,30);
INSERT INTO emp VALUES(NULL,'Lily',0,'1992-12-3',12000,10);
INSERT INTO emp VALUES(NULL,'Lisa',0,'1989-12-3',8000,10);
INSERT INTO emp VALUES(NULL,'King',1,'1988-12-3',10000,10);
INSERT INTO emp VALUES(NULL,'Brown',1,'1993-12-3',22000,NULL);
#查询出姓名为King的人
SELECT * FROM emp WHERE ename = 'king';
#查询出20号部门下的员工有哪些
SELECT * FROM emp WHERE deptId = 20;
#查询出所有的女员工有哪些
SELECT * FROM emp WHERE sex = 0;
#查询出工资在5000以上的员工有哪些
SELECT * FROM emp WHERE salary > 5000;
#查询出和tom同一年的员工
select * from emp where year(birthday)= (
select year(birthday)from emp where ename = 'tom'
)and ename!='tom' ;
#使ename = dname;内连接
select ename,dname from emp e,dept d where e.deptid = d.did
select eid,ename,sex 性别,birthday,salary, dname from emp e,dept d where e.deptid = d.did;
#内连接
select ename,dname from emp inner join dept on deptid = did;
#左外连接
select ename,dname from emp left outer join dept on deptid = did;
#右外连接
select ename,dname from emp right outer join dept on deptid = did;
select ename 姓名,birthday 生日,salary 工资 from emp WHERE salary >8000 AND sex=1 order by salary desc;
select ename 姓名,birthday 生日,salary 工资 from emp WHERE salary >8000 AND salary order by salary desc;
(1)查询特定的列
-
示例:查询所有员工的编号和姓名
SELECT eid,ename FROM emp;
-
练习:查询所有员工的姓名,性别,生日
SELECT ename,sex,birthday FROM emp;
(2)查询所有的列
SELECT eid,ename,sex,birthday,salary,deptId FROM emp;
SELECT * FROM emp;
(3)给列起别名
-
示例:查询所有员工的姓名和性别,使用汉字别名
SELECT ename AS 姓名,sex AS 性别 FROM emp;
-
练习:查询所有员工的编号,姓名,工资,使用汉字别名
SELECT eid AS 编号,ename AS 姓名,salary 工资 FROM emp;
-
练习:查询所有员工的姓名和生日,使用一个字母别名
SELECT ename a,birthday b FROM emp;
(4)显示不同的记录 distinct重复的值仅显示一次
-
示例:查询员工都分布在哪些部门
SELECT distinct deptId FROM emp;
-
练习:查询出公司都有哪些姓名的员工
SELECT distinct sex FROM emp;
(5)查询时执行计算
-
示例:计算2+3-45+937
SELECT 2+3-4*5+9*37;
-
练习:查询出所有员工的姓名及其年薪
SELECT ename,salary*12 FROM emp;
-
练习:假设每个员工的工资增加700,年终奖为8000,查询所有员工的姓名及其年薪,使用汉字别名
SELECT ename 姓名,(salary+700)*12+8000 年薪 FROM emp;
(6)查询结果集排序–ORDER BY(order by)
-
示例:查询所有的部门,结果集按照部门编号升序排列 --asc
SELECT * FROM dept ORDER BY did ASC; #ascendant 升序
-
示例:查询所有的部门,结果集按照部门编号降序排列–desc
SELECT * FROM dept ORDER BY did DESC; #descendant 降序
desc emp; describe描述
-
练习: 查询所有的员工,结果集按照工资降序排列
SELECT * FROM emp ORDER BY salary DESC ;
-
按多列排序
select * from emp order by deptid,age DESC;
(7)练习
查询所有员工,结果集按照年龄从小到大排序
查询所有员工,结果集按照姓名升序排列
查询所有员工,结果集按照工资升序排列,如果工资相同按照年龄从大到小排序
查询所有员工,结果集女员工显示在前,如果性别相同按照姓名升序排序
(8)条件查询 and 并 — or 或 — not非
示例:查询出编号为5的员工的所有列
SELECT * FROM emp WHERE eid=5;
练习:查询出姓名为king的员工所有列
SELECT * FROM emp WHERE ename='king';
练习:查询出20号部门下的员工有哪些
SELECT * FROM emp WHERE deptId=20;
练习:查询出所有的女员工有哪些
SELECT * FROM emp WHERE sex=0;
练习:查询出工资在5000以上的员工有哪些
SELECT * FROM emp WHERE salary>5000;
/*
> < >= <= = !=(不等于)
*/
练习:查询出不在20号部门下的员工有哪些
SELECT * FROM emp WHERE deptId!=20;
练习:查找出没有明确部门的员工有哪些
SELECT * FROM emp WHERE deptId IS NULL;
练习:查找出有明确部门的员工有哪些
SELECT * FROM emp WHERE deptId IS NOT NULL;
练习:查询出工资7000以上的男员工有哪些
SELECT * FROM emp WHERE salary>7000 AND sex=1;
练习:查询出工资在7000~10000之间的员工有哪些
SELECT * FROM emp WHERE salary>=7000 AND salary<=10000;
SELECT * FROM emp WHERE salary BETWEEN 7000 AND 10000;
练习:查询出工资在7000以下和10000以上的员工有哪些
SELECT * FROM emp WHERE salary<7000 OR salary>10000;
SELECT * FROM emp WHERE salary NOT between 7000 AND 10000;
练习:查询出1993年出生的员工有哪些
SELECT * FROM emp WHERE birthday>='1993-1-1' AND birthday<='1993-12-31';
SELECT * FROM emp WHERE birthday between '1993-1-1' AND '1993-12-31';
练习:查询出20号部门和30号部门的员工有哪些
SELECT * FROM emp WHERE deptId=20 OR deptId=30;
SELECT * FROM emp WHERE deptId IN(20,30);
练习:查询出不在20号部门和30号部门的员工有哪些
SELECT * FROM emp WHERE deptId NOT IN(20,30);
/*
is null ---找NULL/is not null---不找NULL
and/or
between .. and .. / not between .. and ..
in() / not in()
*/
(9)模糊条件查询
通常用于搜索
/*
%匹配任意多个字符 >=0
_匹配任意1个字符 =1
必须结合like关键字使用
如 "%e_";---倒数第二个是e的
"_e%";----第二个是e的
*/
示例:查询出姓名中含有o的员工有哪些
SELECT * FROM emp WHERE ename LIKE '%o%';
练习:查询出姓名中以o结尾的员工有哪些
SELECT * FROM emp WHERE ename LIKE '%o';
练习:查询出姓名中第2个字符是o的员工有哪些
SELECT * FROM emp WHERE ename LIKE '_o%';
(10)练习
查询出工资在8000以上的男员工的姓名,生日,工资;结果集按照工资的降序排列,使用汉字别名。
删除今天练习的代码,保留注释,重新编码代码。
(11)分页查询
查询的结果集有太多的数据,一次显示不完可以做成分页显示
需要有两个已知的条件:当前的页码和每页的数据量
#开始查询的值 = (当前的页码-1)*每页的数据量
SELECT * FROM emp LIMIT 开始查询的值, 每页的数据量;
/*
假设每页显示5条数据
第1页:SELECT * FROM emp LIMIT 0,5;
第2页:SELECT * FROM emp LIMIT 5,5;
第3页:SELECT * FROM emp LIMIT 10,5;
分页查询中的开始查询的值和每页的数据量必须是数值型,不能添加引号。
*/
2.复杂查询
(1)聚合查询
五个聚合函数:amx,min ,sum ,count, avg
#示例:查询出所有员工的数量
SELECT count(eid) FROM emp; #推荐使用主键列
#练习:通过部门编号这一列查询员工的数量
SELECT count(deptId) FROM emp;
#练习:通过姓名查询所有男员工的数量
SELECT count(ename) FROM emp WHERE sex=1;
#聚合函数,函数是一个功能体,可以接收若干个数据,返回处理的结果——饺子机
#count()/sum()/avg()/max()/min()
# 数量 总和 平均 最大 最小
#练习:查询出所有员工工资的总和
SELECT sum(salary) FROM emp;
#练习:查询出所有员工的平均工资
SELECT avg(salary) FROM emp;
#练习:查询出男员工的最低工资
SELECT min(salary) FROM emp WHERE sex=1;
#练习:查询出年龄最小的员工的生日
SELECT max(birthday) FROM emp;
(2)分组查询(group by)
分组查询中只能查询聚合函数和分组条件
#示例:查询出每个部门员工的最高工资,最低工资,平均工资
SELECT max(salary),min(salary),avg(salary),deptId,ename FROM emp GROUP BY deptId;
#练习:查询出男女员工的数量,工资总和,平均工资
SELECT count(eid),sum(salary),avg(salary),sex FROM emp GROUP BY sex;
(3)子查询
#示例:查询研发部的员工有哪些
#步骤1:查询出研发部的部门编号是多少——10
SELECT did FROM dept WHERE dname='研发部';
#步骤2:查询出部门编号为10的员工有哪些
SELECT * FROM emp WHERE deptId=10;
#综合:
SELECT * FROM emp WHERE deptId=(SELECT did FROM dept WHERE dname='研发部');
#练习:查询出比tom工资高的员工有哪些
#步骤1:查询出tom的工资——6000
SELECT salary FROM emp WHERE ename='tom';
#步骤2:查询出工资大于6000的员工
SELECT * FROM emp WHERE salary>6000;
#综合:
SELECT * FROM emp WHERE salary>(SELECT salary FROM emp WHERE ename='tom');
#练习:查询出和tom同一年出生的员工有哪些
#步骤1:查询出tom出生的年份——1990
SELECT year(birthday) FROM emp WHERE ename='tom';
#步骤2:查询出1990年出生的员工有哪些
SELECT * FROM emp WHERE year(birthday)=1990;
#综合:
SELECT * FROM emp WHERE year(birthday)=(SELECT year(birthday) FROM emp WHERE ename='tom') AND ename!='tom';
/*
year() 获取日期中的年份
示例:查询所有员工出生的年份
SELECT year(birthday) FROM emp;
*/
(4)多表查询
#示例:查询所有的员工姓名及其部门名称
SELECT ename,dname FROM emp,dept;
#产生笛卡尔积,需要添加查询的条件才可以避免
SELECT ename,dname FROM emp,dept WHERE deptId=did;
#存在的问题:无法查询出没有部门的员工,也无法查询出没有员工的部门。
#新增的多表查询语法
#(1)内连接
SELECT ename,dname FROM emp inner join dept on deptId=did;
#(2)左外连接 left outer join ----left outer join
#先写哪一个表,哪一个就是左,显示里边所有的记录,即使没有对应的
SELECT ename,dname FROM emp left outer join dept on deptId=did;
#(3)右外连接 right outer join ---outer关键字可以省略
#后写哪一个表,哪一个就是右,显示里边所有的记录,即使没有对应的
SELECT ename,dname FROM emp right outer join dept on deptId=did;
#左外和右外连接中的outer关键字可以省略
#(4)全连接
full join
#mysql不支持这种连接
#左外和右外的结果组合起来
#union 合并相同的记录 ----- union all 不合并相同的记录
(SELECT ename,dname FROM emp left outer join dept on deptId=did)
union
(SELECT ename,dname FROM emp right outer join dept on deptId=did);
------
时间戳:距离计算机元年(1970-1-1)的毫秒数
1秒=1000毫秒
2020-1-1 2020年1月1日 2020/1/1
50*365*24*60*60*1000 = 1,576,800,000,000
使用bigint才可以存的下
性别 1/0 男/女 man/woman 男孩/女孩