Mysql 介绍
数据库:存放数据的仓库 数据库就是一个文件系统,但是访问的时候需要使用标准SQL语句来访问数据 常见的数据库 Oracle :甲骨文公司的数据库产品,大型的收费的数据库。 盘符: 不区分大小写 d: \代表一个文件夹
Mysql:安装与卸载
安装
1. MySQL的安装路径和数据的安装路径。
安装路径不允许出现中文
MySQLServer mysql的安装路径 server data files 数据的安装路径。 需要你把这两个路径 记一下
mysql的专用端口号:3306 gbk是中文编码格式 utf8 万国码 是mysql数据库的 用户名称(user) root 密码password: 5534 如果没有选择运行窗口,用cmd启动时需要,找到mysql安装路径的bin文件夹,再用 mysql -u root -p 启动 mysql -u root -p
卸载:
1.停止服务 2.控制面板 卸载 3.删除文件夹
DML语句介绍
我们现在安装的是MySQL的服务器, 一个服务器可以有多个数据库 数据库里有多个表 表里面有多个数,表里面的一行称为一条数据或者一条记录。
DB:数据库
SQL: 结构化查询语言
特点: 非过程性语言
SQL是用来存取关系数据库的语言,具有查询、操纵、定义和控制关系型数据库的四方面功能 DDL (数据定义语言)用来定义数据库的对象,比如表 增create 删drop 改alter 查desc DML (数据操纵语言)数据库表中更新,增加和删除记录数据
insert into 表名 (字段名) values (对应的值)------部分增加 insert into 表名 values(对应的值)------完全增加 delete from 表名-----全部删除 delete from 表名 where 字段=字段值; ----删除对应的 update 表名 set 字段=新字段值,字段=新字段值 -----全部修改 update 表名 set 字段=新字段值,字段=新字段值 where 字段名=字段值 -----删除对应的 DQL (数据查询语言) 一般来说它是针对表中的数据 DCL (数据控制语言) 设置用户权限和控制事务语句
数据库操作语句
创建数据库
CREATE create:创建
DATABASE DataBase:数据库
每一个单词都要用空格隔开 结尾最好用 ; 隔断 (代写 这个名字你可以随便写,不能写中文)
create database 数据库名称;
create database 数据库名称 charcter set utf8 collate utf8_bin;
CHARACTER SET:指定数据库采用的字符集character set
COLLATE:指定数据库字符集的比较方式collate
默认的字符集设置为utf8 DEFAULT CHARACTER SET utf8 defult 默认的 charcter 字符集 set 设置 如果你要在创建数据库的时间写了字符集格式建议要写字符集的比较方式 utf8 的比较方式 utf8_bin
查看数据库
展示的是多个的数据库
show databases;
显示数据库的定义信息:一个数据库
show create database 数据库名称;
删除数据库
drop database 数据库名称;
修改数据库
不用它改数据库名称 改的是字符集编码格式(utf8)和他的校验规则(utf8_bin)
alter database 数据库名称 character set gbk;
切换数据库
use db_name;
如果你不切换数据库的话 你无法对表进行操作
查看当前使用的数据库
select database();
表的操作
int 就是整数类型 varchar(写的是长度,包含文字的长度) 字符 它就是用来写汉字的也可以写英语 字母,各种的符号 如果写varchar() 必须写上长度
创建一个表
字段和字段类型中间用空格隔开 一个字段和一个字段类型是一组,组与组之间用逗号隔开,最后一组可以不写逗号
create table 表的名字(字段名 字段类型, 字段名 字段类型, 字段名 字段类型, 字段名 字段类型);
create table 表名 (id int,name varchar(500),sex varchar(20),age int,);
查看表结构
desc 表名;
show tables ; 查看当前库内所有表名
show create table 表名; 查看建表语句和字符集
删除表
drop table 表名;
修改表
增加一列 语法:
alter table 表名 add 字段名 字段类型(长度) 约束;
多列:
alter table 表名 add (字段名 字段类型(长度) 约束,字段名 字段类型(长度) 约束);
修改表名
rename table 旧表名 to 新表名;
修改现有列类型、长度:
alter table 表名 modify 字段名 新的类型(新的长度);
删除列 :
alter table 表名 drop 列名 ;
修改现有列名称和类型 语法:
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
mysql的数据类型 :
1.字符串型
字符:一个单独的汉字或者字母 字符串就是把字符给串连起来,多个的汉字或者字母varchar(常用 的): 长度是可变的,最大长度比char的长 char:长度是固定的
2.数值型
int 整数型 double 小数类型
3.日期类型
date: 日期 写的是年月日 2019-10-16
time: 时间 写的时分秒 15:12:00
datetime: 写的是日期和时间 2019-10-16 15:12:00
约束:字段
作用:约束用来保证数据有效性和完整性
主键约束 primary key 作用:让数据不能为空,数据不能重复 一个表里面只能存在一个
唯一约束 unique 唯一 不能重复
非空约束: not null 非空 不能为空
null 空 没有
写约束的语法: 字符名 字段类型 约束(约束跟着字段的最后)
删除主键:alter table emp drop primary key
主键自动增长 :auto_increment
values 赋值
alter table studnet modify id int primary key;
对于数据操作
增 删 改 查
字符串类型和日期类型 写值的时间要加上一个 '' 把值包起来 日期类型的格式:年-月-日
查询
select * from 表名;
增加
1.增加:部分增加 字段和值都要写在 ( ) 里
insert into student (id,name,score,datas) values(1,'小红',59.5,'2019-10-23');
insert into studnet () values (1);
语法: insert into 表名 (字段名,字段名,字段名,字段名) values(对应的值,对应的值,对应的值,对应的值);
2.添加: 完全添加 必须把所有字段值都匹配上
insert into studnet values (1,'小红',59.5,'2019-10-23');
语法: insert into 表名 values (对应的值,对应的值,对应的值,对应的值);
错误:1366 它是mysql中文乱码问题
解决办法:
第一步: 找到你mysql的安装路径,打开一个叫my.ini(mysql的配置文件)的文件 第二步: 找到以下的代码[client]port=3306[mysql]default-character-set=utf8 第三步: 把utf8改成gbk让他学会中文,保存 关闭 第四步:重启mysql的客户端,重启cmd
删除
我们一般删除一条数据,还是要根据提供的条件删除。这个条件一般来说是id 主键
delete from student; 删除所以数据;
delete from student where id=1;
修改
数据: 我们一般修改一条数据,还是要根据提供的条件修改。这个条件一般来说是id 主键
update student set name = '小明',score=60,dates='2000-01-01';
update student set name = '小白',score=90,dates='2001-02-02' where id=2;
1.练习+扩展
建表语句
create table student (id int, name varchar(50),math double, chinese double,english double);
增加语句
insert into student values(1,'小红',100,80,2);
insert into student values(2,'小明',100,120,120);
insert into student values(3,'小白',0,0,1);
insert into student values(4,'小he',50,80,90);
修改
update student set math=102 where id=1; 加where条件是对一条数据进行操作,不加是对全部进行操作
删除
delete from student where math=102;
查询:
* --- 所有的字段 ..count(*).. 在*前面加count是用来计数的
select * from 表名;
select id,name,math,english,chinese from stu;
1.select *(所有的字段) | 单独的字段 from 表名; 查询这个表的全部数据
我想要查询id为2的stu的学生信息
select *from stu where id=2;
2.distinct 去重 去除重复
select distinct math from stu;
3.查询表中所有学生的信息。
Select * from stu
4.查询表中所有学生的姓名和对应的英语成绩。
select name,english from stu ;
5.过滤表中重复数学数据。
select distinct math from stu;
insert into stu (name,math,english,chinese) values ('123',456,789,132);
6.select语句可以运算 我要看到所有学生的总分和姓名
select math+english+chinese,name from stu;
7.起别名 可以给字段起 也可以给表起
1). 用as 在要起别名的字段后空一格 写上 as 再空一格写上 别名
select math+english+chinese as zf,name from stu;
2)用空格 直接在你要起别名的字段后空一格 然后写上别名
select math+english+chinese zf,name from stu;
8.在所有学生的所有科目都上加10分特长分。
select name,math+10,english+10,chinese+10 from stu;
2.练习+扩展
create table aaa (id int primary key auto_increment,name varchar(50),math double,english double,chinese double);
1.查询英语成绩大于90分的同学
select * from stu where english < 90;
2.between …and .. 什么什么之间 显示的包含条件
查询英语成绩0到90分的同学
select * from stu where english between 0 and 90;
3.in() 只显示括号里的值
查询英语成绩是0和90分的同学
select * from stu where english in (0,90);
4.like 模糊查询
我要找到这个表里name中有红字的学生; _ % 在like都代表是占位符 _代表一个字,或者说一位 % 代表多位也可以代表没有
select * from stu where name like '李%';
5.is null 显示的是为null的数据
select * from stu where name is null;
6.and 并且 or 或者 ont 非 查询英语成绩是80分和是90的同学
select * from stu where english = 80 and math =100;
7.查询英语成绩是80分或者是90的同学
select * from stu where english = 80 or english=1000;
8.查询英语成绩是0的同学
select * from stu where not (english = 0);
9.用字段名给表排序 order by 默认是升序 asc 降序是desc
select * from 表名 order by 字段名 desc/asc(asc 是默认 可写可不写)
10.给表分组 group by
select * from 表名 group by 字段名
11.avg(列名) 求平均值 求一个班级数学平均分?
select avg(math) from student;
12.求一个班级总分平均分
select avg(ifnull(math,0)+english+chinese) from student;
13.max() 最大值 min()最小值
14.group by 分组 就是一类东西放在一起 这一类东西是你自己定义的
select * from student group by id having id=1;
15.Having和where均可实现过滤,但在having可以使用函数,having通常跟在group by后,它作用于分组
select * from dept;
+----+------+
| id | name |
+----+------+
| 1 | 财务 |
| 2 | 人事 |
| 3 | 后勤 |
+----+------+
select * from emp;
+----+------+------+
| id | name | d_id |
+----+------+------+
| 1 | 美美 | 1 |
| 2 | 小黑 | 2 |
| 3 | 白白 | 3 |
+----+------+------+
16.笛卡尔积(了解): 就是把两张表的数据给全部的组合一遍 例如:
select * from emp,dept;
+----+------+------+----+------+
| id | name | d_id | id | name |
+----+------+------+----+------+
| 1 | 美美 | 1 | 1 | 财务 |
| 2 | 小黑 | 2 | 1 | 财务 |
| 3 | 白白 | 3 | 1 | 财务 |
| 1 | 美美 | 1 | 2 | 人事 |
| 2 | 小黑 | 2 | 2 | 人事 |
| 3 | 白白 | 3 | 2 | 人事 |
| 1 | 美美 | 1 | 3 | 后勤 |
| 2 | 小黑 | 2 | 3 | 后勤 |
| 3 | 白白 | 3 | 3 | 后勤 |
+----+------+------+----+------+
17.想要得要我们需要的结果,我们要加条件:
select * from emp,dept where emp.d_id = dept.id;
+----+------+------+----+------+
| id | name | d_id | id | name |
+----+------+------+----+------+
| 1 | 美美 | 1 | 1 | 财务 |
| 2 | 小黑 | 2 | 2 | 人事 |
| 3 | 白白 | 3 | 3 | 后勤 |
+----+------+------+----+------+
18.多表联查:
-
内连接 (隐式内连接和普通的内连接出来的结果是一模一样的,只是写法不同而已) 1.1 隐式内连接
语法: select * from 表名,表名 条件;
select * from emp,dept where emp.d_id = dept.id;1.2 普通内连接 关键字 inner join ..... on inner join 两头写的是表名 on 后写的是条件
语法:select * from 表名 inner join 表名 on 条件;
select * from emp,dept where emp.d_id = dept.id;
select * from emp inner join dept on emp.d_id = dept.id;+----+------+------+----+------+ | id | name | d_id | id | name | +----+------+------+----+------+ | 1 | 美美 | 1 | 1 | 财务 | | 2 | 小黑 | 2 | 2 | 人事 | | 3 | 白白 | 3 | 3 | 后勤 | +----+------+------+----+------+
-
外连接
2.1: 左连接 (以左边的表为主表,把内容全部都要显示出来) 关键字 left [outer] join ..... on
select * from emp left join dept on emp.d_id = dept.id;
2.2:右连接 (以右边的表为主表,把内容全部都要显示出来) 关键字 right [outer] join ..... on
select * from emp right join dept on emp.d_id = dept.id;
3.子查询
语法:select * from table where 条件 > (select * from table where 条件)
>any:大于子查询中的最小值。
>all: 大于子查询中的最大值。
19.查看所有人所属的部门名称和员工名称?
select e.name,d.name
from emp as e inner join dept d on e.d_id = d.id;
+------+------+
| name | name |
+------+------+
| 美美 | 财务 |
| 小黑 | 人事 |
| 白白 | 后勤 |
+------+------+
20.统计每个部门的人数(按照部门名称统计)
select d.name,count(e.d_id)
from emp e right join dept d on e.d_id = d.id group by d.name;
+------+---------------+
| name | count(e.d_id) |
+------+---------------+
| 人事 | 1 |
| 后勤 | 1 |
| 安保 | 0 |
| 财务 | 1 |
+------+---------------+
21.统计部门的平均工资(按部门名称统计)
1.查两个表
from emp e right join dept d on e.d_id = d.id;
2.按照部门分组
from emp e right join dept d on e.d_id = d.id group by d.name;
22.求工资
select d.name,avg(e.salaly)
from emp e right join dept d on e.d_id = d.id group by d.name;
+------+---------------+
| name | avg(e.salaly) |
+------+---------------+
| 人事 | 3000 |
| 后勤 | 2000 |
| 安保 | NULL |
| 财务 | 3000 |
+------+---------------+
部门的平均工资大于公司平均工资的部门
select d.name from emp e right join dept d on e.d_id = d.id group by d.name having avg(e.salaly) >( select avg(salaly) from emp);
23.部门的平均工资:
select d.name,avg(e.salaly) from emp e right join dept d on e.d_id = d.id group by d.name;
24.公司平均工资:
select avg(salaly) from emp;