java学习第四周 (初步学习Mysql)

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?

  1. 主 键约束 : primary key

  2. 自动递增 :auto_increment

  3. 列的默认值 :default

约束

约束是维护数据完整型的一种操作,在数据库中维护数据完成性操作中包含以下解决方案:

  • 约束(contraint):最简单最容易实现的一种方式

  • 存储过程(procedure)

  • 触发器(trigger)

create table user(
id int primary key auto_increment,
username varchar(16) unique not null,
password varchar(16) default '123456'
);

约束主要包含五大类:

  1. 主键约束(primary key)

  2. 外键约束

  3. 不为空约束(not null)

  4. 唯一约束(unique)

  5. 检查约束(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)

要求:

  1. 员工工号列和部门号列分别作为主键并且自动递增

    1. 员工表中部门号为外键列关联部门表的主键列

      1. 部门名不能重复

      2. 向每个表中分别添加若干条数据

      3. 根据工号修改指定员工的月薪(薪资调整)

      4. 根据查询指定职位的所有员工信息

      5. 查询月薪大于3000的员工信息

      6. 删除部门号为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查询需要明确三点:

  1. 查询列

  2. 查询目标表

  3. 查询条件

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;
​

猜你喜欢

转载自blog.csdn.net/qq_37693860/article/details/81430693