mysql

209 阅读11分钟

1.软件的生命周期

软件的定义期开发期维护期

 软件的定义期
    可行性研究阶段/需求分析阶段
  软件的开发期
    概要设计阶段/详细设计阶段/编码实现阶段/测试阶段
  软件维护期
    部署阶段/维护阶段

2.服务器(启动访问服务器)

硬件 计算机
  软件 提供各种服务(数据库服务、打印机服务、网页(web)服务)
启动服务器
将自己的网页部署到服务器,放到public目录
访问服务器
   域名(IP地址) / 端口号 /  协议
   http://127.0.0.1:80
   http://localhost:80

1.通过局域网访问服务器

查看自己电脑在局域网的IP地址
    在cmd下,输入ipconfig命令,查看"以太网适配器 以太网/无线网适配器"下的IPv4地址,就是IP地址。
    192.168.0.102
  使用该IP地址访问服务器
    http://192.168.0.102:80

2.项目中数据的存储方式

内存/特定的文件/第三方云服务/数据库服务器

3.什么是数据库?

数据库是按照特定的形式来组织存储数据,是为了对数据的 操作方便——增删改查

(1)数据库的发展历史

网状数据库 - 层次型数据库 - 关系型数据库 - 非关系数据库(Nosql)

(2)关系型数据库逻辑结构

Server -> Database -> Table -> Row -> Column 服务器 数据库 数据表 行 列

                              数据库服务器     

图片1.png

(3)常见的关系型数据库

SQLServer Oracle MySQL DB2...

4.使用mysql数据库

免费、开源、号称中小型数据、兼容各种操作系统 瑞典MySQLAB -> SUN公司 -> Oracle公司 Martin: mariaDB Oracle: mysql xampp 服务器套装,包含多个服务器端软件(apache,mysql...) www.apachefriends.org/download.ht…

(1)mysql部署结构

服务器端:负责存储/维护数据——银行总行的服务器机房 C:/xampp/mysql/bin/mysqld.exe 启动文件 确保3306端口不被占用 客户端:负责连接服务器,对数据增删改查——ATM机 C:/xampp/mysql/bin/mysql.exe 客户端工具

(2)使用客户端连接服务器端

 mysql.exe  -h127.0.0.1  -P3306  -uroot  -p
   -h  host   服务器的域名或IP地址,默认不能使用局域网IP
   -P  port   端口号
   -u  user   用户名,root是管理员用户
   -p  password   密码,root的密码默认是空
  mysql  -uroot    简写形式
命令的结尾不能加分号结束

5.常用的mysql操作命令

  quit;   退出服务器的连接
  show databases;   显示服务器下所有的数据库
  use  数据库名;  进入指定的数据库
  show  tables;  显示当2前数据库所有的数据表
  desc  表名;  描述表中都有哪些列(表头哪些项)
所有的操作命令都统一加英文分号结束。

6.SQL命令 执行方式

结构化查询语言,用来操作关系型数据库;主要是对数据的增删改查。 SQL命令的两种执行方式

(1)交互模式

客户端输入一行,点击回车,服务器端执行一行;适用于临时性的查看数据。

(2)脚本模式

客户端把所有要执行的命令写在一个脚本文件中,一次性的提交给服务器执行,适用于批量的操作数据。 mysql -uroot<C:/xampp/..../01.sql 回车 在连接mysql的同时,提交脚本文件,不能进入mysql操作。

7.SQL语法规范

