MySQL
关系型数据库
oracle db2 mysql sql
非关系型数据库
redis memche mongodb nosql
cmd进入
mysql -uroot -p
打密码
sql语句分类
DML
添加、修改、删除、查询
DCL
用户、权限、事务
DDL
逻辑表、数据表、视图、索引
用户管理DCL
添加用户、设置权限
表操作DDL
#查全部表
show tables;
#查某表
desc xxx;
#创建表
CREATE TABLE student(
列名 数据类型 [约束] [注释]
id INT UNSIGNED PRIMARY KEY,
name VARCHAR(20) NOT NULL,
sex CHAR(1) NOT NULL,
birthday DATE NOT NULL,
tel CHAR(11) NOT NULL,
type ENUM("","","") NOT NULL, #选择输入
INDEX [索引名称] (列名)
INDEX idx_type(name) #创建索引
)[注释];
#插入数据
insert into student values(1,"","","","","");
#删除表
drop table xxx;
#插入列
alter table student
列1 数据类型 [约束] [注释]
add address VARCHAR(200) NOT NULL,
add home CHAR(11) NOT NULL;
modify home VARCHAR(20) NOT NULL; #修改列数据类型
change 列名 新列名 数据类型 [约束] [注释],...;#修改列名称
change home home_add VARCHAR(200) NOT NULL;
drop 列1,...;#删除列
CREATE INDEX 索引名称 ON 表名(列); #创建表索引
ALTER TABLE 表名 ADD INDEX [索引名](列名); #增加表索引
SHOW INDEX FROM 表名; #查看表索引
DROP INDEX 索引名称 ON 表名; #删除表索引
字段约束
第一范式:原子性
第一范式是数据库的基本要求,不满足这一点就不是关系数据库
数据表的每一列都是不可分割的基本数据项, 同一列中不能有多个值,也不能存在重复的属性。
第二范式:唯一性
数据表中的每条记录必须是唯一的。为了实现区分,通常要为表加上一个列用来存储唯一标识,这个唯一属性列被称作主键列
第三范式:关联性
每列都与主键有直接关系,不存在传递依赖
依照第三范式,数据可以拆分保存到不同的数据表,彼此保持关联
约束名称 | 关键字 | 描述 |
---|---|---|
主键约束 | PRIMARY KEY | 字段值唯一,且不能为NULL(一定要使用数字,检索快) |
非空约束 | NOT NULL | 字段值不能为NULL |
唯一约束 | UNIQUE | 字段值唯一,且可以为NULL |
外键约束 | FOREIGN KEY | 保持关联数据的逻辑性 |
库查询DDL
#使用某库
use xxx;
#创建库
create database xx;
#显示某库
show database xx;
基本查询DML
查什么看最后的输出要求,其他都是限定条件
select *(全部列) from t_emp(表);
select empno,ename,sal(想要的列) from t_emp;
#起别名
select
empno,
sal*12 as "income"
from t_emp;
#顺序 from-->select
#数据分页
select ... from ... limit 起始位置,偏移位置;
select empno,ename from t_emp LIMIT 1,10; #从1开始输出10条
select empno,ename from t_emp LIMIT 10;#默认起始0,输出10
#顺序 from-->select-->limit
#排序 order by
select ... from ... order by ...
select empno,ename from t_emp order by empno(要排序的列,可以多个列) ASC; #ASC代表升序,DESC代表降序
#排序加分页 limit,order by
select empno,ename from t_emp order by empno ASC limit 5;
#顺序 from-->select-->order by-->limit
#去重关键字
select DISTINCT job from t_emp;#只能加最前面,只能使用一次
库高级查询
#聚合函数---永远不能出现在where字句里
AVG() 非空值的平均值
SUM() 总和
MAX() MIN() 非空的最大值 最小
COUNT(*) 包含空值的记录数 COUNT(列名)包含非空值的记录数
#分组查询---有group by字句,select中只能出现聚合函数,或者group by的分组列(防止数量不匹配)
select deptno,AVG(sal) from t_emp group by deptno; #group by 结果按部门编号分组
SELECT deptno, job, COUNT(*) , AVG(sal) FROM t_emp GROUP BY deptno, job ORDER BY deptno;#group by,orderby 逐级分组
SELECT deptno, COUNT(*),AVG(sal) ,MAX(sal) , MIN(sal) FROM t_emp GROUP BY deptno WITH ROLLUP; #WITH ROLLUP 对分组结果再次汇总运算
SELECT deptno, GROUP_CONCAT (ename) , COUNT (*) EROM t_emp WHERE sal>=2000 GROUP BY deptno;#group_concat 拼接列里面的数据
#顺序 from-->where-->group by-->select-->order by-->limit
#having 字句---依赖group by存在,当group by出现时,聚合函数无法使用在where,因此可以用having使用
select deptno from t_emp group by deptno having AVG(sal)>=2000;
SELECT deptno, COUNT(*) FROM t_emp GROUP BY 1;
SELECT deptno, COUNT(*) FROM t_emp GROUP BY 1 having deptno in(10,20) #按照数字1分组,会依据having字句中列进行分组
#表连接查询,需要规定连接条件,否则会任意匹配,出现笛卡尔积
select ... from ... 表1 join 表2 on 连接条件; #内连接1
select ... from ... 表1 join 表2 where 连接条件; #内连接2
select ... from ... 表1,表2 where 连接条件; #内连接3
SELECT e.empnO, e.ename,d.dname FROM t_emp e JOIN t_dept d ON e.deptno=d.deptno; #起别名后规定连接条件部门编号相等
#查询每个员工的工号、姓名、部门名称、底薪、职位、工资等级
SELECT
e.empno, e.ename, d.deptno,e.sal,e.job, s.grade
FROM t_emp e
JOIN t_dept d ON e.deptno=d.deptno
JOIN t_salgrade s ON e.sal BETWEEN s.losal AND s.hisal; #不一定要同名列,有逻辑关系就行
#查询与scott同部门的人
SELECT GROUP_CONCAT(t2.ename)
from t_emp t1 join t_emp t2 on t1.deptno=t2.deptno #相同数据表做表连接
where t1.ename="SCOTT";
#查询高于平均薪水的人
SELECT e.empno, e.ename, e. sal
FROM t_emp e JOIN (SELECT AVG(sal) avg FROM t_emp) t #join内加入新的查询字句,然后别名调用
ON e.sal>=t.avg;