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数据库语法,如果还有遗缺,请您私信小老弟!!!