(1)一条SQL语句可以跨越多行,以英文的分号结尾 (2)假设某一条语句出现错误,则此条语句及后边所有语句不再执行 (3)SQL命令不区分大小写,习惯上关键字大写,非关键字小写 (4)分为单行注释(#...)和多行注释(/.../),注释的内容不会被服务器执行

8.常用的SQL命令 管理命令

(1)丢弃已经存在的数据库
  DROP  DATABASE  IF  EXISTS  jd;
 (2)创建一个新的数据库
  CREATE  DATABASE  jd;
 (3)进入创建的数据库
  USE  jd;
 (4)创建保存数据的表
  CREATE  TABLE  student( 
    id  INT,
    name  VARCHAR(8),
    sex  VARCHAR(1),
    score  INT
  );
 (5)插入数据
  INSERT  INTO  student  VALUES('1', 'tom', 'M', '97'); 
 (6)查询数据
  SELECT  *  FROM  student;
 (7)修改数据
   UPDATE user SET phone='19988888888',isOnline='n' WHERE uid='2';
 (8)删除数据
   DELETE  FROM  user  WHERE uid='3'; 
关系型数据库
  逻辑结构
  Server->Database->Table->Row->Column
mysql
  部署结构:服务器端mysqld.exe、客户端mysql.exe
 使用客户端连接服务器端
  mysql.exe  -h127.0.0.1  -P3306  -uroot   -p
  mysql  -uroot
 管理命令
  show  databases;
  use  数据库名称;
  show  tables;
  desc  表名称;
  quit;
 常用SQL命令
  DROP DATABASE  IF  EXISTS  ...
  CREATE  DATABASE ...
  USE ...
  CREATE  TABLE...
  INSERT INTO ... VALUES();
  SELECT * FROM ...

9.计算机存储字符

(1)如何存储英文字符

abc  979899
Latin-1: 总共有256个,兼容ASCII码,同时对欧洲符号进行了编码

(2)如何存储中文字符

 GBK: 对两万多汉字进行了编码,兼容GB2312
 BIG5: 台湾繁体字编码
 Unicode: 对世界上主流国家常用的语言进行了编码,具体存储方案有UTF-8,UTF-16,UTF-32
mysql默认使用Latin-1编码,不兼容中文,所以出现乱码

(3)解决mysql中文乱码

  脚本文件另存为的编码为UTF8
  客户端连接服务器端的编码为UTF8
  服务器端创建数据库使用的编码为UTF8

图片2.png

10.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   布尔型,只有两个值,分别是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
  	CHAR(5)	VARCHAR(5)
a	a\0\0\0\0	a\0
ab	ab\0\0\0	ab\0
一二三	一二三\0\0	一二三\0
  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)
 );

11.mysql中的列约束

mysql可以对要插入的数据进行特定的验证,只要满足条件才允许插入,否则被认为的非法的插入,例如一个人的性别只能是男或女,一个人的工资只能是正数。

(1)主键约束——PRIMARY KEY

 声明了主键约束的列上不允许插入重复的值;一个表中只能有一个主键约束,通常添加在编号列上,查询时候会按照编号列从小到大排序,会加快查找速度。
NULL表示空,在插入的时候,无法确定的数据通常用NULL,例如无法确定一个员工的性别,生日,无法确定商品的价格等;
注意:NULL使用的时候不能加引号。
  主键列上禁止插入NULL

(2)非空约束——NOT NULL

声明了非空约束的列上,禁止插入NULL

(3)唯一约束——UNIQUE

声明了唯一约束的列上,禁止插入重复的值,允许插入NULL,甚至是多个NULL 两个NULL比较是不等的,所以允许插入多个。

(4)默认值约束——DEFAULT

可以使用DEFAULT关键字声明默认值,具体有两种方式可以应用默认值
  比如:
  INSERT  INTO  laptop_family  VALUES(36,'神州',DEFAULT);
  INSERT  INTO  laptop_family(fid,fname)  VALUES(37,'惠普');

(5)检查约束——CHECK

 检查约束可以对插入的数据进行自定义的验证
  CREATE  TABLE  student(
     score  TINYINT  CHECK(score>=0  AND  score<=100)
  );
  mysql不支持检查约束,会影响数据的插入速度。对服务器造成较大的压力
  后期可以使用JS替代此功能。

(6)外键约束——FOREIGN KEY

 声明了外键约束的列上,取值必须在另一个表的主键列上出现过,两者的列类型要保持一致;一个表外键列允许使用多次,而且允许使用NULL
  FOREIGN KEY(外键列)  REFERENCES  另一个表(主键列)
  FOREIGN KEY(familyId) REFERENCES laptop_family(fid)
  #外键familyId的取值要到另一个表laptop_family的fid中

