MYSQL数据库初学者必看

Mysql基础

一、数据库基础知识

1、数据的发展史

a、没有数据库阶段,使用磁盘文件存储数据

b、层次结构模型数据库

c、网状结构模型数据库

d、关系型结构数据库(使用二维表来存储数据)

e、关系-对象模型数据库 

2、市面上的数据库

a、Oracle      甲骨文

b、DB2         IBM

c、SQL Server  微软

d、Sybase      赛尔斯

e、MySql       开源-->SUN-->Oracle

f、MongoDB

g、Redis

3、主要学习的数据库(以MySQL来学习)

DBA职位

RDBMS(关系型数据库管理系统)Rational Database Management System 数据管理系统,包括一个管理角色的和多个数据仓库,一个仓库中包含多个数据表,一个数据表中包括两个部分(表结构、表记录),表结构指的是数据表的列名称和列类型,表记录(即表数据)指的是表中的数据。

注意:

管理员与数据库的关系

数据库与数据表、视图、索引、存储过程的关系

数据表与表结构、表记录的关系

4、MySQL的目录结构

a、bin

b、my.ini文件是MySQL的总配置文件,后面需要使用

二、SQL语言

1、ISO国际标准化

国际标准化组织ISO统一SQL语言

C89  C99  --- C语言的ISO标准

ISO发布的版本

      SQL-92

      SQL:1992

      SQL:2003

2、SQL语言分类

a、DDL(Data Definition Language)

   数据定义语言,用来定义数据库对象:库、表、列等

b、DML(Data Manipulation Language) 

    数据操作语言,用来定义数据库记录(数据)

c、DCL(Data Control Language)

    数据控制语言,用来定义访问权限和安全级别

d、DQL(Data Query Language) 

    数据查询语言,用来查询记录(数据) 

3、SQL语法

a、SQL可以使用空格和缩进进行格式化

b、每一条sql语句使用分号结尾

c、SQL对于大小写要求不严格,但是建议SQL的关键字使用大写

d、远程连接mysql

    mysql -h host -u username -p password

