MySQL数据库

文章目录

    • MySQL概述
    • 表:table
    • SQL语句分类
      • 导入数据
      • 常用命令
    • DQL数据查询语言
      • 条件运算符
      • 处理空函数
      • 分组函数
      • 分组查询
      • SQL语法规则:分组函数不能直接与where联合使用
      • SQL语法规则:只要一条语句中使用group by分组,select后面的字段必须是参加分组的字段
      • 查询结果集去重:关键字 distinct
      • 连接查询
        • 笛卡尔积现象
        • 表的别名:
        • 内连接:
          • 1、等值连接
          • 2、非等值连接
          • 3、自连接
        • 外连接
          • 1、左外连接
          • 2、右外连接
        • 全连接
        • 三张表连接查询
      • 子查询
        • union关键字
      • limit关键字分页
      • 计算时间差
    • DDL数据定义语言
      • 创建表
      • 表的复制
      • 约束
    • DML数据操作语言
      • insert语句向表中插入数据
        • 将查询结果插入另一张表中
      • update修改表数据
      • delete删除表中数据
        • truncate彻底删除:
      • CRUD操作

SQL(Structured Query Language结构化查询语言)

SQL用来和数据库打交道,完成和数据库的通信,SQL是一套标准(适用于90%的数据库,每种数据库都有自己的特性,当使用这些特性时SQL语句可能不是标准了)

什么是数据库:

数据库,通常是一个或一组文件,保存了一些符合特定规格的数据,数据库对应的英语单词是DataBase,简称:DB,数据库软件称为数据库管理系统(DBMS),全称为DataBase Management System,如:Oracle、SQL Server、MySql、Sybase、informix、DB2、interbase、PostgreSql 。

MySQL概述

MySQL是由MySQL AB公司(瑞典)开发的关系型数据库管理系统,08年由SUN公司收购,09年Oracle收购了SUN公司,使其并入了Oracle的数据库产品线。

sql、DB、DBMS分别是什么,他们之间的关系?

DB:
DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)

DBMS:
DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer…)

SQL:
结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。
SQL属于高级语言。只要能看懂英语单词的,写出来的sql语句,可以读懂什么意思。
SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)

DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
DBMS -(执行)-> SQL -(操作)-> DB

表:table

表是数据库的基本单元,所有的数据都已表格的形式组织,目的是可读性强

一个表包括行和列

​ 行:被称为数据/记录(data)

​ 列:被称为字段(column)

​ 每个字段都包括哪些属性?

每个字段的属性:字段名、数据类型、相关的约束

SQL语句分类

DQL 数据查询语言 查询语句,凡是select语句都是DQL
DML 数据操作语言 insert (增)、delete(删)、 update(改)、对表当中的数据进行增、删、改
DDL 数据定义语言 create(增)、 drop(删) 、alter(改),对表结构的增删改
TCL 事务控制语言 commit(提交事务),rollback(回滚事务)(TCL中的T是Transaction)
DCL 数据控制语言 grant(授权)、revoke(撤销权限)等

1、任何一条sql语句以";"结尾;
2、sql语句不区分大小写;

3、sql语句的字符串用英文单引号括起来;(单引号通用,mysql也支持双引号)

导入数据

ERROR 1064 (42000): You have an error in your SQL syntax;语法错误

第一步:登录mysql数据库管理系统

dos命令窗口

​ mysql -用户名 -p密码

mysql -uroot -p
Enter password: ****

第二步:查看有哪些数据库

show databases;(mysql特有命令,不属于SQL语句)

MySQL自带的四个数据库:information_schema、mysql、 performance_schema、test

show databases
 -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| newdb              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

第三步:创建自己的数据库

create database newDatabsses;(mysql特有命令,不属于SQL语句)

自定义名叫newDatabsses的数据库

create database newdbms;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| newdb              |
| newdbms            |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

第四步:使用newDatabsses数据

use newDatabsses;(mysql特有命令,不属于SQL语句)

mysql> use newdb;
Database changed

