数据库(database)
常见的数据库:
关系型数据库:
SQL server 微软
Oracle oracle (甲骨文)
MySQL oracle
DB2 IBM
SQLIte 安卓
NoSQL 数据库(文档性数据库)
MongoDB
1、安装MySQL
MySQL
目录 说明
data 数据库
lib 库
include 包含头文件
share 语言文件,错误消息文件。
MySQL服务的启动和关闭
启动MySQL客户端的两种形式:
1、找到mysql的命令行客户端启动输入密码
2、在cmd下输入命令
mysql的默认用户是root
mysql -u root -proot
Curd (增删改查)数据更新 增删改 数据查询
操作关系型数据库
sql简介:
Sql:结构化查询语句,是一种特殊的编程语言。是关系型数据库的操作语言,用于存取数据,更新(修改 删除 增加)和管理关系型数据库。Sql是关系型数据库的标准语言。也就是说使用sql来操作mysql数据库。
Sql 分类:
1、DML (data mynipulation language 数据操作语言) 用于插入修改删除数据
2、DDL(Data Definition Language 数据库定义语言) 用于创建 修改 删除 数据库对象
3、DCL(数据控制语言)用于定义数据库的权限

操作数据库前,必须先选择一个库,
1、显示当前所有的数据库
show databases;
2、创建数据库
create database my;
3、删除数据库
drop database my;
4、选择数据库
use my;
数据类型(不同的数据库对于数据类型的支持不同)
常用的有int varchar data
数据库的库中表的操作
1、表的创建:
create table 表的名称(
字段1 数据库类型(大小)[default 默认值],
….
);
例:create table person(
id int(10),
name varchar(3),
age int(3),
brithday date
);
2、查看当前数据库中的表
show tables;
3、查看表的结构
desc my;
4、删除表
drop table my;
5、数据库的更新操作
a、增加数据
insert into person( id ,age, name)… values (1,22,’zs’…);
b、修改数据
update person set id=2,age=23,name=’ls’ where id=1;
可以添加where 修改所有的 id
c、删除数据
delete from person ;删除表的所有数据
delete from person where age>18; 删除年龄大于18岁的
delete from person where age>18 and age<22;删除年龄大于18
岁的并且年龄小于22 岁的
约束
分为:非空约束;
唯一约束
主键约束
检查约束
外键约束
1、非空约束(not null key)nk
当数据表中的某个字段上的内容不希望为null时,可以使用 not null 约束
例:
create table person(
id int(10),
name varchar(10) not null, //名字不能为空
age int(3)
);
2、唯一约束(unique)uk
是指每一列上的数据,不允许重复
create table person (
id int(10),
name varchar(3) not null, //名字不能为空
email varchar(30) unique //邮箱不能重复
);
create table person (
id int(10),
name varchar(3) not null, //名字不能为空
email varchar(30) not null,
constraint uk_email unique(email)//邮箱不能重复
);

3、主键约束(primary key)pk
主键约束=非空约束+唯一约束
一般设置编号为主键
create table person (
id int(10) primary key, // id唯一不能为空
name varchar(10),
email varchar(30)
);
create table person (
id int(10) ,
name varchar(10),
email varchar(30),
consiraint uk_id primary key(id) // id唯一不能为空
);
4、检查约束
检查约束是指为表中的数据增加一些过滤条件
例:
条件:性别 男或者女
年龄 0~120
create table person(
id int(10),
name varchar(10),
gender varchar(4);
age int (3),
constraint ck_gender check (gender in(‘男’,’女’)),
constraint ck_age checg (age berween 0 and 120)
);
注意:mysql支持创建检查约束。但不支持验证。
5、外键约束(foreign key)
前四个约束都是在一张表中进行的。而外键约束实在两张表中建立的。两张表存在父子关系,即:子表中的某个字段的取值有父表决定的。
结论:在一对多关系中额,外键建立在多的一方
例如:
创建班级表(t_class)父
create table t_class(
cid int(10) primary key,
cname varchar(10)
);
创建学生表(t_student ) 子
create table t_student(
sid int(10) primary key,
sname varchar(10),
cid int(10),
constraint fk_cid foreicn key (cid ) references t_class(cid)
// 将子表中的数据cid 和父表中的数据进行关联
);
当子表引用了父表中的数据时,父表中的数据不能删除
先删除子表中的数据,再删除父表中的数据。
这种删除很不方便,如果需要在删除父表数据的同时,级联删除自数据。可以在建立外键约束的时候,创建级联删除
constraint fk_cid foreicn key (cid ) references t_class(cid)
on delete cascade
问题:不希望级联删除,单数要删除父数据,不删除子类数据?
解决办法:解除关系。更新子数据的外键关系为null。
update t_student set cid=null where sid=1;
有外键关系但是不建立外键约束。