图片3.png

12.自增列

 AUTO_INCREMENT: 自动增长,假如一个列上声明了自增列,则无需手动赋值,只需要赋值为NULL,就会自动获取当前的最大值,然后加1插入。
 注意:自增列必须添加在主键列上,自增列允许手动赋值。

13.简单查询

(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;
AS关键字可以省略,保留空格即可;
起别名的目的通常是为了简化列名称单词过长

(4)显示不同的记录

示例:查询员工都分布在哪些部门
  SELECT DISTINCT deptId FROM emp;
    :查询出公司都有哪些姓名的员工
  SELECT DISTINCT sex FROM emp;

(5)查询时执行计算

 示例:计算2+3-4*5+9*37
  SELECT 2+3-4*5+9*37;
  :查询出所有员工的姓名及其年薪
  SELECT ename,salary*12 FROM emp;
  假设每个员工的工资增加700,年终奖为8000,查询所有员工的姓名及其年薪,使用汉字别名
  SELECT ename 姓名,(salary+700)*12+8000 年薪 FROM emp;

(6)查询结果集排序

  示例:查询所有的部门,结果集按照部门编号升序排列
  SELECT * FROM dept ORDER BY did ASC; #ascendant 升序
  示例:查询所有的部门,结果集按照部门编号降序排列
  SELECT * FROM dept ORDER BY did DESC; #descendant 降序
     desc emp;  describe描述
  : 查询所有的员工,结果集按照工资降序排列
  SELECT * FROM emp ORDER BY salary DESC;
  查询所有员工,结果集按照年龄从小到大排序
  SELECT * FROM emp ORDER BY birthday DESC;
  查询所有员工,结果集按照姓名升序排列
  SELECT * FROM emp ORDER BY ename;
按照字符串排序,按照Unicode来排列的。
如果排序规则为空,则默认按照升序排列,ASC
  查询所有员工,结果集按照工资升序排列,如果工资相同按照年龄从大到小排序
  SELECT * FROM emp ORDER BY salary,birthday;
  查询所有员工,结果集女员工显示在前,如果性别相同按照姓名升序排序
  SELECT * FROM emp ORDER BY sex,ename;

(7)条件查询

示例: 查询出编号为5的员工所有信息
  SELECT * FROM emp WHERE eid=5;
  练习: 查询出姓名为lucy的编号,姓名,性别,工资
  SELECT eid,ename,sex,salary FROM emp WHERE ename='lucy';
  练习: 查询出20号部门下的员工有哪些
  SELECT * FROM emp WHERE deptId=20;
  练习: 查询出所有的女员工有哪些
  SELECT * FROM emp WHERE sex=0;
  练习: 查询出工资在7000以上的员工有哪些
  SELECT * FROM emp WHERE salary>7000;
比较运算符:>  <  >=  <=  =  !=(不等于)
  练习: 查询出不在10号部门下的员工有哪些
  SELECT * FROM emp WHERE deptId!=10;
  练习: 查询出没有明确部门的员工有哪些
  SELECT * FROM emp WHERE deptId IS NULL;
  练习: 查询出有明确部门的员工有哪些
  SELECT * FROM emp WHERE deptId IS NOT NULL;
  练习: 查询出工资在6000以上的男员工有哪些
  SELECT * FROM emp WHERE salary>6000 AND sex=1;
  练习: 查询出工资在5000~7000之间的员工有哪些
  SELECT * FROM emp WHERE salary>=5000 AND salary<=7000;
  SELECT * FROM emp WHERE salary BETWEEN 5000 AND 7000;
  练习: 查询出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';
  练习: 查询出工资在5000以下和7000以上的员工有哪些
  SELECT * FROM emp WHERE salary<5000 OR salary>7000;
  SELECT * FROM emp WHERE salary NOT BETWEEN 5000 AND 7000;
  练习: 查询出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/IS NOT NULL
AND/OR
BETWEEN AND/NOT BETWEEN AND
IN() / NOT IN()

(8)模糊条件查询

示例: 查询出姓名中含有字母e的员工有哪些
  SELECT * FROM emp WHERE ename LIKE '%e%';
  练习: 查询出姓名中以e结尾的员工有哪些
  SELECT * FROM emp WHERE ename LIKE '%e';
  练习: 查询出姓名中倒数第2个字符为e的员工有哪些
  SELECT * FROM emp WHERE ename LIKE '%e_';
%  匹配任意0个或者多个字符   >=0
_   匹配任意1个字符   =1
以上两个符号必须结合着LIKE关键字使用

(9)分页查询

查询的结果集有太多的数据,一页显示不完,可以做成分页显示
  前提是要有两个已知条件:每页的数据量、当前的页码
  每页开始查询的值=(当前的页码-1)*每页的数据量
  SELECT * FROM emp LIMIT 每页开始查询的值,每页的数据量;
  假设每页显示5条数据
   第1SELECT * FROM emp LIMIT 0,5;
   第2SELECT * FROM emp LIMIT 5,5;
   第3SELECT * FROM emp LIMIT 10,5;
  练习: 假设每页显示7条数据,查询前3页每页的数据。
   第1SELECT * FROM emp LIMIT 0,7;
   第2SELECT * FROM emp LIMIT 7,7;
   第3SELECT * FROM emp LIMIT 14,7;
LIMIT后的两个值数据类型必须是数值型。

14.数据库中是如何存储图片

存储的是图片的路径,例如banner1.png

15.复杂查询

(1)聚合查询/分组查询

 示例: 查询所有员工的数量
  SELECT COUNT(ename) FROM emp;
  练习: 通过部门编号查询员工数量
  SELECT COUNT(deptId) FROM emp;
  练习: 通过员工编号查询员工数量
  SELECT COUNT(eid) FROM emp; #推荐
  练习:通过*号查询所有女员工的数量
  SELECT COUNT(*) FROM emp WHERE sex=0;
聚合函数
函数是一个功能体,需要提供若干个数据,产出结果。——饺子机
COUNT()/SUM()/AVG()/MAX()/MIN()
数量     总和    平均   最大  最小
  练习: 查询所有员工的工资总和
  SELECT SUM(salary) FROM emp;
  练习: 查询出所有男员工的平均工资
  SELECT AVG(salary) FROM emp WHERE sex=1;
  练习: 查询出工资最高的女员工工资是多少
  SELECT MAX(salary) FROM emp WHERE sex=0;
  练习: 查询出年龄最大的员工生日是多少
  SELECT MIN(birthday) FROM emp;
分组查询:只能查询聚合函数以及分组条件
  练习: 查询出男女员工的最高工资,最低工资,平均工资
  SELECT MAX(salary),MIN(salary),AVG(salary),sex FROM emp GROUP BY sex;
  练习: 查询出各个部门的员工数量和总的工资是多少;
  SELECT COUNT(eid),SUM(salary),deptId FROM emp GROUP BY deptId;
  练习: 查询出所有员工出生的年份
  SELECT YEAR(birthday) FROM emp;
  练习: 查询出1991年出生的员工有哪些
  SELECT * FROM emp WHERE YEAR(birthday)=1991;
  练习: 查询出12月生日的员工有哪些
  SELECT * FROM emp WHERE MONTH(birthday)=12;

(2)子查询

示例: 查询研发部的员工有哪些
   步骤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出生的年份——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';
  练习: 查询出比tom工资高的员工有哪些
   SELECT * FROM emp WHERE salary>(SELECT salary FROM emp WHERE ename='tom');

(3)多表查询 内连接 左外连接

右连接 全连接 UNION

 示例: 查询所有员工的姓名及其部门名称
  SELECT ename,dname FROM emp,dept;
  错误:笛卡尔积
  如何解决: 在多表查询中添加查询条件!
  SELECT ename,dname FROM emp,dept WHERE deptId=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;
 在左外和右外连接中,OUTER关键字可以省略的
  全连接——显示左侧和右侧所有记录
    FULL  JOIN  ,mysql不支持
  UNION ALL  联合后不合并相同的记录 
  UNION  联合后合并相同的记录
  (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);