2021-08-12

mysql

数据库相关概念
1什么是数据库服务器
数据库服务器就是一个软件(例如mysql) 将数据库软件安装到电脑,当前电脑就是一个数据库服务器,就可以对外提取存取数据的服务.
mysql数据库可以创建多个数据库(dataBases),每一个数据库都是一个单独的仓库.

2什么是数据库
所谓的数据库就是指存储和管理数据的仓库,通常情况下一个网站的所有数据会存放在一个数据库(学习时了解到的,有不对的地方请大佬指出,本人也是小白)

jd.com 				db_jd(数据库)
taobao.com 		db_taobao(数据库)

3什么是表
一个数据库可以创建多张表,每张表用于存储一些信息,例如:

jd.com中的用户数据 tb_user(表)

jd.com中的商品数据 tb_product(表)

jd.com中的订单数据 tb_order(表)

4什么是表记录
一张表可以包含多行表记录,每一行表用于存储某一个具体的数据

学生编号 	姓名	 年龄
101	        张某      19
102	        陈某      18

什么是SQL语言?
SQL是一门用于操作关系型数据的的通用语言
使用SQL可以操作数据库表,表,表记录
(1)创建,删除,修改,查询数据库
(2)创建,删除,修改,查询表
(2)创建,删除,修改,查询表记录

连接mysql数据库
通过命令行工具可以登录MYSQL客户端,连接MYSQL服务器,从而访问服务器中的数据
1连接mysql服务器

mysql -uroot -p密码

2退出客服端命令:quit或exit或/q
数据库及表操作
创建,删除,查看数据库
提示:
(1)SQL语句对大小写不敏感。推荐关键字使用大写,自定义的名称(库名,表名,列名等)使用小写。
(2)并且在自定义名称时,针对多个单词不要使用驼峰命名,而是使用下划线连接。(例如:tab_name,而不是 tabName )

SHOW DATABASES; -- 查看当前数据库服务器中的所有库
CREATE DATABASE mydb1; -- 创建zd库
show databases; -- 查询服务器所有的数据库
show tables; -- 查询当前库所有表
use zd; -- 进入到‘mysql’数据库
show tables; -- 查询当前库中的所有表
select database();--查看已进去的库
-- 先进入某一个库,再查看当前库中的所有表
use zd;
show tables;
-- 如果zd库存在则删除,如果不存在,也就不执行删除操作!
drop database if exists zd;
--创建zd库指定编码为utf8
create database if not exists mydb1 charset utf8; 
--查看建库时的语句
show create database zd;

创建删除查看表
进去zd库 删除stu学生表(如果存在)

use zd;--进去zd库
drop table if exists stu; --如果存在stu表,则删除

建表语法:(编号,姓名,性别,出生年月,成绩)

	列名 数据类型,
	列名 数据类型,
	...
  	列名 数据类型
);

sql语句:

-- 如果存在,则删除stu表
drop table if exists stu;
-- 创建stu学生表
create table stu(
  id int primary key auto_increment, -- 给id添加主键约束,并设置自增
  name varchar(50),
  gender varchar(10) not null, -- 给gender添加非空约束
  birthday date,
  score double
);

查看stu学生表结构

desc stu;-- desc 表名

新增,更新,删除表记录
在学生表中新增一条记录

-- 如果是在cmd中执行插入记录的语句,先 set names gbk; 再插入记录!
-- 由于id已经设置了主键自增,所以在插入数据,id可以不用给值
insert into stu(id,name,gender,birthday,score) value (null,'tom','male','2000-3-4',89);
-- 查询学生表中的所有记录
select * from stu;

修改

update stu set score=score+10;--所有学生成绩加10分
update stu set score=83 where id=1;--符合条件的修改为83分 ,where子句对记录筛选,保留符合条件的,不符合的剔除

删除

delete from stu; -- 删除stu表中的所有记录
delete from stu where id>2; -- 删除stu表中id大于2的记录 按照条件删除

查询表记录
准备数据:上面有记载随便写一点进行sql语法练习
SELECT 语句用于从表中选取数据。
语法: SELECT 列名称 |* from 表名
*(星号)表示查询所有,一般来说直接列名需要什么查什么
简单来说select——from中间的字段是所需要查询的列名,from后面是所需查询的表名

--查询emp表中的所有员工,显示姓名,薪资,奖金
select name,sal.bouns from emp;--每一个需要查询的列明需要用,(逗号)隔开

--emp表中所有部门和职位
select dept,job from emp;

--剔除重复记录 使用DISTINCT 
select distinct dept,job from emp;

WHERE子句查询
语法 select 列名称 from 表名称 where 列运算符 值

--查询emp表中薪资大于3000的员工,显示员工姓名,薪资
select name,job from emp where sal>3000;

--查询emp表中总薪资(薪资+奖金)大于3500的所有员工,显示员工姓名、总薪资
select name,sal+bouns from emp where sal+bouns>3500;

--如果某一个员工的奖金或者薪资为null值,会有问题 
使用ifnull解决
select name,sal+ifnull(bonus,0) from emp
where sal+ifnull(bonus,0) > 3500;

--查询薪资在3000和4500之间的员工,两种方法
select name, sal from emp
where sal>=3000 and sal<=4500;

--或者between ...and... 在....之间
select name, sal from emp
where sal between 3000 and 4500; -- 包括3000,也包括4500

--查询薪资为 1400 1600 1800的员工 两种方法
select name,sal from emp
where sal=1400 or sal=1600 or sal=1800;
--或者使用 in
select name,sal from emp
where sal in(1400,1600,1800);

