只介绍sql部分,不介绍理论知识
Mysql学习(持续更新ing)
DB,DBMS,SQL的关系
- DB: Database(数据库,数据库实际上以文件在硬盘上存在)
- DBMS:DataBase Management System (数据库管理系统)常见的有:MySQL,Oracle,DB2,Sybase,SqlServer
- SQL:结构化查询语言,是一门标准通用的语言。标准的SQL适用于所有的数据库产品。
- 三者之间的关系
DBMS负责执行sql语句,通过执行sql语句来造作DB中的数据
表(table)
- table是数据库的基本单元–保证可读性
- 一个表包括行(也叫数据或记录-data)和列(也叫字段-column)
- 每一个字段都有字段名,数据类型,相关的约束。
SQL语句的分类
- DQL(数据操作语言):查询语句,凡是select语句都是DQL
- DML(数据操作语言):insert delete update,对表当中的数据进行增删改
- DDL(数据定义语言):create drop alter ,对表结构的增删改
- TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中T是Transaction)
- DCL(数据控制语言):grant授权,revoke撤销权限等
数据的导入(此时用的是控制台)
文件:链接: https://pan.baidu.com/s/1ZPuzjpi_TRejL6QjJJSlLw 提取码: 537i
1.登录MySQL数据管理系统–点击mysql的控制台。可以从win10中最近添加程序入口进入
2.查看有哪些数据库–show databases;
3.创建属于自己的数据库–create database teacherZhu;
4.使用自己的数据----use teacherZhu
5.查看当前使用的数据库有哪些表;show tables;
6.初始化数据–source +sql文件;
SQL的理解
脚本
- 以sql结尾的文件被称为“sql脚本”。
- 直接使用source命令可以执行sql脚本
- sql脚本中数据太大的时候,无法打开,可以使用source命令完成初始化
常用命令
查看表中的结构和数据
-
查看结构 :desc 表名;
-
查看数据:select *from 表名;
查看当前使用的数据库
- select database();
查看mysql的版本号
- select version();
查看创建表的语句
- show create table emp;
简单的查询语句(DQL)
简单查询
-
select 字段名1,字段名2,…from 表名;
-
任何一条sql语句以";"结尾
-
sql语句不区分大小写
可以看出字段可以参与运算!
-
给查询结果的列重命名:select ???,??? as ‘***’ from **;
条件查询
- 语法格式:
- select 字段1,字段2,、、、from 表名 where 条件;
- 执行顺序:先from,然后where ,最后select
运算符
1.等于:=
2.不等于:!=,<>
3.小于:<
4.大于:>
5.两个值之间:between… and… 或者>= and<=
注意 这个可以用在字符之间 :但是是左闭右开
6.是否为null :is null
7.是否不为空:is not null
8.并且,或:and,or
and 和or 的优先级问题–and优先级高
查找薪水在1000以上且上级工号为20或者30的员工
1)如果没有考虑优先级
此时出现了一条漏网之鱼–JAMES–薪水低了,只是老板符合要求。但是显然并不是我们想要的结果。
2)当考虑了优先级
9.in,not in:和or相似但是由多个值
注意:此时括号中代表的是具体的值,不是一个区间!
10.模糊查询:like
- 两个重要符号:% _
- %代表任意多个字符
- 表示一个字符
如果要查包含_的数据----用转义字符\_
排序
- 语法格式
- order by ** (desc可以写可以不写);—根据规则降序排列
- order by ** asc;—根据规则升序排列
找到工作是salesman并且按照月薪降序排列的员工
分组函数
- –自动忽略null
- count:计数
- sum:求和
- avg:取平均
- max:找最大
- min:找最小
- ifnull()函数
- ifnull(可能为null的数据,被当做什么);
- count(*)表示统计所有数据的总数目-不管是什么都要计算在内
group by 和 having函数
- group函数:按照某个字段或者某些字段进行分组
- having函数:对分组之后的函数再次进行分组
group by
- 例子 找出每个工种的最大工资
- 记住一个规则:当一语句中有group by时,select后面的字段只能跟分组的依据字段和分组函数
例子 当将enamel加入时
此时显然和表中每个工种的最大工资拥有者不同
- 多个字段分组
例子 找出每个部门不同工种最大工资
having
- having 函数只能在group by 函数之后使用
例子 找出不同部门的平均工资,显示数额大于2000
DQL语句总结
- DQL语句的顺序
- select …
- from…
- where…
- group by…
- having …
- order by …
补充 :distinct 关键字
1.只能出现在所有字段的最前面
2.表示所有字段的去重复
例子 找到工种数目
连接查询
在表的连接查询中,有一个现象叫做:笛卡尔积现象。
补充:别名
当连接查询时,可能存在两个不同的表存在相同的字段,所以以后字段名都应该加上别名
例子:select e.name ,d.name from emp e,dept d;
什么是连接查询呢?
可以看一下例子
像这样将两张或以上的表格的数据进行联合处理就是连接查询
SQL92与SQL99语法
就以上例子进行分析
92:select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno
99 :
select e.ename,d.dname from emp e (inner可以省略)join dept d on e.ename=d.dname;
- 99语法将连接的语句单独成型,将其与条件语句分开,增添了可读性,语法结构更清晰
- 99语法on之后依旧可以写where添加条件
内部连接
包括等值与非等值连接
等值连接
请看上面的例子
非等值连接
自连接
最大的特点就是:一张表可以看做两张表,自己连接自己。
例子:该问题可以将员工表同时看做领导表。这样,当员工的领导号码=领导的员工号码时就可以连接在一起了
外连接(更重要)
外连接:
假设A和B表连接,如果是外连接,其中一张表应是主表,另外一张表是副表。如果主表的数据不能匹配到副表的数据,那么就会自动生成一个null来匹配主表未匹配的数据。
- 分类有左连接和右连接
- 左右代表的是哪个表是主表
- 左右连接可以互化
例子:找到员工的领导(没有上级也要显示)–左连接
三张表的连接
例子:找出每个员工,部门,工资等级,上级领导
嵌套子查询
where嵌套
- 例子:找出高于平均工资的员工信息—这种情况因为查询函数不能跟在where语句后面,所以必须使用嵌套查询
from嵌套
- 例子:做出每个部门平均薪资的等级
select嵌套
例子:找出每个部门员工的部门名称,要求显示员工名和部门名
union用法
可以将结果组合在一个表中。可以是一张表的不同结果,也可以是不同表的结果–前提是列数相同
limit—取数据
- 语法格式
- limit startIndex,length
- startIndex:起始位置,0表示第一条数据
- length:取的数据的长度
sql语句的写法顺序
select
from
where
group by
having
order by
limit
表的建立
语法格式
create table 表名(
字段名1 数据类型 约束,
字段名2 数据类型 约束,
…
);
每个字段名默认都是NULL;
除非建表时定义了初始值
字段名1 数据类型 default 数据1;
这样字段名1的默认值就是数据1;
使用约束
使用约束是为了保证字段的合法性,有效性,完整性;
常见的约束
在创建表的时候在其后面添加关键字就行
- 非空约束:(not null)约束的字段不能为空
- 唯一约束:(unique)约束的字段不能重复,可以为空
- 主键约束:(primary key)约束的字段不能为空,也不能重复
- 外键约束:(foreign key)将两张表的某字段约束
- 检查约束:(mysql不支持,但是oracle支持)
create table vip(
id int not null unique,
name varchar(25) not null
);
联合约束
以下代码表示的是id和name联合在一起是唯一的:vip(1,张三,123456@qq.com)和vip(2,张三,4546@qq.com)都可以放在数据库中,因为他们是联合唯一的,相当于存在一个变量不一样就整体不一样。
create table vip(
id int not null ,
name varchar(25) not null,
email varchar(55) not null,
unique(id,name)
);
外键约束
foreign key(字段名) references 表名(字段名)
CREATE TABLE student(
num INT(10) PRIMARY KEY UNIQUE AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
sex ENUM('男','女') NOT NULL,
birthday DATE,
address VARCHAR(50)
);
CREATE TABLE grade(
id INT(10) PRIMARY KEY UNIQUE AUTO_INCREMENT,
course VARCHAR(10) NOT NULL,
num INT(10) ,
grade VARCHAR(4),
FOREIGN KEY(num) REFERENCES student(num)
);
代表grade中num字段与student中的num字段形成约束
Mysql 的常见数据类型
int 整数
bigint 长整型(long)
float 浮点型
char 定长字符串—后面加(数字)表示这个变量最多能存的字符数目(速度更快,但可能存在空间的浪费)
varchar 可变长字符串—速度慢,但是节省空间
date 日期类型 年月日
datatime 长日期类型 年月日 时分秒
BLOB 二进制大对象(存储图片,视频等)
CLOB 字符大对象(存储较大文本,比如,可以存储4G的字符串)
其余类型分类
- 数据类型
- 时间
- 字符串
插入数据
题外知识:删除表:drop table 表名
- 语法格式
- insert into 表名(字段名1,字段名2…) values(值1,值2,…)
- 字段可以省略不写,但是values必须数目与字段名一样,且顺序不能变化,且所有字段都要赋值。
- 也可以一次加多行数据:…values(),()…;
insert into student(id,name,sex) values(01,"张三","男"),
insert into student(name) values("王五"),
insert into student values(02,"李四","男"),
insert into student values(03,"无","男"),(04,"有","女"),
表的复制和批量插入
表的复制
- 语法格式
- create table 表名 as select 语句
批量插入
- insert into 表名 select *from 表名;
- 必须得字段数目相等
修改数据
语法格式
update 表名 set 字段名1=值1,字段名2=值2… where 条件;
where条件不写就会将全部数据改变
删除数据
-
语法格式
-
delete from 表名 where 条件;
-
么有where 表中数据全部删除
-
怎么删除一个大表?(删库跑路!-?)
-
truncate from 表名;
-
无法恢复,且效率快;
事务
ALTER 命令
作用
修改数据表名,数据表字段等
- 删除,添加,修改表字段
ALTER TABLE 表名 DROP 字段
#删除字段
ALTER TABLE 表名 ADD 字段 类型RST;
#将字段添加到表的第一行
ALTER TABLE表名 ADD 字段 类型 AFTER 字段c;
#将字段添加到字段c的后面
修改字段类型和名称
ALTER TABLE 表名 MODIFY 字段 类型c;#将字段的类型改为类型c
ALTER TABLE 表名 CHANGE i j 类型c ;#将字段i变成字段j ,类型为c
ALTER TABLE 表名 CHANGE j j 类型c; #将字段j的类型变为c
这里是引用