Mysql学习笔记day1 --三天学完mysql所有知识点

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表【员工表】

列名类型描述
EMPNOint(4)员工编号
ENAMEvarchar(10)员工姓名
JOBvarchar(9)职位、工作
MGRint(4)领导的编号
HIREDATEdate入职时间
SALdouble工资
COMMint(7)奖金
DEPTNOint(2)部门编号

dept【部门表】

列名类型描述
DEPTNOint(2)部门编号
DNAMEvarchar(14)部门名称
LOCvarchar(13)部门地址

salgrade【工资等级表】

列名类型描述
GRADEint(11)等级
LOSALint(11)工资下限
HISALint(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.selectfrom指向文件的数据加载到内存。
      
    2. is not null

      --查询有奖金的员工的信息。
      select * from emp where comm is not null;
      
    3. and

      --查询工资在1500 - 3000之间的员工的信息
      select * from emp where sal >=1500 and sal <= 3000;
      
    4. or

      --查询从事销售【SALESMAN】工作,或者工资大于等于2000元的员
      ---工的信息。
      select * from emp where job = 'SALESMAN' or sal >= 2000;
      
    5. not

      ---查询从事非销售工作,并且工资不小于1500的员工的编号,
      ---姓名,职位,工资,入职时间。
      select
      	empno,
      	ename,
      	job,
      	sal,
      	hiredate
      from
      	emp
      where
      	(not job = 'SALESMAN')
      and
      	(not sal <= 1500);
      
    6. between and

      --查询工资在1500 - 3000之间的员工的信息
      select 
      	* 
      from 
      	emp 
      where 
      	sal between 1500 and 3000;
      
    7. 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;
      
    8. not in

      ---查询编号不为7499 7902 7788的员工的信息。
      select
      	*
      from
      	emp
      where
      	empno not in(7499,7902,7788,8888);
      
    9. 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;

      
      
    10. not in

      ---查询编号不为7499 7902 7788的员工的信息。
      select
      	*
      from
      	emp
      where
      	empno not in(7499,7902,7788,8888);
      
    11. 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;



在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huangshaohui00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值