<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<!-- sql语句
在数据库中 sql语句是不分大小写的 SELECT
sql语句可单可双行书写
为了提高可读性 一般关键字大写 其余小写
空格和缩进使程序易读
-->
<!-- 表的概念
列固定 行数任意
表中的列称为:列/字段
表中的行成为:一条数据/一条记录
表 类 定义存储结构
列 字段 定义存储哪些属性
行 对象 表示一条数据/一个对象
-->
<!-- MYSQL安装与配置
Typical 经典安装
Custom 自定义安装
Complete 完整安装
程序安装在c盘 只要数据文件不放在c就行
然后配置mysql
Detailed 详细配置
Standard 标准配置
选择详细
选择第一种 Developer Machine 开发者服务器就是这个意思
选择innodb 支持外键关系 支持事务 (开发的时候肯定选择innodb)
事务管理就是 两个要成功都成功 要失败都失败(不可分割的操作单元) mylsam都不支持这两个
选择 Multifuntional Database(多功能数据库 这里两种都支持*事务 外键*)
选择默认安装路径
选择(允许支持的最大连接数 1-20 2-500 3-自定义) 一般选择第一个 或者自定义15个
选择端口 mysql 默认是3306
选择支持的字符集 第二个 或者第三个自定义编码 (utf8)
选择install as window service这个就是吧mysql装到服务列表了 下面打对勾 自动启动mysql服务
选择第二个就是讲mysql安装到path路径下面去
设置选择设置账号密码 简单记住就好 root 123456 然后去掉勾选远程连接 第二个不用选择
然后 execute 执行就好
在开始菜单里面找到mysql然后找到那个cmd然后右键属性 找到文件地址 然后在里面找到配置即可
在cmd中输入 密码 然后看到mysql就安装成功了
-->
<!-- 启动MySQL服务
打开数据库连接之前 一定要保证 MySQL服务器已经开启了
net strat 命令名字: 开启一个服务 如:net start MySQL
net stop 命令名字:关闭一个服务器 如:net stop MySQL
连接MySQL数据库:
方式1 进入mysql 命令行输入密码
方式2 cmd中输入
mysql -u账户 -p密码 -h数据库服务器安装的主机 -P数据库端口
mysql -uroot -p123456 -h127.0.0.1 -P3306
若连接的数据库在本机上 并且端口3306 则简写成 mysql -uroot -p123456
Navicat
点链接 localhost 3306 root 123456
工具 - 命令列界面 就可以操作 和cmd一样的命令行了
-->
<!-- 数据库对象 存储引擎
表,视图等等都是数据库对象
先了解数据库服务器url:主机+端口 用户名 密码 然后选用要使用的数据库 选择某一张表
表是系统自带的 不可更改 (mysql自带的这几个数据库~)
Info.. mysql.. perfor.. 这几个数据库不可更改 还有个test数据库什么也没有 可以进行测试
新建数据库
数据库名称(自己写) 字符集(utf8) 排序规则不写~
常用的命令:
SHOW DATABASES; 查看数据库
USE 要使用的数据库名字; 使用数据库
先要选择到使用的数据库 才可以再次进行查看里面的表; 先use 数据库 后show tables;
SHOW TABLES; 查看数据库中的表
CREATE DATABASE 要创建的数据库名称; 创建数据库;
DROP DATABASE 要删除的数据库名称; 删除数据库;
数据库(mysql)的存储引擎:
mylSAM 拥有较高的插入 查询速度 但不支持事务 不支持外键
innoDB 支持事务 支持外键 支持行级锁定 性能较低 (事务就是银行转账的例子)
mysql5.5 5.7性能更高一些~
-->
<!-- mysql的常用类型
整数
常用的是 int bigint 不过最常用的就是int类型 位宽:宽度指示器不会影响字段的大小和它可以存储值的范围,一般不用指定位宽.
age int(位宽 就是看多少来补全的意思)
小数
常用的是 double(5,2) 表示整数和小数一共占用5位 其中小数占2位 定点数据类型:DECIMAL 高精度类型 金额货币优先选择
字符 在mysql中 字符使用 单引号引起来
char 定长字符 0-255字节 varchar变长字符 0-255字节
常用的是 varchar 一般存储大量的字符串 比如文章的纯本本可以寻用text系列类型 text是变长的存大文本的
日期时间
year 只存年 date 只存年月日 time 时分秒 datetime 年月日时分秒 timestamp 时间戳 距离1970年1月1日00:00的毫秒数
常用的是 year date datetime
二进制 开发中 一般存储二进制文件保存路径
binary varbinary blob tinyblob mediumblob longblob 存放图形 声音 影像 二进制对象 0-4GB
常用的是 bit类型 一般存储0或1对应 布尔类型 varbinary 变长二进制字符串 字节数为值的长度加1
-->
<!-- 创建表和查看结构
创建表: (制定表的结构)
进入数据库 输入建表的命令CREATE TABLE 表名(
列名1 列类型 {约束},列名2 列类型 {约束},...
) 注意: 最后一行没有逗号
需求 定义一张学生信息表(t_student) 包含 id name email age列
CREATE TABLE t_student(
id BIGINT,
name VARCHAR(20),
email VARCHAR(40), 汉字的长度是3个字节对应一个
age INT 最后一个后面没有逗号
);
创建一张表 需要换行 不然mysql语法错误;
删除表:
DROP TABLE 表名;
DROP TABLE IF EXISTS '表名'; 这个就是判断 存在就删除 不存在就不操作;
查看表的结构:
desc 表名;
查看建表的结构语句:
show CREATE TABLE 表名; 查看建表时候的语句
如果在建表的时候 用到了数据库的关键字.
比如 使用order来表示订单 写表名写成 order order是sql的关键字 表示排序之意;
解决方案 避免使用关键字 如果是表名 有人习惯于使用 t_作为前缀 使用`(反引号)括起来;
-->
<!-- 表的各种约束 (针对于某一列)
非空约束 not null
设置列的默认值 default
唯一约束 unique
主键约束 primary key 非空且唯一 一般是单字段组件 也推荐使用 没有任何业务含义的列来充当主键(代理主键)
主键自增长 auto_increment 从1开始 步长为1 主键后面加一个主键自增长即可
表---设计表 主键 自动递增 保存就好了
一旦保存了主键自增长的值 就只会保存最大值 不会递减回去了 只是保证唯一标志就好 不用连续
外键约束 a表中的外键列 a表中的外键列的值必须参照于b表中的某一列(b表主键)
-->
<!-- 操作数据 DML 增删改语句
DDL是定义相关语句 DQL是查询相关语句
在navicat中 复制 粘贴是可以 就可以直接粘贴出桌面了 就可以备份表了
在数据库里表下面有个查询的 点击查询 输入查询语句 然后点击运行就可以进行 运行编辑的sql语句 #就是注释
插入数据 一次只能插入一行的数据 INSERT INTO 表名(列名1,列名2,列名n...) VALUES (插入前面列名相对应的值);
DML操作都会返回受影响的行数 这次成功操作几条数据
插入记录的一部分数据
INSERT INTO table_name(name,email,age) VALUES (对应的值,中间为空占位就可以用 ,NULL, 占位) 不可以写'NULL'
如果要插入id值 对应加一下就可以啦 如果不加就表示自增长id
mysql是可以插入多条数据的 mysql特有的
INSERT INTO table_name(name,email,age) VALUES (对应的值),(对应的值),(对应的值)
插入查询的结果:(测试的时候使用)
INSERT INTO t_student (name) SELECT name FROM t_student 就是查询到所有的name 然后再次遍历插入进去
-->
<!-- 更新(修改)语句
UPDATE 表名 SET 列名1=值1,列名2=值2,...WHERE [条件] 不添加条件就是更新表中所有的数据
主键是不能被修改的(因为修改完后通过原来的主键是再也找不到该条数据了)
UPDATE t_student SET name='叶孤城' WHERE name='西门吹雪';
UPDATE t_student SET name='张三',age=18,email='zhang@' WHERE id = 3;
删除语句
DELETE FROM t_student WHERE [条件],删除符合条件的数据
注意:FROM不要写成FORM 如果没有 WHERE表示清空表数据
DELETE FROM t_student WHERE id=30;
-->
<!-- 查询操作 DQL
单表查询
例子 货品信息表
id 主键(唯一标识) productName 货品名称 salePrice 零售价 supplier 供应商
brand 品牌 cutoff 折扣 dir_id 货品对应的分类id costPrice 成本价(折扣价)
查询的最简单的语法:
SELECT 列名1,列名2,列名3,... FROM 表名;
如果是查询所有的列 可以写成 SELECT * FROM 表名; 但是此时 查询出来的列的顺序和建立表时列的先后顺序相同
去掉重复数据
SELECT DISTINCT dir_id FROM product; DISTINCT这个就是去重的意思
对于number类型的数据 可以使用算术操作运算符创建表达式(+ - & /)
对于DATE类型的数据 可以使用部分算数操作创建表达式(+ -)
运算优先级
乘法和除法的优先级高于加减法 同级运算的顺序从左到右 表达式中用括号可强行改变优先级的运算顺序
需求
查询所有货品的id 名称 和批发价(批发价=卖价*折扣)
SELECT id,productName,salePrice,cutoff,salePrice * cutoff FROM product
查询所有货品的id 名称 和各j进50个成本价(成本=costPrice)
SELECT id,productName,costPrice * 50 FROM product
查询所有货品的id 名称 和各进50个 并且每个运费1元的成本
SELECT id,productName,(costPrice+1) * 50 FROM product
设置列名的别名
查询所有货品的id 名称 和各进50个 并且每个运费1元的成本(使用别名)
SELECT id AS 货品ID,productName,(costPrice+1) * 50 FROM product
· 如果中间断开或者有空格 要使用''包裹 AS可以省略直接空格就行
设置显示格式的查询
为方便用户浏览查询结果的数据 有时需要设置显示格式 可以使用concat函数来链接字符串
需求:查询商品的名称和零售价 格式:xxx商品的零售价为xxx
SELECT CONCAT(productName,'商品的零售价为',salePrice) FROM product
-->
<!-- 过滤查询 筛选
比较运算符 = > >=大于或等于 < <= !=(<>)不等于两种写法 LIKE 就是模糊 约等于的意思
SELECT * FROM product WHERE salePrice = 119; 查询货品零售价为119的所有货品信息
SELECT productName,salePrice FROM product WHERE salePrice <= 200 查询货品名称,零售价小于等于200的货品
SELECT的执行顺序 就是先执行where在执行SELECT 但是肯定里面是 最先 执行FROM的
逻辑运算符 AND(&&) OR(||) NOT(!)
零售价在300-400之间 SELECT id,productName,salePrice FROM product WHERE salePrice >=300 AND salePrice <= 400
不为2的商品 SELECT id,productName,dir_id FROM product WHERE NOT dir_id = 2;
优先级规则
比较运算符 > NOT > AND > OR 如果记不住分不清就加括号包裹进行运算
范围查询 BETWEEN AND BETWEEN 最小值 AND 最大值:闭区间
零售价在300-400之间 SELECT id,productName,salePrice FROM product WHERE salePrice >=300 AND salePrice <= 400
SELECT id,productName,salePrice FROM product WHERE salePrice BETWEEN 300 AND 400
SELECT id,productName,salePrice FROM product WHERE NOT(salePrice >=300 AND salePrice <= 400)
SELECT id,productName,salePrice FROM product WHERE salePrice NOT BETWEEN 300 AND 400
var sql = "SELECT * FROM XX WHERE"
if(minPrice != null){
sql += 'salePrice >=' + 500
}
if(maxPrice != null){
sql += 'salePrice <=' + 1000;
}
集合查询 IN
编号为2或者为4的货品 SELECT * FROM product WHERE dir_id = 2 OR dir_id = 4;
SELECT * FROM product WHERE dir_id IN (2,4); 这个是做批量删除的时候用到的
空值查询 IS NULL 判断列的值是否为空 WHERE 列名 IS NULL;
SELECT * FROM product WHERE productName IS NULL 当出现全是空的时候 就是个空集 全为空 判断null就得用is
模糊查询 LIKE 就是实际应用中 模糊查询 点击查询 就可以查询中相对应的关键字等等
查询条件可以包含 文字 字符 或者 数字 % 通配符(任意字符 可以占据0~N个字符) _ 通配符(必须占据一个位置 任意字符)
WHERE name LIKE '张_三' 这样可以查询 张三三 或者张小三等等 张三,张某某三查询不出来 但是张%三 是可以查询出张三 张某某三的
%张% 只要名字里面带有张的 都可以查询出来的 张% 这个就规定了必须以张开头
模糊查询 慢 网站的查询依靠搜索引擎 不依靠 模糊查询
零售价大于等于200 并且货品名称匹配 '%罗技m1__'
SELECT id,productName,die_id,salePrice FROM product WHERE salePrice >= 200 AND productName LIKE '%罗技m1__'
-->
<!-- 今日小结
记住mysql密码 存储引擎 int/bigint varchar/text decimal date/datetime bit
链接服务器 选择数据库 增删改
-->
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<!-- 对查询结果进行排序 ORDER BY
单列排序
ORDER BY
SELECT * FROM 'product' ORDER BY 'salePrice' DESC
ASC 升序 ORDER BY不跟排序规则就是升序 DESC 降序
格式:SELECT <selectList> FROM table_name WHERE 条件 ORDER BY 列名1 [asd/desc],列名2 [asd/desc]...;
没有排序规则就是升序 降序会特别说明的
多列排序
SELECT id,productName,dir_id,salePrice FROM product ORDER BY dir_id ASC,salePrice DESC;
这个是先按照你dir_id 进行升序排列 然后再升序的基础上 在进行各自的降序排列
列的别名排序 不能使用中文的别名进行排序 (别名不能加引号 加了引号则该别名排序无效)
需求 查需m系列并按照批发价进行排序(加上别名)
SELECT productName,salePrice * cutoff pf FROM product WHERE productName LIKE '%M%' ORDER BY pf ASC
执行顺序就是 先select 再执行的是 ORDER BY
DQL子句的执行顺序
先执行FROM子句 确定从哪表开始做查询 接着执行WHERE子句 立马过滤掉不合法的数据
再执行SELECT子句 选择最终需要显示哪些列 最后执行ORDER BY子句 对查询结果做排序操作
-->
<!-- mysql分页查询 LIMIT(限制的意思) 0,3 3,3 6,3 9,3
分页查询只是针对mysql来进行查询
设置每页最多3条数据 int pageSize = 3;
当前页的页码 int currentPage = 1;
SELECT * FROM 表名 LIMIT (currentPage - 1) * pageSize (表示从哪里开始截取 第一条数据的索引是0),pageSize(每页最多的条数pageSize);
第一页 SELECT * FROM 'product' LIMIT 0,3 第一页 SELECT * FROM 'product' LIMIT 3,3
第一页 SELECT * FROM 'product' LIMIT 6,3 第n页 SELECT * FROM 'product' LIMIT
这个当前页的页码肯定是用户传递过来的 用户通过点击获取当前页的页码进行传递 如果选择超过范围 mysql就会显示空集~
-->
<!-- 统计函数 (聚集函数/分组函数)
聚集函数作用于一组函数 并对一组数据返回一个值 操作多个函数返回一个值
COUNT 统计结果记录数 MAX(MIN) 统计计算最大(小)值(肯定是对数进行统计) SUM 统计计算求和 AVG 统计计算平均值
查询所有货品的平均零售价 SELECT AVG(salePrice) FROM product
查询商品总记录数 SELECT COUNT(*) FROM product SELECT COUNT(id) FROM product COUNT后面跟主键 主键唯一
查询分类为2的商品总数 SELECT COUNT(id) FROM product WHERE dir_id = 2
查询商品最小零售价 最高零售价 以及所有商品零售价总和 SELECT MIN(salePrice),MAX(salePrice),SUM(salePrice) FROM product
查询结果总数 最为常用 COUNT 知道了 就知道 pageSize 和 currentPage 了 一条用来查询结果集一条用来查询结果总数
在java中 查询结果总数 使用LONG类型来接收
带有排序操作的分页查询: 先排序再分页。 先排序 后分页 如果先分页后排序的话 会报错
按照零售价 升序排列 设置每页显示5条数据 SELECT id,productName,salePrice FROM product ORDER BY salePrice ASC LIMIT 0,5
-->
<!-- 多表查询 设计表的时候 只会设计当前页面所具有的信息
单表查询 从一张表中查询数据 SELECT <selectList> FROM 表名
多表查询 从多张表中联合查询出数据 SELECT <selectList> FROM 表名A,表名B (最简单的)
(需要查询多张表中的数据 此时通过一张表是不能查询完整的 只能联合起来查询)
SELECT * FROM employee SELECT * FROM department
笛卡儿积 SELECT * FROM employee,department 一般都是两张表连接的概念(12和1再和3连接)
实际运行环境中 应避免使用全笛卡尔集 使用等值连接 (消除笛卡儿积就要消除等值连接)
解决方案 在WHERE加入有效的连接条件--等值连接 注意:连接n张表 至少需要n-1个连接条件、
这样就消除笛卡儿积了:
SELECT * FROM employee,department WHERE employee.deptno = department.deptno
SELECT * FROM product,productdir where dir_id = productdir.id;(因为dir_id是唯一的 所以前面不加前缀也是可以的)
-->
<!-- 外键约束
员工表里的值 必须来源于 部门表里的值
employee 表中的值deptno列的值不能乱写 必须来源于 department表中的主键列(deptno) 此时 我们把这种约束 就称为 外键约束
主键约束 (约束当前表中的指定列的值非空且唯一(主键列))
外键约束 (a表中的外键列的值必须来源于b表中的主键列)
注意 在mysql中 innodb支持事务和外键 修改表的存储引擎为innodb ALTER TABLE 表名 ENGINE = 'innoDB';
要加外键约束 就要进行设计表
在navicat中 点击表 然后点击设计表 点击外键
名(不管) 栏位(将谁作为外键) 参考数据库 参考表 然后再点击参考栏位
增加外键 必须修改 表的存储引擎 ALTER TABLE 表名 ENGINE = 'innoDB'; 在设计表中点击选项 也可以修改引擎
在添加外键的时候 就会检查表中数据是否符合外键约束 如果不符合 就添加不成功
没有值的时候是可以进行添加的和连接另外一张表的
CONSTRAINT 'product_ibfk_1' FOREIGN KEY ('dir_id') REFERENCES 'productdir' ('id')
在开发中外间列起名字 一般是 所引用表名_所引用列名 productdir_id(允许简写dir_id)
外键约束不是用来约束查询的 而是用来约束在添加值的时候不用乱添加
-->
<!-- 多表查询练习
隐式内连接查询
使用表名前缀在多个表中区分相同的列 product.id 可以使用别名进行简化查询
需求:查询货品id 货品名称 货品所属分类名称
SELECT product.id,productName,dirName FROM product,productdir WHERE product.dir_id = productdir.id ;
SELECT p.id,productName,pd.dirName FROM product p,productdir pd WHERE p.dir_id = pd.id; 消除笛卡儿积
查询零售价大于200的无线鼠标
SELECT * FROM product p, pd WHERE p.dir_id = pd.id AND p.salePrice >= 200 AND pd.dirName = '无线鼠标';
查询零售价大于200的无限鼠标(使用表的别名)
SELECT * FROM product p,productdir pd WHERE p.dir_id = pd.id AND p.salePrice >= 200 AND pd.dirName = '无线鼠标';
查询每个货品对应的分类以及对应的库存
SELECT p.productName,pd.dirName,ps.storeNum FROM product p,productdir pd,productstrock ps
WHERE p.dir_id = pd.id AND ps.product_id = p.id
如果库存货品都销售完成 按照利润从高到底查询货品名称 零售价 货品分类(三张表)
SELECT p.productName,p.salePrice,pd.dirName,(p.salePrice - p.costPrice) * ps.storeNum lirun
FROM product p,productdir pd,productstrock ps
WHERE p.dir_id = pd.id AND ps.product_id = p.id
ORDER BY lirun DESC
多玩两张表查询 玩熟悉了 再玩三张表查询
自连接查询 就是看鼠标包括 有线无线 然后这俩各自对应的都是鼠标分类
把一张表看成两张表来做查询 名字一样 别名不一样 一张只存储了一些 另一张表存储另一张表
需求 查询每个商品分类的名称和父分类名称: child.parent_id = parent.id
SELECT child.id,child.dirName,parent.dirName
FROM productdir child,productdir parent
WHERE child.parent_id = parent.id
本质是也是多表查询 先画图再写sql语句 先理解最好
-->
<!-- mysql的数据 备份和恢复
在该企业数据库之前,请先备份。
mysql自身的数据库备份
通过cmd命令进入dos窗口:
1.导出 mysqldump -u账户 -p密码 数据库名称>脚本文件存储地址
mysqldump -uroot -p123456 user>C:/shop_s.sql
2.导入 mysql -u账户 -p密码 数据库名称<脚本文件存储地址
mysqldump -uroot -p123456 user<C:/shop_s.sql
Navicat工具的导入导出 sql文件来存储 (通用一些)
选中数据库 鼠标右键 转储sql文件 选择地址就可以了导出了 删除因为有外键所以需要先删除一个后删除一个
选中数据库 鼠标右键 运行sql文件 选择文件 然后点击选择路径 然后点击选中文件 然后刷新就可以导入了
Navicat工具的备份还原
选中数据库 然后下面有个备份 然后点击备份 新建备份 开始 复制那个信息记录 ctrl+c ctrl+v到地址就可以了
点击数据库 备份 然后还原备份 找到文件地址 打开 开始 是 就可以了 文件地址名称为时间格式
工具的备份 使用psc格式的文件 必须工具支持才运行还原
-->
sql增删改查
列的常用类型以及对应后端类型 表的创建和常见约束*(主键 外键 唯一) FROM仔细看看增删改查有没有FROM
查询操作(笛卡儿积 消除笛卡儿积 外键约束 简单的多表查询 ) 备份以及恢复
</body>
</html>
网友评论