Mysql
超全MySQL学习笔记,三天就可以学会熟练运用SQL语句,干货满满,文章末尾有相应的练习题,可以多练练加深印象,希望我的文章对你有所帮助
一.服务器
1.什么是服务器?
用于提供共享资源文件的计算机。
一般通过协议 + IP + 端口访问。
2.服务器的分类
a)软件
为应用提供运行环境。暴露出一些规范性的接口
用于实现或者连接。获取应用的服务。
b)硬件
性能卓越的计算机。没有图形界面和鼠标。
二.数据服务器
1.什么是数据库?
用于持久化由应用产生的数据。
对数据进行,分类,管理,操作的一个数据仓库。
2.什么是mysql?
Mysql的前身是由瑞典的 Mysql AB公司开发的一款服务器。
然后由Oracle公司收购。
分为社区版,和企业版【收费】。
特点:体积小,运行快,免费,支持事务的一款轻量级数据库服务器。
阿里巴巴使用的就是Mysql。
三.基本使用
1.root账号
超级管理员用户。
这个用户可以对mysql做任何的操作。
比如:分配账号,分配权限....
2.连接Mysql
a)双击快捷方式。
b)使用命令连接mysql
打开DOS窗口。
mysql -账号 -p密码 -hIp
例如:mysql -uroot -p123456 -h127.0.0.1
3.查看数据库和表
Mysql数据库服务器默认提供了一些已经存在的数据库。
输入:show databases;
4.数据库
数据库的本质就是在磁盘上的一个文件夹。
该文件夹中存放的是表文件。
5.表文件
表文件就是存储数据的文件。
该文件以.frm为后缀,只能被mysql解析。
四.SQL
1.什么是SQL语句?
Structured Query Language.【结构化查询语句】
针对数据库操作使用的一种语言。
它是一种结构化的操作语言。
对数据库的数据进行增、删、改、查的操作。
2.SQL语句的分类
DDL:数据定义语句
Data Definition Language
定义数据的结构。比如:库,表,列,约束...
关键字:
create alter drop show
创建 修改 删除 查询
DML:数据操作语句
Data Manipulation Language
操作数据本身:
关键字:
insert delete update
增 删 改
DQL:数据查询语句
Data Query Language
用于查询和过滤数据。
关键字:
select where....
DCL:数据控制语句
Data Control Language
用于对权限的控制,使用root账户分配其它的账号和设置权限访问。
关键字:
grant revoke
设置 回收
一般会给DBA使用。DBA是数据库管理员
一般中大的型的公司都会设置DBA,专门用于
管理公司所有数据库的权限。
1.DDL
1.创建库
语法:
方式一
create database gz2205 charset=utf8;
方式二
create database if not exists gz2205 charset=utf8;
2.删除数据库
语法:
方式一
drop database gz2205;
方式二
drop database if exists gz2205;
3.查看数据库
语法:
show databases;
4.选择使用的数据库
语法:
use 数据库名称;
5.创建表
语法:
方式一
create table aaa(
k1 char(10),
k2 int,
k3 double,
k4 datetime
);
方式二
create table if not exists aaa(
k1 char(10),
k2 int,
k3 double,
k4 datetime
);
什么是表?
是一个包含行和列的数据集。
6.删除表
语法:
方式一
drop table aaa;
方式二
drop table if exists aaa;
7.查看数据库有哪些表
语法:
show tables;
8.查看表结构
语法:
desc 表名;
9.修改表结构
-
添加一个新列
语法: alter table 表名 add 列名 数据类型; 例子: alter table aaa add k5 text;
-
修改列的数据类型
语法: alter table 表名 modify 列名 数据类型; 例子: alter table aaa modify k1 enum('1','2');
-
改列的名称
语法: alter table 表名 change 原列名 新列名 数据类型 例子: alter table aaa change k1 dataStatus char(1);
-
改表的名称
语法: alter table 表名 rename 新表名; 例子: alter table aaa rename bbb;
-
删除表
语法: drop table 表名; 例子: drop table bbb;
2.DML
-
插入一条新的数据
语法: 方式一 选取指定的列 insert into 表名(列名1,列名2....) values(值1,值2....); 方式二 全列插入 insert into 表名 values(值1,值2....); 方式三 多行插入 insert into 表名(列名1,列名2....) values(值1,值2....),(值1,值2....)....; 例子: 方式一 选取指定的列 insert into aaa(k1,k4) values("值1",now()); 方式二 全列插入 insert into aaa values("值1",2,3,now()); 方式三 多行插入 insert into aaa(k2,k3) values(10,11),(12,13),(14,15);
-
删除数据
语法: delete from 表名 where 过滤条件; 例子: delete from aaa where k3 = 15; 注意: 删除数据是危险操作,需要添加条件进行过滤。
-
修改数据
语法: update 表名 set 列名1=值1,列名2=值2... where 过滤条件; 例子: update aaa set k1='值1',k4='1998-07-17 01:02:00' where k3=15;
五.数据类型
Mysql将数据类型划分成3大类:
1.数值型
2.时间日期类型
3.字符串类型
1.数值类型
-
整数型
tinyint 迷你型 一个字节 smallint 小类型 二个字节 mediumint 中类型 三个字节 int 标准型 四个字节 【记住】 bigint 大类型 八个字节 【记住】
create table my_number( k1 tinyint, k2 smallint, k3 mediumint, k4 int, k5 bigint ); ---正常插入 insert into my_number values(127,32678,1000000,214765210,100000000000); ---错误: Out of range value for column 'k1' at row 1 k1列的值超出范围 insert into my_number values(128,32678,1000000,214765210,100000000000);
-
浮点型
1.float 单精度 7个小数范围 四个字节 2.double 双精度 11个小数范围 八个字节 3.decimal 固定精度 绝对保证不变 八个字节
create table my_decimal( f1 float(25,20), d1 double(25,20), d2 decimal(25,20) ); --插入flost类型的数据 insert into my_decimal(f1) values(99999.9147482285978796512); --插入double类型的数据 insert into my_decimal(d1) values(99999.9147482285978796512); --插入decimal类型的数据 insert into my_decimal(d2) values(99999.9147482285978796512);
2.时间日期类型
datetime 年月日时分秒 公园元年开始 农历时间
date 年月日
time 时分秒
year 年份
timestamp 年月日时分秒 格林威治时间开始 1970-01-01 08:00:00
create table my_date_time(
d1 datetime,
d2 date,
d3 time,
d4 year,
d5 timestamp
);
---正常插入
insert into my_date_time values(now(),now(),now(),'1998',now());
---非正常插入:因为超出格林威治的时间。
insert into my_date_time values('1949-10-01 10:00:00',now(),now(),'1998','1970-01-01 07:59:59');
---正常插入
insert into my_date_time values('1949-10-01 10:00:00',now(),now(),'1998','1970-01-01 08:01:00');
3.字符串类型
mysql将字符串类型分类6类:
1.char
定长类型:
在分配空间时,分配的空间就是指定的长度。
不管值的空间多大,所占用的磁盘空间时固定的。
比如:
一个中文 占用8个字节
char(20) 占用40个字节
2.varchar
变长类型:
在分配空间时,分配的空间是指定的长度。
但是最终使用的空间取决于数据库所插入的数据的长度。
比如:
一个中文 占用8个字节
varchar(20) 占用8个字节
3.text
文本类型:
一般字符数量超过255个,一般使用text类型。
4.blob
二进制文本类型:
已经很少使用,一般存储图片,多媒体。
可以存放二进制的类型。
5.enum
枚举类型:
范举一个或者多个具体的数据。
用户所插入的内容不能超出所枚举的数据。
比如:
sex enum('男','女','未知','保密');
6.set
集合类型:
与枚举类似。
范举一些指定的数据,用户在插入数据的时候
不能违背集合中的数据。
比如:
hobbys set('健身','钱','工作','打游戏');
以上这些类型全都是字符串类型。
create table my_string(
s1 char(20),
s2 varchar(20),
s3 text,
s4 blob,
s5 enum('男','女','未知','保密'),
s6 set('健身','钱','工作','打游戏')
);
---正常插入
insert into my_string values('我是一个中文',"我是一个好人","新闻..",'随便写一些东西','男','健身,钱,打游戏');
解决Mysql不能插入中文的问题:
在Mysql安装目录中,找到 my.ini 的配置文件。
修改my.ini 文件时,如果没有权限,则复制到桌面进行修改,
然后在将修改后的文件覆盖到Mysql安装目录下。
修改:
57 default-character-set=GBK
81 character-set-server=GBK
六. 查询操作
1.初始化数据
将init.sql 文件放入磁盘的某个位置。
在DOS窗口出入:
source 文件地址;
2.表结构的介绍
emp表【员工表】
列名 | 类型 | 描述 |
---|---|---|
EMPNO | int(4) | 员工编号 |
ENAME | varchar(10) | 员工姓名 |
JOB | varchar(9) | 职位、工作 |
MGR | int(4) | 领导的编号 |
HIREDATE | date | 入职时间 |
SAL | double | 工资 |
COMM | int(7) | 奖金 |
DEPTNO | int(2) | 部门编号 |
dept【部门表】
列名 | 类型 | 描述 |
---|---|---|
DEPTNO | int(2) | 部门编号 |
DNAME | varchar(14) | 部门名称 |
LOC | varchar(13) | 部门地址 |
salgrade【工资等级表】
列名 | 类型 | 描述 |
---|---|---|
GRADE | int(11) | 等级 |
LOSAL | int(11) | 工资下限 |
HISAL | int(11) | 工资上限 |
3.基础查询
-
查询所有数据
select * from emp;
-
限定查询
关键字: where 该关键字用于过滤查询条件的。 查询工资大于1500元的员工的信息 select * from emp where sal > 1500;
-
四则运算
+ - * / 查询名字为smith的员工每个月的总收入? select sal + comm from emp where ename = 'smith'; 在Mysql中,任何值与null参与运算得到的都是null。 解决运算过程中与null值参与运算: select sal + ifnull(comm,0) from emp where ename = 'smith'; ifnull(k1,v1) 如果k1是空的则被替换成v1;
-
运算符
> < >= <= = != <>
-
关键字
-
is null
--查询没有奖金的员工的信息。 select * from emp where comm is null; SQL语句的执行: 1.from 确定数据源的位置。 2.where 将加载到内存的数据进行过滤。 3.select 将from指向文件的数据加载到内存。
-
is not null
--查询有奖金的员工的信息。 select * from emp where comm is not null;
-
and
--查询工资在1500 - 3000之间的员工的信息 select * from emp where sal >=1500 and sal <= 3000;
-
or
--查询从事销售【SALESMAN】工作,或者工资大于等于2000元的员 ---工的信息。 select * from emp where job = 'SALESMAN' or sal >= 2000;
-
not
---查询从事非销售工作,并且工资不小于1500的员工的编号, ---姓名,职位,工资,入职时间。 select empno, ename, job, sal, hiredate from emp where (not job = 'SALESMAN') and (not sal <= 1500);
-
between and
--查询工资在1500 - 3000之间的员工的信息 select * from emp where sal between 1500 and 3000;
-
in
---查询编号为7499 7902 7788的员工的信息。 select * from emp where empno in(7499,7902,7788,8888); 等同于 select * from emp where empno = 7499 or empno = 7902 or empno = 7788 or empno = 8888;
-
not in
---查询编号不为7499 7902 7788的员工的信息。 select * from emp where empno not in(7499,7902,7788,8888);
-
like
模糊查询,一般需要结合2个通配符使用。 a) _ 代表一个任意的字符 b) % 代表任意多个字符 ---查询名字中包含S的雇员的信息。 select * from emp where ename like '%s%'; ---查询第二个字母是M的员工信息。 select * from emp where ename like '__M%';
or
empno = 7902
or
empno = 7788
or
empno = 8888; -
not in
---查询编号不为7499 7902 7788的员工的信息。 select * from emp where empno not in(7499,7902,7788,8888);
-
like
模糊查询,一般需要结合2个通配符使用。 a) _ 代表一个任意的字符 b) % 代表任意多个字符 ---查询名字中包含S的雇员的信息。 select * from emp where ename like '%s%'; ---查询第二个字母是M的员工信息。 select * from emp where ename like '__M%';
-
七、练习(练习才能让你印象加深)
复制下面的sql语句到你的mysql编辑器里,我这里用的是mysql workbench
点击运行,会创建好数据库和表。
- 查看EMP表中部门号为10的员工的姓名,职位,参加工作时间,工资。
- 计算每个员工的年薪,要求输出员工姓名,年薪。
- 查询每个员工每个月拿到的总金额(sal为工资,comm为补助)。
- 显示职位是主管(manager)的员工的姓名,工资。
- 显示第3个字符为大写R的所有员工的姓名及工资。
- 显示职位为销售员(SALESMAN)或主管(MANAGER)的员工的姓名,工资,职位。
- 显示所有没有补助的员工的姓名。
- 显示有补助的员工的姓名,工资,补助。
- 查询出部门编号为30的所有员工
10.所有销售员的姓名、编号和部门编号。
11.找出奖金高于工资的员工。
12.找出奖金高于工资60%的员工。
13.找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。
14.找出部门编号为10中所有经理,部门编号为20中所有销售员,还有即不是经理又不是销售员但其工资大或等于2000的所有员工详细资料。
15.无奖金或奖金低于1000的员工。
16.查询名字由三个字组成的员工。
17.查询2000年入职的员工。
18.查询所有员工详细信息,用编号升序排序
19.查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排列
20.查询姓名不包含M,且工资大于1500,或年薪不低于30000的雇员编号、姓名、工资、年薪,按雇员姓名降序排列
drop database if exists GZ2205;
create database GZ2205 charset utf8;
use GZ2205;
create table BONUS
(
ENAME VARCHAR(10),
JOB VARCHAR(9),
SAL int,
COMM int
) engine=InnoDB default charset=utf8;
create table DEPT
(
DEPTNO int(2) not null,
DNAME VARCHAR(14),
LOC VARCHAR(13)
) engine=InnoDB default charset=utf8;
create table EMP
(
EMPNO int(4) not null,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR int(4),
HIREDATE DATE,
SAL double,
COMM int(7),
DEPTNO int(2)
) engine=InnoDB default charset=utf8;
create table SALGRADE
(
GRADE int,
LOSAL int,
HISAL int
) engine=InnoDB default charset=utf8;
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');
commit;
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902, '19800608', 800, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, 'ALLEN', 'SALESMAN', 7698, '19810605',1600, 300, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, 'WARD', 'SALESMAN', 7698, '19830608', 1250, 500, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, 'JONES', 'MANAGER', 7839, '19810608', 2975, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, 'MARTIN', 'SALESMAN', 7698, '19860608', 1250, 1400, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, 'BLAKE', 'MANAGER', 7839, '19880608', 2850, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, 'CLARK', 'MANAGER', 7839, '19890603', 2450, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7788, 'SCOTT', 'ANALYST', 7566, '19870602', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, 'KING', 'PRESIDENT', null, '19810618', 5000, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, 'TURNER', 'SALESMAN', 7698, '19820628', 1500, 0, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7876, 'ADAMS', 'CLERK', 7788, '19870628', 1100, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, 'JAMES', 'CLERK', 7698, '19810608', 950, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, 'FORD', 'ANALYST', 7566, '19820308', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, 'MILLER', 'CLERK', 7782, '19820316', 1300, null, 10);
commit;
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (1, 700, 1200);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (2, 1201, 1400);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (3, 1401, 2000);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (4, 2001, 3000);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (5, 3001, 9999);
commit;