数据库知识大纲
D:数据
DB:数据库 一批数据构成的有序集合
DBMS:数据库管理系统
RDBMS:关系数据库管理系统
windows命令行
登录 :mysql -u用户名 -p密码 或 mysql -u用户名 -p回车,不显示密码
登出:exit或quit
登录其他账号 :mysql -u用户名 -p密码 -h机器 -P端口号
右键,命令行界面 分号结束 回车执行。只有退出和登录的时候不用加分号
show databases; 查看当前数据库
字符集 charset=utf8 注意没有 -
show variables like'char%';查看字符集 show variables; 查看配置变量
修改字符集:核心配置文件 my.ini (2个)编码:ANSI
自动创建在系统目录 位置C:\ProgramData\MySQL\MySQL Server 5.6
mysql的安装目录 位置C:\Program Files\MySQL\MySQL Server 5.6 自己新建一个my.ini文件。内容: [client]
default-character-set=utf8
.ini 文件 可以用记事本打开 #是注释
[mysql] 和 [mysqld] 模块下面的 default-character-set=utf8 取消注释
配置文件修改后应该重启服务restart
– 单行注释 /* */ 多行注释
information_schema系统数据库中 schemata 表中 存储了所有数据库的基本信息
use information_schema; --选中当前数据库才能查看
SELECT * FROM SCHEMATA; -- 查看数据库基本信息
character set utf8 –设置字符集为utf8
collate 数据库字符集的比较方式:
修改数据库字符集:alter database 数据库名 character set utf8;
修改完数据库字符集,需要重启mysql数据库。
- 显示数据库:show databases;
- 显示数据库创建语句:show create database db_name;
- 查看当前数据库 :select database();
- 切换当前数据库 :use db_name;
- 删除数据库:drop database db_name;
- 修改数据库:alter database db_name;
备份数据表中的数据(在windows下cmd执行,不是在mysql里面执行):
mysqldump -u用户名 -p密码 数据库名 > d:/文件名.sql(位置)【在非登录命令下进行】
恢复数据库(mysql命令):
Source 文件名.sql【登录,先选择要恢复到的数据库use 数据库名;】
可视化:转储(备份) 运行sql文件(恢复)
MySQL中的数据用各种不同的技术存储在文件(内存)中的配置文件my.ini指定了默认存储引擎 default-storage-engin=INNODB
常用引擎:
创建:create table 表名( 列名 类型 约束,列名2 类型…);每列之间用,隔开 最后一列不加逗号
删除:drop table 表名;
查看表结构:desc 表名;
查看表详细结构:show create table 表名;
外键是表级别的约束条件,定义完列之后写:
[constraint 外键名] FOREIGN KEY (列名1 [ ,列名2,…]) REFERENCES (主键列1 [ ,主键列2,…])
自动增长:ALTER table 表名 modify 列名 数据类型 auto_increment;
一个表中,最多有一个自动增长列 。 自动增长列必须有索引。主键/外键是一种索引
create index 索引名 on 表名(列名)--添加普通索引
删除唯一 不能使用 unique
对象级别的删除用drop
,数据删除用delete
查看 主/外键约束名 show create table 表名;
删除有关联的数据库:先删除外键,才能删除列;或者删除主表才能删除列
显示宽度不够补空格 建表时设置zerofill 补0;超过显示宽度,按实际宽度显示,与存储大小无关。
float double 不准确
定点数类型:decimal (以字符串形式存储) decimal(精度,标度) 精度:总长度 标度:小数位数 ,float double都会四舍五入,但是decimal会警告信息。 准确存储银行数据
show variables like "%time_zone%"; -- system 系统时区 东八区
set time_zone = '+10:00'; -- 改为 东10区 -8:00 西八区
datetime,timestamp类型都可以 插入null,插入null时会取默认值
datetime的默认值为null,timestamp的默认值不为null,且为系统当前时间
char 固定长度; 存储时会删除末尾的空格; 超过给定长度会被截取 。适合存储短字符
varchar 可变长度; 需要使用1或2个额外字节记录字符串的长度。适用于字符串列的最大长度比平均长度大得多。
enum 枚举类型:列值是单个给定的枚举值,允许空值; 最多有65535个数据
set 集合,允许选定多个给定的set值,允许空值。最多有64个数据
主键 插入值null表示不给它赋值,采用 auto_increment
区别 存储数据大小的不同。blob 类型是一种特殊的二进制类型,可以存储数据量很大的二进制数据,如图片和音频文件。 但是数据库中一般不直接存图片,音频文件,存储的是路径
注意:
数据类型的选择和引擎也有关系
严格模式(sql_mode属性):把数据插入数据库时进行严格检查,相反为宽松模式查询
会话级别:select @@sql_mode; select @@session.sql_mode;
关闭会话失效
服务级别:select @@global.sql_mode;
重启服务失效
永久级别:直接修改my.ini 配置文件
一般在生产过程中,不会重启服务。所以想要永久,更改服务级别即可。
修改: set sql_mode=xxx ; set session_sql_mode=xxx; set global.sql_mode=xxx;
select 表达式; 运行可以显示结果
is NULL 判断是否为null
between and 包含两个边界值
least() 返回最小值
like 通配符匹配
REGEXP 正则表达式 [ ] 多选一
异或:XOR 相同为0 不同为1
运算符的优先级:算数>关系>逻辑
insert into 表名(字段1,字段2…….)values(值1,值2……);
-- 值与字段名相匹配,不必与创建表时列的顺序一致。
全列值插入(每列都插入值时),列名列表可以省略不写 :
insert into 表名 values(…….);
-- 值的顺序必须与创建时列的顺序,个数,类型一致。
非全列值插入(部分列插入) ,必须写列名列表。
一条语句插入多条记录:每条记录用()括起来,记录之间用逗号隔开。
insert into 表名(字段1,字段2)values(值1,值2) 【,(值1,值2),(值1,值2)…】
有默认值 但是未知时 可以插入null
set 设置值 where 条件限定
update 表名 set 字段名=‘值’; //将所有记录的该字段名都改变了
update 表名 set 字段名1=‘值1’[,字段名2=‘值2’…… ] where sname=’zhangsan’;
条件语句中 使用主键字段(非空唯一)特指某一条记录
delete from 表名; -- 删除所有记录 清空表 可以加条件 中间没有 *
delete from 表名【 where 删除的条件】;-- 删除指定数据
truncate table 表名;-- 清空表 执行效率高
单表查询
可以查询列 常量 表达式 函数。SELECT ‘aaa’; SELECT 5+3; SELECT now();
SELECT * FROM 表名; * 查询所有字段
SELECT 字段名1【,字段名2……】 FROM 表名;
多个条件之间使用逻辑运算符(and or )连接。不能用逗号
带in关键字的查询: in(值1,值2,……) 后面多选一
< > 不等于
NOT 取反
order by 字段名 DESC; 降序 ASC 升序 (默认)
多列排序(指定多个排序规则):
order by 字段名1,字段名2 DESC;先按字段名1排序,再按字段名2排序。
按 字符串 排序 相同名字开头的会排到一起
ORDER BY 子句 应位于 SELECT语句的结尾
count(*) – 查询一共有多少条记录
count(字段名) – 查询 该列有多少条 非空记录,忽略空值行
可以多字段分组:GROUP BY 字段名1,字段名2
HAVING 对分组之后的结果 过滤 不能使用 where(对分组之前的数据过滤)
WITH ROLLUP 在最后一行进行统计 ,写在having语句前**,不能与ORDER同时使用**
LIMIT [位置偏移量,] 行数 等价于 LIMIT 行数 OFFSET 位置偏移量
SELECT * from 表名bLIMIT 4;
内连接
不做任何限定,结果是两个表的乘积,即笛卡尔积
笛卡尔积:表1,表2 添加两个表的连接条件(外键)
外连接
左外连接 left outer join 保证左表的数据完整地出现在结果中 outer可以省略
右外连接 right outer join 保证右表的数据完整地出现在结果中
复合条件连接查询
子查询-嵌套的select
ANY( ) 任意一个 ALL()所有
where exists(…) 判断是否有结果 有->true 没有 false
not exists()
in()
not in()