day1-mysql(上)
-
数据库概述
-
Mysql数据库概述
-
Mysql安装与卸载
-
Mysql基本命令
-
SQL入门
mysql常用命令
系统命令(以管理员身份运行)
#启动服务 net start mysql #停止服务 net stop mysql #进入mysql命令行 mysql -uroot -p123456 #退出mysql命令行 exit #修改密码 mysqladmin -uroot -p123456 password root
Mysql常用命令
--显示数据库实例 show databases; --创建数据库实例 create database mydb; --使用数据库实例 user mydb; --显示实例中所有数据库表 show tables;
SQL语句
结构化查询语言,一门关系型数据中通用的操作语言,语法结构类似英语口语,sql语句通常划分为三类
-
DDL数据定义语言
-
DML数据操作语言
-
DCL数据控制语言
DDL
创建表:
create table 表名称(
列名称 数据类型 [约束信息]
....
)
/* 创建用户表,表中包含用户id,用户名,密码 */ create table tbuser( id int, username varchar(10), password varchar(20) ); --查看表结构 desc tbuser; --向表中新增level列是int类型 alter table tbuser add level int; --修改表中列的(将level列的名称改变为dengji) alter table tbuser change level dengji int; --删除表 drop table tbuser;
DML语句
--向表中插入一条数据 insert into tbuser(username,password) values('softeem','123456'); --批量插入数据 insert into tbuser values(1,'rose','666'),(2,'jack','8888'),(3,'tom','999'); --蠕虫复制 insert into tbuser select * from tbuser; --查询表中所有数据 select * from tbuser --修改所有id为null的列为0 update tbuser set id=0 where id is null; --修改多列数据 update tbuser set password='admin',username='admin' where id=1; --删除id为0的所有数据 delete from tbuser where id=0;
更为严格的表创建
创建一个用户表,包含ID,用户名,密码;要求id不能重复,并且要求id列自动递增,要求密码有默认值123456?
-
主 键约束 : primary key
-
自动递增 :auto_increment
-
列的默认值 :default
约束
约束是维护数据完整型的一种操作,在数据库中维护数据完成性操作中包含以下解决方案:
-
约束(contraint):最简单最容易实现的一种方式
-
存储过程(procedure)
-
触发器(trigger)
create table user( id int primary key auto_increment, username varchar(16) unique not null, password varchar(16) default '123456' );
约束主要包含五大类:
-
主键约束(primary key)
-
外键约束
-
不为空约束(not null)
-
唯一约束(unique)
-
检查约束(mysql暂不支持)
--修改制定列设置列不为空(不为空约束) alter table user change username username varchar(16) not null; --使用修改语句设置表的列为唯一列(唯一约束) alter table user add constraint uq_name unique(username);
外键约束
通过设置外键约束可以让当前一张表与另一张表产生约束关系,在执行更新操作是,会通过约束的关系保证数据的完整性(被设置外键的列必须关联另一张表的主键列)
--学生表 create table tbstu( id int primary key auto_increment, sname varchar(16) not null, sex enum('1','0') default '1', age int, gid int ); --分组表 create table tbgroup( gid int primary key auto_increment, gname varchar(32) ); --修改约束 alter table tbstu add constraint foreign key fk_gid(gid) references tbgroup(gid);
在条件约束是等于null时 不能用=null,要用is null;where id is null
作业
创建两张表(emp,dept):
员工表: 工号(eno),姓名(ename),职位(job),入职时间(hiredate),月薪(sal),部门号(dno)
部门表:部门号(dno),部门名(dname),分机号(tel)
要求:
员工工号列和部门号列分别作为主键并且自动递增
员工表中部门号为外键列关联部门表的主键列
部门名不能重复
向每个表中分别添加若干条数据
根据工号修改指定员工的月薪(薪资调整)
根据查询指定职位的所有员工信息
查询月薪大于3000的员工信息
删除部门号为null的员工
date '2018-07-07'
day2-SQL语句
-
数据库备份mysqldump命令
-
图形界面工具使用
-
常用数据类型与运算符
-
SQL查询
-
系统函数
数据库备份
备份(系统命令行)
#备份数据库实例 mysqldump -uroot -proot mydb > d:/mydb.sql #备份表 mysqldump -uroot -proot mydb tbuser > d:/tbuser.sql
恢复(需要进入mysql命令行,同时use一个指定数据实例)
source d:/mydb.sql
AUTO_INCREMENT,UNSIGNED,ZEROFILL
auto_increment:设置列自增,可用于主键列以及非空唯一列(not null unique)
unsigned:设置无符号列(列值不允许为负数)
zerofill:设置零填充列(当列数据长度不到定义长度时,数值前补0)
数据类型
-
数值类型
-
字符串类型
-
时间日期类型
数值类型
字符串类型
char类型跟varchar类型区别
char类型是定长字符串,默认大小是255(最大255);char类型一旦定义长度,则无论实际添加的数据长度是否达到最大长度,都会将定义空间占满,char类型效率高一般用于长度固定的列。
varchar类型是定长字符串,默认大小是255(最大长度取决与数据表的编码模式,utf-8:65535/3;GBK:65535/2),varchar类型定义长度之后系统不会直接分配对应大小的空间,而是根据实际填充值的长度申请空间,相对char类型更节省空间,所以varchar用于长度不定的列
时间日期类型
运算符
mysql运算符包含以下类型
-
算术运算符
-
比较运算符
-
逻辑运算符
-
位运算符
算术运算符
比较运算符
逻辑运算符
位运算符
SQL查询
sql语句DML语句中最为复杂的是查询语句,insert,update,delete语句多数情况为单表操作,但是select与可以关联多张数据表,针对sql查询需要明确三点:
-
查询列
-
查询目标表
-
查询条件
SQL查询语法:
SELECT 查询列1,查询列2,... FROM 目标表
【WHERE 查询条件】
【GROUP BY 列名称】
【HAVING 查询条件】
【ORDER BY 列名称 ASC|DESC】
【LIMIT [偏移行,]记录行数】
sql查询常见关键字:
-
from子句:指定查询数据的表
-
where子句:查询数据的过滤条件
-
group by子句:对匹配where子句的查询结果进行分组
-
having子句:对分组后的结果进行条件限制order by子句:对查询结果结果进行排序,后面跟desc降序或asc升序(默认)
-
limit子句:对查询的显示结果限制数目
员工表(Emp)
部门表(Dept)
单表查询
--查询所有员工的姓名,职位,月薪 select ename,job,sal from emp; --查询月薪超过10000的员工 select * from emp where sal>10000; --查询入职时间在2017-01-01~2017-12-31之间的员工 select * from emp where hiredate between '2017-01-01' and '2017-12-31'; --查询所有市场经理和项目经理信息 select * from emp where job in('市场经理','项目经理'); --模糊查询 ‘%’ ‘_’ --查询员工姓名中包含‘杰’的员工 select * from emp where ename like '%杰%'; --查询员工中所有的‘张’姓员工 select * from emp where ename like '张%'; --查询员工中‘周’姓名字只有两个字的员工 select * from emp where ename like '周_'; --聚合函数:count() max() min() sum() avg() --查询出emp表中的总记录行数 select count(*) from emp; --查询出emp表中的最高/低薪资 max/min select max(sal) from emp; --统计一个月需要支出的共工资? select sum(sal) from emp; --统计1号部门的平均薪资? select avg(sal) from emp where dno=1; --查询出所有的职位名称去除重复(distinct) select distinct job from emp; --分组 group by...having... --查询出每种岗位的平均薪资? select avg(sal),job from emp group by job; --查询出每种岗位平均薪水大于8000的岗位名和平均薪水 select avg(sal),job from emp group by job having acg(sal)>8000; --排序 order by ... desc|asc --查询出员工信息按照月薪从高到低排序 select * from emp order by sal desc;
多表联合查询
--连接查询(等值连接) --查询出所有员工信息和部门信息 select e.*,d.* from emp e,dept d where e.dno=d.dno; --内连接:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同-最终才会保留结果,否则不保留. select e.*,d.* from emp e inner join dept d on e.dno=d.dno; --通过对以上结果观察会发现没有员工的部门,以及没有部门的员工都不会显示,如何解决? --左连接(左外连接):以左表为基准连接右表,左表信息完全显示 select e.*,d.* from emp e left join dept d on e.dno=d.dno; --右连接(右外连接):以右表为基准连接左表,右表信息完全显示 select e.*,d.* from emp e right join dept d on e.dno=d.dno;