前景概要
需要下的文件
sql脚本
适用于:4.1以上的版本
基本概念
数据库:
- 概念: 保存有组织的数据容器
表:
- 概念:是一种结构化的文件,可用存储某种特定的类型的数据
- 表名:用来表示自己的用途,且当前数据库表明不能重复
- 列: 表中的一个字段,用于存储特定的信息
- 行:即代表表中存储的一个记录
主键:
- 概念:用于唯一区分表中每一个行.(一般都是字段ID)
- 好处: 便于后期数据的管理和操纵
- 适用主键的字段:
- 任意两行度不具有相同的主键值
- 每个行都必须有一个主键,且主键不能为空
- 属于MySql第一范式,
- 复合主键
- 概念:可以以多个列作为主键使用
- 要求:所有列值的组合必须唯一,单个列的值可以不唯一
MySql简介
一.mysql的优点:
- 成本: 免费
- 性能:执行效率高
- 可信赖:很多企业都在使用MySql来处理自己重要的数据
- 简单: 便于上手
二.mysql基于客户机-服务器的数据库库
- 负责所有数据访问和处理的一个软件,而这个软件则运行在称为数据库服务器的计算机上
- 服务器: 关于数据处理
- 客户机:与用户交互的软件
三:安装:
- 略:
四:MySql的连接
- 使用cmd登录命令
- mysql -P 3306 -h localhost -u root -p
- -P :端口号 :默认为3306端口
- -h :ip : localhost:即本地连接到MySql服务器
- -u :用户名
- -p :密码
- mysql -P 3306 -h localhost -u root -p
- 选择数据库
- USE 数据库名 ;
- 查看所有数据库
-SHOW DATABASES; - 进入数据库,获取该数据库中所有的表
- SHOW TABLES;
- 显示表的结构
- SHOW COLUMNS FROM 表名;
- TYPE: 数据类型
- NULL:是否为空
- Key : 键的信息
- Default: 默认值
- Extra:其他信息
- auto_increment:自增
-支持DESCRIBE语句
- auto_increment:自增
- DESCRIBE 表名 ; 与前者效果相同
- SHOW COLUMNS FROM 表名;
- 其他命令
- SHOW STATUS: 显示服务器的信息
- SHOW GRANTS; 用于显示授权用户的安全权限
- SHOW ERRORS 和SHOW WARNINGS 显示服务的错误与警告
检索数据
- 常见的问题
- 通配符 * 的使用
- 一般尽量少使用通配符,不明确所需的列,通常降低检索和应用程序的性能
- 好处:检索未知列
- distinct 去重关键字
- DISTINCT:关键字应用于所有的列,因此如果查询多个列时使用 ,除非你查询所有的列属性相同才去重
- limit 关键字 限制查询
- 检索的起始小标为 0
- order by 排序
- 默认是顺序(ASC) 可以设置为倒序(DESC
- 如果排序有多列,按照层级目录依次排序
- 使用查询顺序:
from xx
order by xxx
limit xxxx
过滤查询 where
-
空值查询(IS NULL 和 IS NOT NULL)
- 用途: 过滤NULL
- NULL 并非空字符串,0 仅仅作为特殊的值
-
NOT 的使用
- 使用条件: MYSQL 支持 IN , BETWEEN 以及 exists 字句中取反使用
-
like 通配查询
%
:表示 0 - n 个字符通配-
: 表示 一个占位符- 注意事项: 不要过度使用
-
查询顺序
from xxx
where xxx
order by xxx
函数的使用
- CONCAT() 用于 多条数据的拼接或者拼接常量
- LTRIM() 和RTRIM() 用于去出除(左)右多余空格 ,但对内容不影响
- Upper() :将查询列的值转成大写
- Lower() :将查询列的值转成小写
- length():返回字符串的长度
- 聚集函数的使用
- AVG() 自动忽略NULL值
- COUNT()
- COUNT(*) 统计表中的行的数目,无视是否为NULL值
- COUNT(Column) 对指定列的进行行的计数,自动忽略NULL值
- MAX():自动忽略NULL, 如果用于文本,则返回最后一行
- MIN():自动忽略NULL,与MAX相反
- SUM();自动忽略NULL
- 和 DISTINCT 搭配使用
- 事例:select AVG(DISTINCT prod_price) AS AVG_PRICE
分组查询
group by 常与 having 搭配使用
- 顺序
select xxx
from xxx
where xxx
group by xxxx
having xxx
order by xxxx
limit xxxx
子查询
-
场景一:
- Q:绝不能将顾客的清单和订单的清单存储在一张表
- A:造成检索和访问困难,应该创建两张表
-
场景二:
- Q:不要使用MySql的关键字去命名一张表或列
- A:可能导致数据库的报错,如果已经使用该关键字,需使用()将该字段引起(例如 -
order
,esc下面的的按键(很遗憾无法显示))
-
场景三:
- Q:where 子句何时使用单引号
- A: 如果操作的列 比较的是 字符串类型 ,则需将值引起,如果是数值则无需引起
- 事例: where name = ‘zsf’
-
场景四:
- Q :where id =32 or id =33 and name =‘zsf’;
- A:查询出结果可能报错,由于and 优先级高于 or ,因此查询时不要吝啬的使用小括号,消除不必要的歧义
-
场景五:
- Q: 使用 where name like ‘%zs’ ;
- A: 无法查找到
zsf
对象 ,很有可能zsf
时后尾多了空格
-
场景六:
- Q: 当你查询某一天的订单,然而订单日期为datetime,无法通过 where order_date = ‘2005-01-01’
- A: 你需使用到 date() 日期函数 where Date(order_date )= ‘2005-01-01’
- A: where Date(order_date) Between ‘2005-01-01’ AND ‘2006-10-01’ 查询这个时间段
- A: where Year(order_date)=2005 AND Month (order_date) = 9; 查询 2005年 9月
-
场景七:
- Q: where 和having的区别
- A: where 过滤的是行而并非分组 (属于分组之前), 而having 基于group by分组之后进行过滤 (分组之后),having 可以使用聚合函数 ,而where 则无法使用