数据类型(列类型)
DDL-数据定义语言
DML-数据操作语言
DCL-数据控制语言
DQL-数据查询语言
source命令的备份与还原
数据库约束
表关系
三范式
多表查询
- DDL(Data Definition Language):数据定义语言
创建、删除、修改:库、表结构- DML(Data Manipulation Language):数据操作语言
增、删、改:表记录- DCL(Data Control Language):数据控制语言
用来定义访问权限和安全级别- DQL(Data Query Language):数据查询语言
用来查询记录(数据)
show variables like ‘character%’;:查看mysql当前使用的编码
//写多条语句时,需要加BEGIN和END
//默认情况下, 在CMD中操作mysql遇到分号也就是;就会认为语句结束了。
在创建存储过程中有许多分号,因此需要先执行一个DELIMITER //语句,将//作为语句结束的字符 delimiter是mysql分隔符,在mysql客户端中分隔符默认是分号,如果使用delimiter设置了其他的分隔符,再重新设置回分号即可。命令 delimiter ;
数据类型(列类型)
int:整型
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数
decimal:浮点型,在表单钱方面使用该类型,因为不会出现精度缺失问题
char:固定长度字符串类型:char(255),数据长度不足指定长度,补足到指定长度
varchar:可变长度字符串类型;varchar(65535),数据长度不足不会补足空格
text(clob):字符串类型:mysql独有的
blob:二进制数据存储,字节类型
date:日期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
timestamp:时间戳类型,既有时分秒,又有年月日
DDL-数据定义语言
DDL之操作数据库:数据库或表的结构操作([]中都是可选) > - SHOW DATABASES;:查看所有数据库 > - USE 数据库名称;:进入数据库 > - CREATE DATABASE [IF NOT EXISTS] 数据库名称 [CHARSET=utf8];:创建数据库 > - DROP DATABASE [IF EXISTS] 数据库名称;:删除数据库 > - ALTER DATABASE 数据库名称 CHARACTER SET utf8;:修改数据库编码DDL之操作表:
- CREATE TABLE 表名 (列名 列类型,列名 列类型, …);:创建表
- SHOW CREATE TABLE 表名;;查看指定表的创建语句
- SHOW TABLES;:查看当前库的所有表
- DROP TABLE 表名;:删除表
- DESC 表名;:查看表结构
- ALTER TABLE 表名 RENAME TO 新表名;:重命名表名
- ALTER TABLE 表名 ADD 列名 列类型, ADD 列名 列类型,…;:添加列
- ALTER TABLE 表名 DROP 列名:删除列
- ALTER TABLE 表名 MODIFY 列名 列类型;:修改列类型
- ALTER TABLE 表名 ADD PRIMARY KEY(列名);:给表添加主键,删除把add改为drop
- ALTER TABLE newcar CHANGE id id int(11) NOT NULL AUTO_INCREMENT;:修改mysql表的字段为自增长
- CREATE PROCEDURE all_stu() select * from stutbl;:创建存储过程查询某表所有数据
- ALTER TABLE 表名 character set 字符集;:修改字符集
DML-数据操作语言
DML之增、删、改数据
- 插入数据:
插入记录总是插入一行,未给定值的都插入NULL
INSERT INTO 表名(列名,列名,…) values (‘列值’,‘列值’,…);:按对应的列名插入值
INSERT INTO 表名 values (‘列值’,‘列值’,…):按表的顺序插入值
CREATE TABLE student2 LIKE student;:创建表student2结构和student一样
INSERT INTO student2(name,age) SELECT name,age FROM student;:将student中的name,age字段数据插入到student2- 修改数据:
UPDATE 表名 SET 列名1 = ‘列值1’ [WHERE 条件]:修改数据
运算符:=、!=、<>,BETWEEN … AND …,NULL,IN(…)、IS NULL、NOT、OR、AND- 删除数据:
DELETE FROM 表名 [WHERE 条件]:删除数据,不加条件数据全部被删除
TRUNCATE TABLE 表名;:删除表记录
truncate和delete的区别:
1. delete是将表中的数据一条一条删除
2. truncate是将整个表摧毁,重新创建一个新的表,新的表结构和原来表结构一模一样
DCL(理解)-数据控制语言
* 一个项目创建一个用户!一个项目对应的数据库只有一个! * 这个用户只能对这个数据库有权限,其他数据库你就操作不了了!
- 创建用户
* CREATE USER ‘用户名’@‘IP地址’ IDENTIFIED BY ‘密码’;
用户只能在指定的IP地址上登录
* CREATE USER ‘用户名’@’%’ IDENTIFIED BY ‘密码’;
用户可以在任意IP地址上登录- 给用户授权
* GRANT 权限1,…,权限n ON 数据库.表名 TO 用户名@IP地址;
权限、用户、数据库
给用户分派在指定的数据库上的指定的权限
* GRANT ALL ON 数据库.* TO 用户名@IP地址
给用户分派指定数据库上的所有权限- 撤销权限
* REVOKE 权限1,…,权限n ON 数据库.* FROM 用户名@IP地址;
撤销指定用户在指定数据库上的指定权限- 查看权限
* SHOW GRANTS FOR 用户名@IP地址
查看指定用户的权限- 删除用户
* DROP USER 用户名@IP地址
DQL-数据查询语言
----查询不会修改数据库表记录!
一、 基本查询
- 查询所有列
SELECT * FROM 表名;
例:SELECT * FROM emp;
–> 其中“*”表示查询所有列- 指定列查询
SELECT 列1[,列2,…,列n] FROM 表名;
例:SELECT empno,sal FROM emp;- 完全重复的记录只显示一次
列名前加关键字 DISTINCT
当查询结果中多行记录一模一样时,只显示一行
SELECT DISTINCT * | 列1[,列2,…,列n] FROM 表名;
例:SELECT DISTINCT sal FROM emp;
–> 显示emp表中的工资,如果存在相同的工资只显示一次- 列运算
4.1 数量类型的列可以做加、减、乘、除运算
SELECT sal*1.5 FR0M emp;
SELECT sal+ifnull(comm,0) FROM emp;
--> 必须是数值类型,字符型则等于0
4.2 转换NULL值
> 任何类型跟NULL相加还是NULL,要想相加,则需要用函数IFNULL(列名,值);
--> 有时需要把NULL转换成其他值,如com+1000时,如果com列存在NULL值,那么NULL+1000还是NULL,而我们希望把NULL当0来运算SELECT IFNULL(comm,0)+1000 FROM emp;
--> IFNULL(comm,0):如果comm中存在NULL值,那么当成0来运算。
4.3 字符串类型做连续运算
> 函数CONCAT(‘str1’, ‘str2’[列名], …,)
例:SELECT CONCAT(‘我叫’,ename,‘我的工作是’,job) AS 介绍 FROM emp;
4.4 给列起别名
> SELECT 列名 AS 新列名(AS可以省略) FROM 表名;
-->SELECT ename 姓名,job 职业 from emp;
二、条件查询
- 条件查询
与UPDATE、DELETE语句一样,SELECT语句也可以使用WHERE字句来控制记录。
- 模糊查询
模糊查询需要使用运算符:LIKE, 匹配一个任意字符, %匹配多个任意字符
例:SELECT * FROM emp WHERE ename LIKE '张’;
–> 查询姓张,名字只有一个字的人
SELECT * FROM emp WHERE ename LIKE ‘张%’;
–> 查询姓张,名字有一个或几个字的人
SELECT * FROM emp WHERE ename LIKE ‘%小%’;
–> 查询名字里含有小字的人 - 一些等价和注意的东西
WHERE age >= 18 AND age <= 80 等价于 WHERE age BETWEEN 18 AND 80
WHERE name=‘zhangsan’ OR name=‘lisi’ 等价于 WHERE name IN(‘zhangsan’,‘lisi’)
WHERE age IS NULL,不能使用等号
WHERE age IS NOT NULL
三、排序
- 升序
SELECT * FROM 表名 ORDER BY 列名 ASC;
–> ASC的全写是Ascend,可以省略 - 降序
SELECT * FROM 表名 ORDER BY 列名 DESC;
–> DESC的全写是Descend,不可以省略 - 使用多列作为排序条件
在第一列中存在重复值时,引入第二列排序或第n列排序
SELECT * FROM 表名 ORDER BY 字段名1 ASC,字段名2 DESC;
四、聚合函数
- COUNT
SELECT COUNT(*) FROM 表名
–> 计算表中一行中任意一列不为NULL的记录的行数
SELECT COUNT(列名) FROM 表名
–> 计算表中的列不为NULL的记录的行数 - MAX
求列中的最大值
- MIN
求列中的最小值
- SUM
查询一列的和
例:SELECT SUM(sal) 总和 FROM emp; - AVG
查询一列的平均数
例:SELECT COUNT(*) 人数,SUM(sal) 工资和,MAX(sal) 最高工资,MIN(sal) 最低工资 FROM emp;
五、分组查询
分组查询是把记录使用某一列进行分组,然后查询组信息。
mysql语法顺序:
select [distinct] 列名,聚合函数(*不能含有其他列)
from 表名
[join(如left join)]
[on]
[where 条件] -> 这是分组前筛选
[group by] 列名
[having 条件:一般为聚合函数] -> 这是分组后筛选
[union]
[order by 列名或聚合函数 ASC或DESC]
[limit 子句]
mysql执行顺序:
from
on
join
where
group by
having
select
distinct
union
order by
例:SELECT sal,count() FROM emp WHERE sal>10000 GROUP BY deptno HAVING count()>=2 ORDER BY deptno DESC;
having和where的区别
- having是在分组后对数据进行过滤;where是在分组前对数据进行过滤
- having后面可以使用聚合函数;where后面不可以使用聚合函数
六、limit子句(方言)
只能在mysql中使用
LIMIT用来限定查询结果的起始行,以及总数行。起始行计算方法:(当前页-1)*每页记录数
LIMIT offset,length(其实就是从第0行开始跳过offset条,查询之后的length条数据)
例:SELECT * FROM emp LIMIT 0,5;
–> 其中0表示从第一行开始,显示五条记录
source命令的备份与还原
备份格式: `mysqldump -u用户名 -p密码 数据库 > 文件的路径` 还原格式: `SOURCE 导入文件的路径` 注意:还原的时候需要先登录mysql,并选中对应的数据库数据库约束
约束种类有:
PRIMARY KEY
:主键UNIQUE
:唯一NOT NULL
:非空DEFAULT
:默认FOREIGN KEY
:外键
- 主键
特点:主键必须包含唯一的值,且主键不能为空
创建方式:在创建表的时候给字段添加主键
格式:字段名 字段类型 PRIMARY KEY
删除主键:ALTER TABLE 表名 DROP PRIMARY KEY;
主键自增:
格式:字段名 字段类型 PRIMARY KEY AUTO_INCREMENT
默认自增值为1,若修改起始值则:
格式:ALTER TABLE 表名 AUTO_INCREMENT = 起始值
DELETE和TRUNCATE的区别扩展:
DELETE 删除表中的数据,但不重置AUTO_INCREMENT的值;TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1 - 唯一
格式:字段名 字段类型 UNIQUE
- 非空
格式:字段名 字段类型 NOT NULL
- 默认值
格式:字段 字段类型 DEFAULT 默认值
一张表中某个字段设置了非空与唯一约束,该字段与主键的区别:1、一张表只有一个字段可以设置成主键。2、一张表可以有多个字段非空与唯一约束。3、主键可以自动增长,非空与唯一约束的字段不能自动增长 - 外键
外键约束:一张从(副)表中的某个字段引用另一个主表的主键,其中主表用于约束别人,从表使用别人的数据,被别人约束
新建表时增加外键:
[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名) [ON UPDATE CASCADE] [ON DELETE CASCADE]
修改表时增加外键:
ALTER TABLE 表名 ADD CONSTRAINT 外键约束名称 FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)
外键级联:在修改和删除主表的主键时,同时更新或删除副表的外键值
ON UPDATE CASCADE
– 级联更新,主键发生更新时,外键也会更新
ON DELETE CASCADE
– 级联删除,主键发生删除时,外键也会删除
表关系
一对多建表原则:在从表(多)创建一个字段作为外键指向主表(一)的主键
多对多建表原则:形成中间表,两个表为主表(一),中间表为从表(多),形成两个一对多关系
一是主,多是从,哪个表有外键哪个是从
一对一建表原则:两种,在实际的开发中应用不多.因为一对一可以创建成一张表。
1.外键唯一:主表的主键和从表的外键(唯一),形成主外键关系。
2.外键是主键:主表的主键和从表的主键,形成主外键关系。
三范式
第一范式:每一列都不能再拆开
第二范式:一张表只描述一件事情、表中的每个字段都依赖于主键
如果不遵守第二范式,数据冗余,相同数据无法区分。通过第二范式减少数据冗余,通过主键区分相同数据。
第三范式:使用主外键方式关联,而不是使用非主键关联
主键(非业务字段) 非主键(业务字段)
多表查询
多表查询步骤:
- 确定表
- 确定关联关系
- 需要查询哪些字段
- 内连接:用左边表的记录去匹配右边表的记录,如果符合条件的则显示(两表的交集)
隐式内连接:看不到JOIN
关键字,条件使用WHERE
指定
SELECT 字段名 FROM 左表,右表 WHERE 条件;
显式内连接:使用INNER JOIN ... ON
语句,可以省略INNER
SELECT 字段名 FROM 左表 INNER JOIN 右表 ON 条件
- 左外连接:用左表的记录去匹配右边表的记录,符合条件则显示;否则显示NULL(在内连接基础上保证左表数据全部显示)
使用LEFT [OUTER] JOIN ... ON
,OUTER
可以省略
SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件;
- 右外连接:用右表的记录去匹配左边表的记录,符合条件则显示;否则显示NULL(在内连接基础上保证右表数据全部显示)
使用RIGHT [OUTER] JOIN ... ON
,OUTER
可以省略
SELECT 字段名 FROM 左表 RIGHT [OUTER] JOIN 右表 ON 条件;
- 子查询
子查询结果如果只是要单列,肯定在WHERE后面作为条件(多行时父查询用IN运算符)
SELECT 查询条件 FROM 表 WHERE 字段=(子查询);
子查询结果如果是要多列多行,肯定在FORM后面作为条件
SELECT 查询条件 FROM (子查询) 表别名 WHERE 条件
mysql拷贝数据
详细:https://www.cnblogs.com/lyjing/p/8483742.html
复制表结构:
CREATE TABLE 新表名 LIKE 旧表名
复制表数据:
CREATE TABLE 新表名 AS (SELECT * FROM 旧表名)
或 INSERT INTO 新表名 (SELECT * FROM 旧表名)
真正的复制一个表(表结构和表数据):
CREATE TABLE 新表名 LIKE 旧表名
CREATE TABLE 新表名 AS (SELECT * FROM 旧表名)
或 INSERT INTO 新表名 (SELECT * FROM 旧表名)