数据库的查询
创建三张表
员工表emp 部门表dept 工资等级表 salgrade

创建表DEPT

CREATE TABLE dept(
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
dname VARCHAR(20) NOT NULL DEFAULT “”,
loc VARCHAR(13) NOT NULL DEFAULT “”
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

创建表EMP雇员

CREATE TABLE emp(
empno MEDIUMINT DEFAULT 0,
ename VARCHAR(20) DEFAULT “”,
job VARCHAR(9) DEFAULT “”,
mgr MEDIUMINT,
hiredate DATE,
sal DECIMAL(7,2),
comm DECIMAL(7,2),
deptno MEDIUMINT DEFAULT 0
)ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

工资级别表

CREATE TABLE salgrade(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
losal DECIMAL(17,2) NOT NULL,
hisal DECIMAL(17,2) NOT NULL
)ENGINE=MyISAM DEFAULT CHARSET=utf8;

工资级别表 插入数据

INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);

员工表 插入数据

insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, ‘SMITH’, ‘CLERK’, 7902, ‘1980-12-17’, 800, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, ‘ALLEN’, ‘SALESMAN’, 7698, ‘1981-02-20’, 1600, 300, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, ‘WARD’, ‘SALESMAN’, 7698, ‘1981-02-22’, 1250, 500, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, ‘JONES’, ‘MANAGER’, 7839, ‘1981-04-02’, 2975, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, ‘MARTIN’, ‘SALESMAN’, 7698, ‘1981-09-28’, 1250, 1400, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, ‘BLAKE’, ‘MANAGER’, 7839, ‘1981-05-01’, 2850, null, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, ‘CLARK’, ‘MANAGER’, 7839, ‘1981-06-09’, 2450, null, 10);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, ‘SCOTT’, ‘ANALYST’, 7566, ‘1987-04-19’, 3000, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, ‘KING’, ‘PRESIDENT’, null, ‘1981-11-17’, 5000, null, 10);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, ‘TURNER’, ‘SALESMAN’, 7698, ‘1981-09-08’, 1500, 0, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, ‘ADAMS’, ‘CLERK’, 7788, ‘1987-05-23’, 1100, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, ‘JAMES’, ‘CLERK’, 7698, ‘1981-12-03’, 950, null, 30);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, ‘FORD’, ‘ANALYST’, 7566, ‘1981-12-03’, 3000, null, 20);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, ‘MILLER’, ‘CLERK’, 7782, ‘1982-01-23’, 1300, null, 10);

部门表 插入数据

insert into DEPT (deptno, dname, loc)
values (10, ‘ACCOUNTING’, ‘NEW YORK’);
insert into DEPT (deptno, dname, loc)
values (20, ‘RESEARCH’, ‘DALLAS’);
insert into DEPT (deptno, dname, loc)
values (30, ‘SALES’, ‘CHICAGO’);
insert into DEPT (deptno, dname, loc)
values (40, ‘OPERATIONS’, ‘BOSTON’);

