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;
  • 运算符
> < >= <=  =   

!=   <>
  • 关键字
  1. is null
--查询没有奖金的员工的信息。
select * from emp where comm is null;

SQL语句的执行:
1.from		确定数据源的位置。
2.where		将加载到内存的数据进行过滤。
3.select	将from指向文件的数据加载到内存。
  1. is not null
--查询有奖金的员工的信息。
select * from emp where comm is not null;
  1. and
--查询工资在1500 - 3000之间的员工的信息
select * from emp where sal >=1500 and sal <= 3000;
  1. or
--查询从事销售【SALESMAN】工作,或者工资大于等于2000元的员
---工的信息。
select * from emp where job = 'SALESMAN' or sal >= 2000;
  1. not
---查询从事非销售工作,并且工资不小于1500的员工的编号,
---姓名,职位,工资,入职时间。
select
	empno,
	ename,
	job,
	sal,
	hiredate
from
	emp
where
	(not job = 'SALESMAN')
and
	(not sal <= 1500);
  1. between and
--查询工资在1500 - 3000之间的员工的信息
select 
	* 
from 
	emp 
where 
	sal between 1500 and 3000;
  1. 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;
  1. not in
---查询编号不为7499 7902 7788的员工的信息。
select
	*
from
	emp
where
	empno not in(7499,7902,7788,8888);
  1. 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;

  1. not in
---查询编号不为7499 7902 7788的员工的信息。
select
	*
from
	emp
where
	empno not in(7499,7902,7788,8888);
  1. like
模糊查询,一般需要结合2个通配符使用。
a) _ 代表一个任意的字符
b) % 代表任意多个字符

---查询名字中包含S的雇员的信息。
select
	*
from
	emp
where
	ename
like
	'%s%';
	
---查询第二个字母是M的员工信息。
select
	*
from
	emp
where
	ename
like
	'__M%';

七、练习(练习才能让你印象加深)

复制下面的sql语句到你的mysql编辑器里,我这里用的是mysql workbench
点击运行,会创建好数据库和表。

  1. 查看EMP表中部门号为10的员工的姓名,职位,参加工作时间,工资。
  2. 计算每个员工的年薪,要求输出员工姓名,年薪。
  3. 查询每个员工每个月拿到的总金额(sal为工资,comm为补助)。
  4. 显示职位是主管(manager)的员工的姓名,工资。
  5. 显示第3个字符为大写R的所有员工的姓名及工资。
  6. 显示职位为销售员(SALESMAN)或主管(MANAGER)的员工的姓名,工资,职位。
  7. 显示所有没有补助的员工的姓名。
  8. 显示有补助的员工的姓名,工资,补助。
  9. 查询出部门编号为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;

mysql服务器端和客户端 mysql服务器是什么意思_mysql