第五步:初始化数据

source sql后缀文件路径;

执行sql脚本文件

(以sql为后缀的文件,里面编写了大量sql语句,这样的文件称为sql脚本文件)

sql脚本中的数据量太大的时候,使用source命令完成初始化

第六步:查看数据库中有哪些表

show tables;(mysql特有命令,不属于SQL语句)

mysql> show tables;
+-----------------+
| Tables_in_newdb |
+-----------------+
| dept            |
| emp             |
| salgrade        |
+-----------------+

第七步:查看表结构

desc 表名;

mysql> desc dept;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| DEPTNO | int(2)      | NO   | PRI | NULL    |       |
| DNAME  | varchar(14) | YES  |     | NULL    |       |
| LOC    | varchar(13) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

第八步:查看表数据

select * from 表名;

mysql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

第九步:删除数据库

drop database 数据库名;

drop database newdbms;
Query OK, 0 rows affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| newdb              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

常用命令

select database(); 查看当前使用的哪个数据库
select version(); 查看mysql的版本号
\c 结束一条语句
exit 退出mysql
show create table 表名; 查看创建表结构的的语句;

DQL数据查询语言

语法格式 功能 注释
select 字段名1,字段名2,字段名3… from 表名; 查询指定表的字段数据 //字段可以参与算数运算
//查多个字段用英文逗号隔开
//”*“表示查询全部字段,一般开发中不用,效率较低;
select 字段 from 表名 where 条件; 条件查询 from(从)指定的表select(查询)满足where(条件)的字段(执行顺序:先from再where最后select)(条件运算符:
select old字 as new字段名 fro 表名; 重新命名表字段 as关键字可以省略
select 字段 from 表名 where 字段 between 最小值 and 最大值; 查询字段在某个区间的数据 区间左闭右开,也可以用于字符,必须左小右大
select 字段 from 表名 where 字段 is null; 查询某个字段null数据 数据库中的null不是一个值,代表什么都没有,为空
select 字段 from 表名 where 字段 like ‘%_a%’; 模糊查询 查询字段第二个字符是a的字符,”\“转义符
select 字段 from 表名order by 字段; 排序查询 默认升序排列,from(从)指定的表select(查询)字段by(通过)字段order(排序)
select 字段 from 表名order by 字段 asc; 升序查询 order by最后执行,排序输出
select 字段 from 表名order by 字段 desc; 降序查询

条件运算符

=等于、<>或!=(不等于)<、>、>=、<= 当运算符的优先级不确定时加括号(and优先级高于or)
between …and… 两者之间 区间左闭右开,也可以用于字符,必须左小右大
and (和)
is null (为空)
is not null (不为空)
or (或者)
in (包含) in(’ ‘,’ ',…)
not in (不包含)
not (非,主用于is和in中)
like (模糊查询) %:通配符匹配任意字段;_:每个代表一个字符占位用;[]:关键字匹配;[^]:过滤关键字匹配

处理空函数

所有数据库当中,只要有null参与的运算,最后 运算结果一定是null

ifnull() select ifnull(字段,定义预处理结果) from 表名;

分组函数

也叫多行处理函数,是对某一组数据进行处理,自动忽略null。

特点:输入多行,输出一行;

函数 功能
count(字段) 计数 select count(字段) from 表名;
sum(字段) 求和 select sum(字段) from 表名;
avg(字段) 平均值 select avg(字段) from 表名;
max(字段) 最大值 select max(字段) from 表名;
min(字段) 最小值 select min(字段) from 表名;

count(*)和count(字段)区别:

count(*): 不是统计某个字段中数据的个数,而是统计总记录条数(含null);

count(字段):表示统计某个字段不为null的数据总数量;

分组查询

group by 按照某个字段或者某些字段进行分组
having 是对分组后的数据进行再次处理

按例:找出每个工作岗位的最高薪资

select max(工资字段) from 表名 group by 工作岗位字段;

(从某个表中通过 工作岗位查出工资字段的最大数据返回结果是多行数据)

group by后面可以跟多个字段(多字段分组查询)

select 字段1,字段2 from 表名 group by 字段1,字段2;

根据字段1和字段2分组,查询相对应的数据

SQL语法规则:分组函数不能直接与where联合使用

否则出错:ERROR 1111(HY000):Invalid use of group function(无效的使用了分组函数)

原因:任何一个分组函数都是在group by语句执行结束后执行,当执行到where条件查询时还没有分组,所以没法使用分组函数,如果没有group by 整张表的数据自成一组(此时也是用group by分的组,只不过默认省略了),分组函数一般和group by联合使用,这也是为什么叫分组函数的原因。

select 字段 from 表名 where 条件 group by 字段 having 条件 order by 排序;

执行顺序:

1、from从某个表中根据where条件进行过滤;

2、group by将经过where过滤的数据进行分组;

3、having对分组后的数据进行二次过滤;

4、select查询到二次过滤的数据;

5、order by对查询到数据进行排序输出;

SQL语法规则:只要一条语句中使用group by分组,select后面的字段必须是参加分组的字段

否则执行有误,结果无意义

查询结果集去重:关键字 distinct

distinct只能出现在所有字段的最前面

select distinct 字段 from 表名;

mysql> select distinct job from emp;
+-----------+
| job       |
+-----------+
| CLERK     |
| SALESMAN  |
| MANAGER   |
| ANALYST   |
| PRESIDENT |
+-----------+
5 rows in set (0.01 sec)

连接查询

在实际开发中,一般业务都会对应多张表,需要对这多张表联合查询得出结果

当两张表连接查询时,A表的每条数据会默认和B表的所有数据匹配一次(笛卡尔积现象)

连接查询分类:

按照年代分 ——————————————————————————————
SQL92 老的语法,老的DBA(DataBase Administrator数据库管理员 )在用
SQL99 比较新的语法
根据表连接方式分 ——————————————————————————————
内连接 包括:等值连接、非等值连接、自连接
外连接 包括:左外连接(左连接)、右外连接(右连接)
全连接

笛卡尔积现象

在表连接查询方面有一种现象:笛卡尔积现象(笛卡尔乘积现象)

当两张表连接查询时,没有任何限制条件,最终结果数据条数是这两表记录条数的乘积

表的别名:

select e.enmae,d,dname from emp e,dept d;

优点:1、执行效率高;2、可读性好;

避免笛卡尔积现象:加条件过滤。

实际匹配次数还是笛卡尔积,只是加条件后显示的有效记录减少;

内连接:

1、等值连接

连接的条件是等量关系

SQL92(老语法) select e.enmae,d.dname from emp e,dept d where e.deptno=d.deptno; where后是表连接的条件,后面可以加and加其他条件
SQL99(新语法) select e.ename,d.dname from emp e join dept d on .deptno=d.deptno; form 表A join 表B on 连接条件 ;这种方式将表连接条件和过滤条件分开,使得命令更加清晰,后面还可再加where条件;join原本是inner join,表示内连接,inner可以省略
2、非等值连接

连接的条件是非等量关系

3、自连接

将一张表看做两张表,自己连自己,需要给表起别名

外连接

特点:主表的数据无条件的全部查询出来。

和内连接的区别:

1、内连接:

假设A和B表连接,使用内连接,凡是A表和B表能够匹配上的记录查询出来,AB两张表没有主副之分,是平等的,当两张表中的数据没有匹配上,数据就会丢失;

2、外连接:

假设A和B表连接,使用外连接,AB两张表有主副之分,主要查询主表的数据,捎带查询副表,当副表和主表中的数据没有匹配上,副表自动模拟出null与之匹配。

1、左外连接

左边的表是主表

A表 left joinB表 on…

2、右外连接

右边的表是主表

A表 right joinB表 on…

左右连接都有相互的写法,表的位置互换即可。

实际上是left outer join和right outer join,outer可以省略。

全连接

又叫全外连接,既有左连接又有右连接,full join先执行left join遍历左表,再执行 rigth join 遍历右表,最后将 rigth join 的结果直接追加到left join 后面。注意,full join 会返回重复的行,它们会被保留,不会被删除,使用null值作为两侧缺失匹配结果

三张表连接查询

A和B连链接,然后A再和C连接,两两分开

语法:A join B on… join C on…;

子查询

select 语句中可以嵌套select语句,被嵌套的select语句就是子查询。

用在哪个位置

select

​ …(select)

from

​ …(select)

where

​ …(select)

1、form后跟的子句实际上是将该子句查询的结果当作临时表使用,赋予别名会方便使用;

union关键字

将查询结果拼接在一起显示,可用于两张不相干的表,前 提这两张表的列数要相同,否则报错;

语法:select语句1 union select语句2;//union会自动去除重复的结果

语法:select语句1 union all select语句2;//union all不会自动去除重复的结果

limit关键字分页

取结果集中的部分数据

语法:limit startIndex,length

startIndex表示起始位置,可省略,默认从零开始;

length表示取几个;

例:取排名,前5名

mysql> select ename,sal from emp order by sal desc limit 5;
+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
| FORD  | 3000.00 |
| SCOTT | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
+-------+---------+
5 rows in set (0.00 sec)

1、mysql中特有的,其他数据库中没有,不通用,(Oracle中一个相同的机制,使用rownum关键字);

2、limit是SQL语句最后执行的环节;

计算时间差

在mysql当中怎么计算两个日期的“年差”,差了多少年?
TimeStampDiff(间隔类型, 前一个日期, 后一个日期)

timestampdiff(YEAR, hiredate, now())

间隔类型:
	SECOND   秒,
	MINUTE   分钟,
	HOUR   小时,
	DAY   天,
	WEEK   星期
	MONTH   月,
	QUARTER   季度,
	YEAR   年

DDL数据定义语言

对表结构进行增删改(create、drop、alter)

创建表

语法:

create table 表名{

​ 字段名1 数据类型;

​ 字段名2 数据类型 default 默认值;

​ …

}

常见数据类型 对应java中的类型
Char(长度) 定义长度字符串,存储空间固定,适合用来做主键或外键 String
Varchar(长度) 可变长字符串,存储空间等于实际数据空间(最多255个字符) StringBuffer/StringBuilder
double(有效数字位数,小数位) 数值型 double
Float(有效数字位数,小数位) 数值型 float/double
Int(长度) 整型 int
bigint(长度) 长整型 long
Date 日期型,年月日 java.sql.Date
DateTime 日期型,年月日 时分秒 毫秒 java.sql.Date
time 日期型,时分秒 java.sql.Date
BLOB Binary Large Object(二进制大对象),存储图片、视频等流媒体信息 Object
CLOB Character Large Object(字符大对象),存储较大文本 Object

char和Varchar如何选择?

Char(长度)固定长度,超过会报错,效率较高(不需要判断多少个长度,直接生成指定长度)

varchar(长度)根据实际存储动态分配空间,超过会报错

表的复制

语法:

create table new表名 as select * form 目标表名;

将查询结果当作表创建出来

约束

在创建表的时候,可以给表字段增加相应的约束

目的是:为了保证表中数据的合法性、有效性、完整性。

常见约束
not null 非空约束 约束的字段不能为null
unique 唯一约束 约束字段不能重复具有唯一性,可以为null
primary key 主键约束 约束字段既不能为null,又不能重复(简称pk)任何一张表都应该有主键且每张表只能有一个主键,作用是记录着行数据在这张表上的唯一标识,分为单一主键和复合主键(多字段联合使用一个主键)
foreign key 外键约束 (简称fk)foreign key(子表字段) references 父表名称父表字段)
check 检查约束 Oracle有,Mysql目前没有不支持check约束

  • 主键相关的术语?
    主键约束 : primary key
    主键字段 : id字段添加primary key之后,id叫做主键字段
    主键值 : id字段中的每一个值都是主键值。

  • 主键有什么作用?

    • 表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
      • 主键的作用:主键值是这行记录在这张表当中的唯一标识。(就像一个人的身份证号码一样。)
    • 主键的分类?
      根据主键字段的字段数量来划分:
      单一主键(推荐的,常用的。)
      复合主键(多个字段联合起来添加一个主键约束)(复合主键不建议使用,因为复合主键违背三范式。)
      根据主键性质来划分:
      自然主键:主键值最好就是一个和业务没有任何关系的自然数。(这种方式是推荐的)
      业务主键:主键值和系统的业务挂钩,例如:拿着银行卡的卡号做主键,拿着身份证号码作为主键。(不推荐用)
      最好不要拿着和业务挂钩的字段作为主键。因为以后的业务一旦发生改变的时候,主键值可能也需要
      随着发生变化,但有的时候没有办法变化,因为变化可能会导致主键值重复。

      • mysql提供主键值自增:(非常重要。)auto_increment关键字

        drop table if exists t_user;
        //drop table if exists xxx_book意思就是:如果数据库中存在xxx_book表,就把它从数据库中drop掉。备份sql中一般都有这样的语句,如果是数据库中有这个表,先drop掉,然后create表,然后再进行数据插入。
        		create table t_user(
        			id int primary key auto_increment, // id字段自动维护一个自增的数字,从1开始,以1递增。
        			username varchar(255)
        		);
        		insert into t_user(username) values('a');
        		insert into t_user(username) values('b');
        		insert into t_user(username) values('c');
        		insert into t_user(username) values('d');
        		insert into t_user(username) values('e');
        		insert into t_user(username) values('f');
        		select * from t_user;
        
        

        提示:Oracle当中也提供了一个自增机制,叫做:序列(sequence)对象。

        • 外键值可以为NULL?
          外键可以为NULL。

          • 外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?
            注意:被引用的字段不一定是主键,但至少具有unique约束。

          • 关于外键约束的相关术语:
            外键约束: foreign key
            外键字段:添加有外键约束的字段
            外键值:外键字段中的每一个值。

          • 顺序要求:
            删除数据的时候,先删除子表,再删除父表。
            添加数据的时候,先添加父表,在添加子表。
            创建表的时候,先创建父表,再创建子表。
            删除表的时候,先删除子表,在删除父表。

            drop table if exists t_student;
            drop table if exists t_class;
            
            		create table t_class(
            			cno int,
            			cname varchar(255),
            			primary key(cno)
            		);
            
            		create table t_student(
            			sno int,
            			sname varchar(255),
            			classno int,
            			primary key(sno),
            			foreign key(classno) references t_class(cno)
            		);
            

DML数据操作语言

对表中的数据进行增删改(insert、delete、update)

insert语句向表中插入数据

语法一:

insert into 表名(字段名1,字段名2,…)values(值1,值2,…);

要求:字段和值的数量相同,且数据类型对应相同;

语法二:

insert into 表名values(值1,值2,…);

values值的顺序和数量要求和原表相同,不能少写

语法三:

insert into 表名(字段名1,字段名2,…)values(值1,值2,…),(值1,值2,…),(值1,值2,…)

可插入多行数据英文逗号隔开

将查询结果插入另一张表中

语法:

insert into new表名 select * form 目标表名;

要求表结构相同

update修改表数据

语法:

update 表名 set 字段名1=值1,字段名1=值1,… where 条件;

没有条件,整张表数据全部更新。

delete删除表中数据

语法:

delete form 表名 where 条件;

没有条件,全部删除。

注意:只是删除表中的数据,表结构还存在,可以回滚,当删除大量数据时,慢

truncate彻底删除:

语法:truncate table 表名;//表被截断,数据永久丢失,不可回滚

CRUD操作

Create 增、Retrieve检索、Update修改、Delete删除


你可能感兴趣的:(MySQL数据库,数据库,mysql,sql)