一、简单查询
1、查询emp表中的所有数据
select * from emp;
2、查询emp表中的所有员工的编号,姓名,职位
select empno,ename,job from emp;
3、查询emp表中所有员工的职位
select job from emp;
结果重复项的去除
select distinct job from emp;
但是 去除重复列的时候,注意,如果同时查询多列,必须保 证所有列重复,才能保证去除重复项
4、查询enp表中的每个员工的姓名和年薪
查询过程中允许使用四则运算
select ename,sal*12 from emp;
二、限定查询
1、查询所工资大于1500的员工
select * from emp where sal>1500;
2、查询工资大于等于1500并且小于(等于)3000的员工
select * from emp where sal>=1500 and sal<=3000;
select * from emp where sal between 1500 and 3000;
3、查询每个月可以获得奖金的员工
select * from emp where comm>0 or comm!=null;
select * from emp where comm>0 or comm<>null;
select * from emp where comm is not null and comm>0;
4、查询没有奖金的员工
select * from emp where comm is null or comm=0;
5、查询出基本工资大于1500,并且可以获取奖金的员工。
select * from emp where sal>1500 and (comm is not null or comm>0);
select * from emp where sal>1500 and comm is not null and comm>0;
6、查询出工资不大于1500,同时不能领取奖金的人
select * from emp where sal<=1500 and (comm is null or comm=0);
select * from emp where not(sal>1500 or (comm is not null and comm>0));
7、查询在1981年雇佣的员工信息
select * from emp where hiredate between ‘1981-01-01’ and ‘1981-12-31’;
8、查询姓名为smith的员工
select * from emp where ename=’smith’;
数据库的字段和表名是不区分大小写的。数据输区分大小写的
9、查询出员工标号是7369,7698,7876的员工
select * from emp where empno in(7369,7698,7876);
select * from emp where empno=7369 or empno=7698 or empno=7876;
10、模糊查询 like
通配符:_ 可以匹配一个长度
% 可以匹配任意长度
a、查询员工姓名第二个字母是l的员工
select * from emp where ename like ‘_l%’;
b、查询员工姓名包含m的员工
select * from emp where ename like ‘%m%’;
c、查询在1981雇佣的员工信息
select * from emp where hiredate like ‘1981%’;
11、员工编号不等于7369的员工
select * from emp where empno!=7369;
select * from emp where empno<>7369;
三、查询排序(order by)
1、查询所有员工,按照工资又高到底的顺序
降序
select * from emp order by sal desc;
升序
select * from emp order by sal asc;
可以使用多字段排序,先按照第一个字段进行排序,如果第一个字段相同,则按照第二个字段排序
2、查询20部门的所有员工信息,查询的信息按照工资有高到低 排序,如果工资相同,则按照雇佣如期由早到晚进行排序
select * from emp where deptno=20 order by sal desc, hiredate asc;
统计函数
1、查询emp表中有多少条数据
select count(*) from emp;
2、查询dept表中有多少条数据
select count(*) from dept;
3、查询emp表和dept表的数据。
select count(*) from dept ,emp;
这个问题在数据库中被称为笛卡尔积:多张表数据的乘积
如何消除笛卡尔积:使用关联条件。(关联字段)
在多表查询中,如果出现相同名称的字段。必须区分,加上表名区分。
select * from emp,dept where emp.deptno=dept.deptno;
查询结果虽然消除了笛卡尔积,但是只是在显示结果上消除了。但是数据库还是进行了笛卡尔积的运算。在数据量大的情况下会非常慢。
起别名:
select * from emp e,dept d where e.deptno=d.deptno;
四、多表查询
之前所有操作都是在一张表中进行,如果想要显示多张表的数据, 那必须使用多表查询
1、查询每一个员工的编号,姓名,职位,部门名称,部门位置。
分析:
要查询的表
emp e,dept d
要查询的数据
e.empno,e.ename,e.job,d.dname,d.loc
要关联的字段
e.deptno=d.deptno
select e.empno,e.ename,e.job,d.dname,d.loc
from emp e,dept d
where e.deptno=d.deptno;
2、查询每个员工的姓名,职位,领导的姓名
分析:
要查询的表
emp e1,emp e2
要查询的数据
e1.ename,e1.job,e2.ename
要关联的字段
e1.mgr=e2.empno
select e1.ename,e1.job,e2.ename
from emp e1,emp e2
where e1.mgr=e2.empno;
3、查询每个员工的编号,姓名,基本工资,领导的姓名,所在部门名称,所在部门位置。
分析:
要查询的表
emp e1,emp e2,dept d
要查询的数据
e1.empno,e1.ename,e1.sal,e2.ename,d.dname,d.loc
要关联的字段
e1.mgr=e2.empno,e1.deptno=d.deptno
select e1.empno,e1.ename,e1.sal,e2.ename,d.dname,d.loc
from emp e1,emp e2,dept d
where e1.mgr=e2.empno and e1.deptno=d.deptno;
使用左右关联查询
select e1.empno,e1.ename,e1.sal,e2.ename,d.dname,d.loc
from emp e1
left outer join emp e2 on(e1.mgr=e2.empno)
left outer join dept d on(e1.deptno=d.deptno);
4、查询每个员工的编号,姓名,工资,部门名称,工资在公司的工资等级
分析:
要查询的表
emp e,dept d,salgrade s
要查询的数据
e.empno,e.ename,e.sal,d.dname,s.grade
要关联的表
e.deptno=d.deptno and e.sal between s.losal and s.hisal
select e.empno,e.ename,e.sal,d.dname,s.grade
from emp e,dept d,salgrade s
where e.deptno=d.deptno and e.sal between s.losal and s.hisal;
问题:查询每个员工的姓名,职位,领导的姓名?
使用左右链接显示出没有领导的king
select e.ename,e.job,e2.ename
from emp e
left outer join emp e2
on (e.mgr=e2.empno);
五、左右链接
SQL 1999 语法。
左链接 left outer join …on
右链接 right outer join …on
六、其他链接
1、cross join 交叉连接
例:
select * from emp cross join dept;
等价于
select * from emp,dept;
显示56条数据
2、natural join 自然连接
例:
select * from emp natural join dept;
自动关联消除笛卡尔积
等价于
select * from emp e,dept d where e.deptno=d.deptno;
3、join …using 用户指定字段消除笛卡尔积
例:select * from emp join dept using (deptno);
等价于
select * from emp e,dept d where e.deptno=d.deptno;
4、join ..on 用户指定条件消除笛卡尔积
select * from emp e join dept d on(e.deptno= d.deptno);
七、统计函数
count(字段) 统计表中的记录数
avg(字段) 求平均值
sum(字段) 求和
max(字段) 最大值
min(字段) 最小值
1、统计员工的平均工资,员工人数,员工总工资
select avg(sal),count(*),sum(sal) from emp;
2、统计员工的最高工资和最低工资
select max(sal),min(sal) from emp;
八、分组查询
前提:数据重复或者符合相同条件的时候才需要分组。
某个列(字段)出现了重复的数据才需要分组。
分组查询和统计函数配合使用
1、按照部门分组统计每个部门的人数,平均工资。
select count(empno),avg(sal) from emp group by deptno;
2、求每个职位的最高工资和最低工资
select job,max(sal),min(sal) from emp group by job;
使用分组查询了有新的语法限制:
a、统计函数一般和分组查询使用。统计函数也可以单独使用。单 独使用的时候,select 语句之后不能出现其他字段(mysql支持 这种写法,oracle数据库不支持)
b、如果进行过分组,那么select子句后,只能出现分组的字段(分 组条件)和统计函数。其他字段不能出现。
3、查询每个部门的名称,部门的人数,平均工资
select d.dname,count(e.empno),ifnull(avg(e.sal),0)
from dept d
left outer join emp e on(d.deptno=e.deptno)
group by e.deptno;
4、查询每个部门的编号,名称,位置,部门的人数,平均工资
select d.*,count(e.deptno),ifnull(avg(e.sal),0)
from dept d
left outer join emp e on(d.deptno=e.deptno)
group by e.deptno;
5、统计每个部门的详细信息,并且要求这些部门的平均工资大于 2000。
select d.*,avg(e.sal)
from dept d
left outer join emp e on(d.deptno=e.deptno)
group by e.deptno
having avg(e.sal)>2000;
改:
统计每个20,30 部门的详细信息,并且要求这些部门的平均 工资大于2000。 ,avg(e.sal)
select d.* from dept d where d.deptno in(20,30);
select d.* ,avg(e.sal) from dept d
left outer join emp e on(d.deptno=e.deptno)
where d.deptno in(20,30)
group by deptno having avg(e.sal)>2000;

