MySQL笔记

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   男孩/女孩

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值