e、mysql的提示符

    mysql> 准备好接受新命令。

    ->等待多行命令的下一行。

    '>等待下一行,等待以单引号(“'”)开始的字符串的结束。

    ">等待下一行,等待以双引号(“"”)开始的字符串的结束。

    `>等待下一行,等待以反斜点(‘`’)开始的识别符的结束。

    /*>等待下一行,等待以/*开始的注释的结束。

 ================================================================

###DDL 数据定义语言(DDL的操作存在两部分的操作:对数据库的操作、对表结构的操作) 

1、对数据库的操作

a、查看所有的数据库

show databases;

b、切换数据库

use  数据库名称;

c、创建数据库

create database [if not exists] 数据库名 [charset=utf8];

d、删除数据库

drop database [if exists] 数据库名;

e、修改数据库编码

alter database 数据库名 character set utf8;

f、显示数据库的编码格式

show create database 数据库名;

2、对表结构的操作

a、首先介绍一下SQL语言中的数据类型

① int  整型

② double  使用格式double(5,2)表示最多包含五位数字,其中有两位小数,即:表示的最大值为999.99

③ decimal  浮点型 主要使用在金融行业(例如手机支付等)使用格式decimal(5,2)这是一种二进制运算无差错的数据类型

④ char   固定长度字符串类型,使用格式char(x)x的最大取值是255,这里的255等数字表示的是字节数目

⑤ varchar  可变长度字符串类型  使用格式varchar(x),x的最大取值是65535,对于可变长字符串类型,需要使用一部分空间来记录本类型的长度,存在浪费

   举例: 2014-12-12 22:10:12  假如存储这个字符串的时候,这个字符串长度为19,那么使用char(20)就足够,但是假如使用varchar(20)的话,可能由于要使用一部分空间来存储数据,导致不能将整个字符串存储下来

⑥ text   字符串类型,表示大字符串,细分为四种:longtext mediumtext  text  tinytext

⑦ bolb   字节类型,表示大字节,同样分为四种

⑧ date   日期类型,格式为:yyyy-MM-dd

⑨time   时间类型,格式为:hh:mm:ss

⑩、timestamp    时间戳类型  格式为:年月日+时分秒+毫秒   

b、查看表结构

desc 表名称;

c、创建表

create table 表名称(列名称 列类型,列名称 列类型,列名称 列类型......)在最后一个列的后面没有逗号

d、查看数据库中所有的表名称

show tables;

e、删除表

drop table 表名称;

f、修改表

① 添加列  alter table 表名称 add(列名 列类型,列名 列类型,列名 列类型......);

② 修改列类型   alter table 表名称 modify 列名 新列名;

③ 修改列名和列类型   alter table 表名称 change 老列名 新列名 列类型;(列类型可以是新的类型也可以是老的类型,若为老类型则表示只更改了列名称)

④ 删除列   alter table 表名称 drop 列名称;

⑤修改表名称   alter table 表名 rename to 新表名称

###DML数据操作语言

注释:主要针对表记录(表数据)的更新操作   

1、插入记录

insert into 表名称 (列名称,列名称,列名称...) values(列值,列值,列值...);

当想要插入整条数据的时候,前面部分的列名称列表可以不写,只在后面给值即可

insert into 表名称 values(列值,列值...列值); 这个时候值得顺序要和数据表中定义的列的顺序一致

注意事项:

a、日期型数据和字符型数据必须使用单引号括起来

b、插入空值有两种方式:a、不指定值  b、设置values为null

c、未插入的列的值使用null补充

d、insert操作的时候前后两个部分的顺序要一致,包括数据类型和数据顺序

2、修改表记录

普通修改

update 表名称 set 列名称=列值,列名称=列值,列名称=列值...; 

注释:在没有添加条件的时候,会默认修改对应列名称下面的所有记录为上面的列值,这是不合理的

有条件修改,用于局部的修改,根据条件进行修改

update 表名称 set 列名称=列值,列名称=列值...[where 条件];   

[注释]:条件一般是结果为boolean类型数据

3、删除表记录

delete from 表名称 [where 条件];

4、一个特殊的删除方式

truncate table 表名称;  truncate 方法不是DML的操作,它是DDL的操作,它做的是对表结构的更改

上面的语句包含两个部分:a、drop table 表名称; 删除了表 b、create table  表名称; 创建了名称为之前的名字的新表

5、对上面的c、d两个区别的比较

使用delete操作可以回滚,即:数据可以恢复

使用truncate操作数据不可回滚,即:数据不可恢复

演示:start transaction;

delete * from student;

rollback; 回滚操作        

6、对于MYSQL语言的运算符

a、between...and

update tbl_student set s_gender='M' where s_age >= 10 and s_age <= 20;

update tbl_student set s_gender='F' where s_age between 10 and 20;

b、in(.....)

update tbl_student set s_name='xxx' where s_name='zhangsan' or s_name='lisi‘;

update tbl_student set s_name='xxx' where s_name in ('zhangsan','lisi');

c、not    

d、is null

update tbl_student set s_name='yyy' where s_age=null;这样操作是错误的-----为什么?=null不会报错,=‘null’也不会报错,但是结果不会被修改。 

update tbl_student set s_name='yyy' where s_age is null;  

当书写sql语句的时候,当出现了null的时候,不能使用等号,必须使用is null

###DCL数据控制语言

注释:DCL是root这个超级管理员所使用的操作,主要用啦对其他数据库的操作用户进行设置

1、创建用户

create user 用户名@IP地址 identified by 密码;

例:create user zhagsan@localhost identified by ‘1234’;

当想要使用这个账户登录系统的时候

mysql -uzhangsan -p1234

2、给用户授权

grant 权限1,权限2,权限3... on 数据库名称.* to 用户名@'IP地址';

数据库名称.* :表示数据库的所有文件包括记录表、其他文件等等

权限:CREATE/ALTER/DROP/INSERT/UPDATE/DELETE/SELECT

3、撤销授权

revoke 权限1,权限2,权限3... on 数据库名称.* to 用户名@'IP地址';

4、查看权限

show grants for 用户名@'IP地址';

5、删除用户

drop user 用户名@'IP地址';

###DQL数据查询语言        

1、基本查询   

a、普通查询

  select * from 表名称; 查询该表中的所有数据

b、列控制查询,即:查询指定列

  select 列名称,列名称。。。 from 表名称;

c、去重复查询,关键字 distinct

  select distinct 列名称 from 表名称;

d、使用运算符进行查询

  注意:任何数据和null进行操作的时候,都会称为null,应该使用if null (列名称,期望值)

  假设情况:当进行工资计算的时候,当需要计算工资和奖金的总和的时候,有的人不存在奖金表单中职位null

  这个时候进行计算工资总和的时候,就要使用到if null (列名称,期望值)

  select ename,sal + if null(comm,0) from emp;

  select ename,sal + if null(comm,0) [as] salary from emp;

e、给结果集起别名

  上面的sal + if null(comm,0)得到的结果是一个结果集,可以对这个结果集进行命名使用关键字as---ifnull  no " "!!!

  select ename,sal + if null(comm,0) as salary from emp; 其中as可省略

f、字符拼接

  当想要在输出的内容中,显示更好的输出样式,可以加上文字描述

  select ‘我的名字是:’+name from student; 这种方式是错误的,因为在mysql中不能使用”+“作为字符串连接符

  应该使用的是concat

  select concat('我是一名员工,我叫:',ename)[as aaa] from emp; 在这句话 中concat实现了字符连接的操作

g、基本条件查询

  select * from emp where='文员';

  select * from emp where sal betwwen 2000 and 3000 anddeptno=30;

h、模糊查询

  select * from emp where name like '张_';

  select * from emp where name like '张_ _';

  select * from emp where name like '_ _亮';

  select * from emp where name like '_ _ _';

  select * from emp where name like '张%';

  select * from emp where name like '%张%';

  select * from emp where name like '%';

2、排序查询注释:关键字:order by

a、单列排序

  select * from 表名称 order by 列名称 [asc\desc];  方括号中表示可选择内容,不写的时候默认为asc,表示升序、desc表示降序

b、多列排序

  select * from 表名称 order by 第一列 [asc\desc],第二列 [asc\desc];

  当经过第一列的排序之后,存在某几个具有相同的值得时候,采用第二列的条件再排序

3、聚合函数查询--UDAF

注释:聚合函数的运算时纵向的运算

a、count()  

  count(*):*表示所有列,计算有效行的数目,假如一行中所有列都为null,那么这行为无效记录,当括号中放入数字的时候,效果与*相同,表示所有列;

  count(xx):xx表示列名称,计算指定列的有效行数目,若在这一列中,某一行存在null,那这一行为无效行

b、sum(列名称)  求某一列的和

c、max(列名称)  求某一列中的最大值

d、min(列名称)  求某一列中的最小值

e、avg(列名称)  求某一列的平均值

4、分组查询

注释:使用哪个条件进行分组,这个条件必须是组信息,当使用非组信息查询的时候,虽然语法上是正确的,但是不符合要求

分组一般和聚合函数一起使用

    select     要查询并显示的内容  可以放*或列名称或聚合函数(UDAF)

     from       想要查询的表    具体的表

     where     分组前条件       不可放聚合函数

     group by   分组信息         列名称

     having     分组后条件     可以放聚合函数

     order by  对最终结果的操作 可放UDAF

5、MySql的特有:limit

注释:对于limit只在MySql中才有,其他数据库中不存在,而且Oracle数据库中也不存在

a、limit语法结构:select * from 表名称 limit m,n;

  查询5行记录,从0行开始

  select * from 表名称 limit 0,3;

  查询10行记录,从3行开始

  select * from 表名称 limit 3,10;

  注解:对于上面的语法limit后面跟着两个数字,第一个数字m:表示起始行,第二个数字n:表示要查询并显示的行数

b、拓展

  问:查询工资最高的员工的信息,在emp表中

  SELECT * FROM emp ORDER BY sal DESC  LIMIT 0,1;

  还可以使用子查询来操作

  SELECT * FROM (SELECT * FROM emp ORDER BY sal DESC) e LIMIT 0,1;

c、分页显示

  ① 关于页数的计算

  总页数=总记录条数%每页记录条数==0?总记录条数/每页记录条数:总记录条数/每页记录数+1;

  ②假如查询某一页数据并显示

  select * from 表名称 limit (要查询的页码-1)*每页记录数,每页记录条数;

--------------------- 本文来自 Zzreal 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zonzereal/article/details/78586943?utm_source=copy 

猜你喜欢

转载自www.cnblogs.com/A121/p/9711227.html