where和having区别
where是从查询的表中的所有数据进行过滤在group by 之前执行。 不能使用统计函数
having是分组之后,再进行条件过滤,使用having子句。可以使 用统计函数。
6、显示非销售人员的工作名称,以及从事同一工作的工资的总和, 并满足从事同意工作的工资总和大于5000。
select job from emp where job<>’salesman’;
select job,sum(sal) from emp where job<>’salesman’
group by job having sum(sal)>5000;
工资总和按照降序排列
select job,sum(sal) from emp where job<>’salesman’
group by job having sum(sal)>5000 order by sum(sal) desc;
九、子查询
一个查询语句的返回结果
单行单列
select sal from emp where ename=’smith’;
单行多列
select * from emp where ename=’smith’;
多行单列
select sal from emp;
多行多列
select * from emp;
1、子查询在where子句中
单行单列
单行多列
多行单列
a、单行单列:
1、查询工资比smith高的员工
select sal from emp where ename=’smith’;
select ename
from emp
where sal>(select sal from emp where ename=’smith’);
2、查询工资高于平均工资的员工
select avg(sal) from emp;
select * from emp
where sal>(select avg(sal) from emp);
b、单行多列(一般不用)
查询和smith职位和奖金相同的员工
select job,comm from emp where ename=’smith’;
select * from emp
where (job,ifnull(comm,0))=(select job,ifnull(comm,0) from emp where ename=’smith’);
c、多行单列(in any all)
查询工资和经理工资相同的员工
select sal from emp where job=’manager’;
select * from emp where sal in(select sal from emp where job=’manager’);
any 等价于in
select * from emp where sal =any(select sal from emp where job=’manager’);