查询薪资不为1400 1600 1800的员工 两种方法
select name,sal from emp
where not(sal=1400 or sal=1600 or sal=1800);
-- 或
select name,sal from emp
where sal not in(1400,1600,1800);

--查询没有部门的员工 (部门列为null值)
select * from emp where dept=null; --mysql中这样是不允许的
select * from emp where dept is null; 

模糊查询
LIKE 操作符用于在where子句中搜索列中的指定模式
语法:select 列 from 表名 where 列名 like 值

--查询以刘开头的员工
select name from emp where name like '刘%';

--查询姓名中包含 涛 的员工
select name from emp where name like '%涛%';

--查询姓名以张开头姓名为3个字的员工
select name from emp where name like '张__'
select name from emp where name like '张_';  --一个下划线为两个字的员工

多行函数查询
常用的多行函数有
count(列名|*) : 统计指定列记录的行数
max(列名) : 统计指定某一列的最大值
min(列名):最小值
sum(列名):所有值相加
avg(列名):平均值
小提示:
(1)多行函数不能用在where子句
(2)多行函数在统计中对null值进行过滤,不参与统计

--统计薪资大于3000的员工个数
select count(*) from emp where sal<3000;
select count(id) from emp where sal<3000;

--查看最高薪资
select max(sal)from emp;

--查看所有员工的薪资总和
select sum(sal) from emp;

--查看员工的平均薪资
select avg(sal) from emp;

多行函数需要注意的问题:
(1)多行函数和是否分组有关,如果查询结果中的数据没有经过分组,默认整个查询结果是一个组,多行函数就会默认统计当前这一个组的数据。产生的结果只有一个。
(2)如果查询结果中的数据经过分组(分的组不止一个),多行函数会根据分的组进行统计,有多少个组,就会统计出多少个结果。

分组查询 group by
在分组的列上可以使用COUNT,SUM,AVG,MAX,MIN等函数。
语法:SELECT 列 | * FROM 表名 [WHERE子句] GROUP BY 列;

--按照部门对员工分组,查看分组效果
select count(*) from emp group by dept;

--按照职位进行分组 统计人数
select job,count(*) from emp group by job;

--按照部门分组,查看每个部门的最高薪资
select dept,max(sal) from emp group by dept;

排序查询 order by
语法:SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC]
ASC默认升序 desc降序

对员工薪资进行排序
select name,sal from emp order by sal ;--默认是升序 asc可以不写 降序在 sal 加上 desc(降序)

分页查询 limit
limit(页码 -1)

-- 每页显示3条,查询第1页数据
select * from emp limit 0,3;
-- 每页显示3条,查询第2页数据
select * from emp limit 3,3;
-- 每页显示3条,查询第3页数据
select * from emp limit 6,3;
--显示薪资最高的前三名员工信息
-- 在排序的基础上,分页查询,每页显示3条,只查询第1页
select name,sal from emp order by sal desc limit 0,3;

mysql的数据类型
数值类型
mysql中支持多种整形,存储值的大小范围不同而已
tinyint:占用1个字节,相当于java中的byte
smallint:2字节,short
int:3字节,int
bigint:8字节,long
浮点型类型
float:4字节单精度浮点类型,相当于java float
double:8字节双精度浮点类型,double

字符串类型
char(n) 定长字符串,最长255个字符 ,n表示字符数 例如:

create table user(
    username char(10),
    ...
);
--所谓的定长,是当插入的数据的长度小于指定的长度时,剩余的空间会用空格填充。(这样会浪费空间)

varchar(n) 变长字符串,最长65535个字节

create table user(
	username varchar(10)
);
--所谓的不定长,是当插入的数据的长度小于指定的长度时,剩余的空间可以留给别的数据使用。(节省空间)

长度固定的数据,用char类型,这样既不会浪费空间,效率也比较高
如果长度不固定,使用varchar类型,这样不会浪费空间。

大文本(长文本)类型
最长65535个字节,一般超过255个字符列会使用text

create table user(
	resume text
);
**mysql的字段约束**

主键约束
主键约束:如果为一个列添加了主键约束,那么这个列就是主键,主键的特点是唯一且不能为空。
主键的作用: 作为一个唯一标识,唯一的表示一条表记录(作用类似于人的身份证号,可以唯一的表示一个人一样。)在这里插入代码片
添加主键约束,例如将id设置为主键:

create table stu(
	id int primary key,
	...
);

主键自增
数据库会自动为id分配一个值(AUTO_INCREMENT变量,默认从1开始,后面依次+1),这样既可以保证id是唯一的,也省去了设置id的麻烦。

create table stu(
	id int primary key auto_increment,
	...
);

非空约束 password
值不能为空但可以重复

create table user(
	password varchar(50) not null,
	...
);

唯一约束
列的值就必须是唯一的(即不能重复),但可以为空。

create table user(
	username varchar(50) unique not null,
	...
);

外键约束
用于通知数据库两张表数据之间对应关系的这样一个列。
这样数据库就会帮我们维护两张表中数据之间的关系。

create table emp(
	id int,
	name varchar(50),
	dept_id int,
	foreign key(dept_id) references dept(id)
);

表关系
一对多,一对一,多对多

连接查询

-- 员工所属的部门编号,等于部门的编号
select * from dept,emp
where emp.dept_id=dept.id;

左外连接查询

select * from dept left join emp
on emp.dept_id=dept.id;

右外连接查询

select * from dept right join emp
on emp.dept_id=dept.id;

子查询

--查看薪资比A高的所有员工
select name,sal from emp 
where sal>(select sal from emp where name='A');

这是基本的mysql数据库语法,如果还有遗缺,请您私信小老弟!!!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值