any 比最小值大
select * from emp where sal >any(select sal from emp where job=’manager’);

MySQL中操作关系型数据库 SQL相关推荐

  1. mysql数据类型double,double在数据库怎么定义 mysql中double类型在sql中用什么类型

    sql定义一个double变量怎么定义? 局部变量 声明:DECLARE @local_variable data_type @local_variable 是变量的名称.变量名必须以 at 符 (@ ...

  2. 在mysql中更新数据sql语句怎么写_在MySQL中,更新数据库表记录的SQL语句,包括______语句...

    在MySQL中,更新数据库表记录的SQL语句,包括______语句 答:insert replace update delete 在域F中,设其特征为2,对于任意a,b∈F,则(a+b)2 等于多少 ...

  3. SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理

    在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...

  4. 大数据分析中使用关系型数据库的关键点

    相当一部分大数据分析处理的原始数据来自关系型数据库,处理结果也存放在关系型数据库中.原因在于超过99%的软件系统采用传统的关系型数据库,大家对它们很熟悉,用起来得心应手. 在我们正式的大数据团队,数仓 ...

  5. 会mysql不会sql_不是吧,不会有人还不知道MySQL中具实用的SQL语句

    原标题:不是吧,不会有人还不知道MySQL中具实用的SQL语句 目录 实用的SQL 1.插入或替换 2.插入或更新 3.插入或忽略 4.SQL中的if-else判断语句 5.指定数据快照或备份 6.写 ...

  6. 关系型数据库sql与非关系型数据库nosql

    一.什么是非关系型数据库? 1.非关系型数据库就是区别于关系型数据库的数据库. 2.虽然说起来有点绕嘴,但是非关系型数据库就是因为,关系型数据库处理不了的一些读写问题而产生的数据库 3.我们常用的非关 ...

  7. mysql系统数据库服务器,mysql中的系统数据库服务器

    mysql中的系统数据库服务器 内容精选 换一换 用户正常的数据(不包括备份数据),以及云数据库RDS实例正常运行所需的数据(比如系统数据库.数据库回滚日志.重做日志.索引等).同时,包含如下云数据库 ...

  8. hive中的数据库与mysql中的hive数据库的关系

    mysql中的hive数据库是自己手动创建的,然后执行下面语句: schematool -dbType mysql -initSchema 该语句的作用是在mysql的hive数据库下建立一大堆的表格 ...

  9. MongoDB语法与现有关系型数据库SQL语法比较

    MongoDB语法与现有关系型数据库SQL语法比较 MongoDB语法 MySql语法 db.test.find({'name':'foobar'}) select * from test where ...

最新文章

  1. 联邦学习首个国际标准正式发布
  2. Java中关于==和equal的区别 以及equals()方法重写
  3. 2016年蓝桥杯省赛A组c++第8题(暴力求解)
  4. 迪士尼“新顶流”,火不到娱乐圈
  5. 华为服务器操作系统密码,服务器操作系统密码忘记
  6. 反向Z(Reversed-Z)的深度缓冲原理
  7. 二阶传递函数的推导及几种求解方法的比较
  8. 冒泡排序(Java版)
  9. 谷歌不是 Web 界的上帝!
  10. Checkstyle的配置集
  11. 15. Python3 处理JSON格式数据(制作交易收盘价走势图)
  12. 安卓高级 WebView的使用到 js交互
  13. css实现图片旋转360°
  14. linux云服务器,内存占用率很高解决方法
  15. 创建自己的人脸识别程序
  16. android studio 根目录,AS 根目录结构说明
  17. Uncaught SyntaxError: The requested module ‘/node_modules/.vite/vue.js?v=bd1817bb‘ does not provide
  18. 【模拟IC】系统频率稳定性分析与极点补偿技术介绍
  19. Anroid11有多个Launcher应用时,默认其中一个Launcher为启动Launcher,不用弹框选择Launcher
  20. 使用 markdown语法绘制流程图

热门文章

  1. C语言中 || \ 符号的意思
  2. 【centos7静默(无图形界面版)本地离线安装oracle11g,附带个人建议】
  3. hdu1814 Peaceful Commission 2-sat
  4. Google Capture The Flag 2019 (Quals) WP
  5. 如何构建基于数字孪生的智慧全息路口
  6. pyqt5以及pyqtgraph(pyqt界面设计绘图)
  7. 代理服务器拒绝连接(无法连接到代理服务器)的解决办法
  8. Camera日记(一)-ISP
  9. 如何成为虾皮的优选卖家-扬帆际海
  10. android 系统/本地日志打印