MYSQL数据库

目录

1.数据库总览

2.Myql简介

3.结构化查询语句

4.SQL编写规范

5.注意事项

6.SQL操作数据库

7.SQL创建数据表

8.列类型分类

1》数值类型

2》字符串类型

3》日期和时间类型

 数据字段属性

一,DML(Data Manipulation Language,数据操作语言)

二,DQL(Data Query Language,数据查询语言)

三,从多个表显示数据

四,组函数

五,子查询 

六,事务操作

七,约束、视图


1.数据库总览

关系型数据库(SQL):MYSQL、Oracle、SQLserver、SQlite、DB2

非关系型数据库(NOSQL):Redis、MongoDB

数据库关系系统:DBMS(database manegement system)

数据管理软件,科学组织存储数据、高效的获取和维护数据

2.Myql简介

概念是现今流行的开源,免费的关系型数据库

特点:免费开源数据库、小巧功能齐全、使用便捷、可运用于windows或linux操作系统、可适用与中小型甚至大型网站应用

SQLyog:可手动操作、管理MySQL数据库的软件工具

数据库:长期存放在计算机内,有组织、可共享的大量数据的集合,是一个数据“仓库”

3.结构化查询语句

DDL(数据定义语言):定义和管理数据对象如数据库数据表等

命令:CREATE DROP ALTER RENAME TRUNCATE

DML(数据操作语言)操作数据库中所含的数据

命令:INSERT UPDATE DELETE

DQL(数据查询语言):查询数据库语言

命令:SELECT

DCL(数据控制语言):管理数据库的语言,包括管理权限及数据更改

命令:GRATE   COMMIT  ROLLBACK

4.SQL编写规范

SQL语句里所以表名、字段名全部小写、系统保留字、内置函数名、sql保留字大写

连接符or  in  and 以及=  <=   >=等前后加上一个空格

对较为复杂的sql语句,过程、函数加上注释、说明算法功能

SQL语句的缩进风格

1.一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进

2.where子句书写时,每个条件占一行,语句另起一行时,以保留字或者连接符开始,连接符右对齐。

多表连接时,使用表的别名来引用列。

5.注意事项

SQL 命令是大小写不敏感

SQL 命令可写成一行或多行

一个关键字不能跨多行或缩写

子句通常位于独立行,以便编辑,并易读

6.SQL操作数据库

创建数据库

语法    CREATE  DATEBASE  数据库名

删除数据库

语法    DROP  DATEBASE 数据库名

查看数据库

语法  SHOW DATABASES 数据库名

使用数据库

语法  USE 数据库名

7.SQL创建数据表

创建数据表,属于DDL的一种

语法  CREATE  TABLE 表名(

字段1 列类型  [ 属性 ]  [ 索引 ] [注释] ,

字段2列类型  [ 属性 ]  [ 索引 ] [注释] ,

字段3 列类型  [ 属性 ]  [ 索引 ] [注释] ,

)[  表类型 ] [ 表字符集 ] [注释] ;

8.列类型分类

1》数值类型

tinyint  非常小的数据   取值范围:有符值-27~27-1   无符号值:0 ~ 28-1        1字节

smallint  较小的数据   取值范围:有符值-223~223-1   无符号值:0 ~ 216-1        2字节

mediumint   中等大小的数据   取值范围:有符值-223~223-1   无符号值:0 ~ 224-1     3字节

int          标准整数   取值范围:有符值-231~223-1   无符号值:0 ~ 232-1       4字节

bigint   较大的整数  取值范围:有符值-263~263-1   无符号值:0 ~ 264-1       8字节

float   单精度浮点数  取值范围:±1.1754351e -38      4字节  

double  双精度浮点数  取值范围:±2.2250738585072014e -308        8字节

decimal  字符串形式的浮点数  取值范围:  decimal(m, d)        m个字节

2》字符串类型

char  固定长字符串,检索快但费空间    0 <=  M  <=   255     最大长度:M字符

varchar 可变字符串 0 <=  M <= 65535   最大长度:变长度

tinytext      微型文本串           最大长度 28–1字节

text   文本串            最大长度216–1字节

3》日期和时间类型

 数据字段属性

unsigned  无符号的 、 声明该数据列不允许负数

zerofill   数字0填充的、不足位数的用数字0填充,如:int(3),5则为 005

auto_increment  自动增长的,每添加一条数据,自动在上一个记录数上加1、通常用于设置主键,且为整数类型

NULL 和 NOT NULL 默认为NULL,即没有插入该列的数值  如果设置为NOT NULL,则该列必须有值

DEFAULT   默认的

用于设置默认值  例如,性别字段默认为“男”,否则为“女”;若无指定该列的值,则默认为“男”的值

数据表列类型注释及表注释

 SQL删除数据表

语法  DROP  TABLE  [ IF  EXISTS ]   表名

一,DML(Data Manipulation Language,数据操作语言)

区别TRUNCATE与DELETE

相同 都能删除数据、不删除表结构,但TRUNCATE 速度更快

不同 使用TRUNCATE TABLE会重新设置AUTO_INCREMENT计数器

二,DQL(Data Query Language,数据查询语言)

1. 查询表中所有的字段结果,采用“*”符号

SELECT   *   FROM student;

2.可指定查询的字段

SELECT     StudentNo, StudentName, Phone  FROM  student;

3.AS子句的作用

可给查询的字段取一个新别名,AS 也可省略不写

SELECT   StudentNo   AS   学号   FROM   student;

SELECT   a.StudentNo   FROM   student  AS  a;

SELECT   Phone+1  AS  Tel    FROM   student;

4.DISTINCT的作用

去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条

SELECT     DISTINCT   字段名1, 字段名2...     FROM   表名;

5.常见运算符 :+ - * / %

.

 6.比较运算符 :<   、>   =    <>     !=  (不等于)

7. BETWEEN AND范围查询

SELECT  字段列1,字段2 ,…FROM 表名 WHERE   字段x  BETWEEN  值1 AND  值2;  

查询课程表中课时在110和122之间的所有记录 SELECT  *  FROM  subject  WHERE ClassHour   BETWEEN  110   AND  122;

#等同于:  SELECT  *  FROM  subject  WHERE ClassHour >= 110  AND  ClassHour <=122;

8.like 模糊查询

在WHERE子句中,使用LIKE关键字进行模糊查询

与“%”一起使用,表示匹配0或任意多个字符

与“_”一起使用,表示匹配单个字符

示例#查询包含“数学”的所有课程 SELECT   *  FROM subject WHERE SubjectName  LIKE  "%数学%";

#查询所有姓名为“李**”三个字的学生信息 SELECT  StudentNo,StudentName FROM student   WHERE StudentName LIKE "李__";

9.in范围查询

SELECT  *  FROM  subject   WHERE   ClassHour = 100  OR ClassHour =110 OR ClassHour  = 122;  #普通处理方式

使用IN进行查询方式,更为简洁,效率更高 SELECT  *  FROM  subject  where ClassHour  IN ( 100, 110,122 );

10.null表示该字段属性为空

SELECT  *  from student  WHERE sex is null ;

空代表本字段无数据

SELECT *  from student   WHERE series = '';

11.limit限制行

第一种用法:直接加limit限制,表示显示前n条数据;
SELECT *  from student  LIMIT n;   

第二种用法:形式为limit m,n;    m为从第几行开始显示,m从0开始计数;n表示展示多少行;

SELECT *  from member   LIMIT 2,3; (第3行开始,5行结束)

12 Ordery by 升降序子句

ASC (升序)    DESC(降序) select* from  member ordery by salary asc ;(升序asc可不写)

select* from  member ordery by salary desc  ;

13.alter 使用方法

第一种增加列 (在设计结构中显示)

alter table emp add age int;(增加在最后一列)

alter table emp add age int after name;(增加在前面某列之后)

ALTER TABLE <表名> ADD <需添加的字段名> <字段类型> FIRST;(添加首例)

第二种修改列 change (1.修改列名,2.修改数据类型 3.修改属性)

alter table member change name Name varchar (50)  is null (前面是旧名字后面是新名字)

第三种,删除列drop

ALTER TABLE subject
DROP name003 ;

第四种,对表重命名

ALTER TABLE subject
RENAME subject1;

ALTER TABLE subject
RENAME to subject1;

14.#RENAME TABLE旧表 to 新表

rename TABLE subject1 to subject2;

 1.SELECT * 
FROM emp 
WHERE salary> 2000 and job = 'manager


2.SELECT * FROM emp 
WHERE salary*12 >30000 AND job != 'manager'


3.SELECT * FROM emp 
WHERE salary BETWEEN 1500 and 3000 AND job LIKE '%M%';

4.SELECT * FROM emp 
WHERE salary='' and (depNO =30 or deptNO =30);


5.SELECT * from emp WHERE salary !='' or deptNO =20 ORDER BY salary DESC;


6.SELECT * 
FROM emp 
WHERE (salary*12>30000 and job != 'manager') and(deptNO <> 10and deptNO <> 40) ORDER BY name ;
 

三,从多个表显示数据

1.多表查询概述:

  • 指从多张表中查询数据
  • 笛卡尔积:笛卡尔积是指在数学中,两个集合A集合和B集合的所有组成情况(在多表查询中需要消除无效的笛卡尔积)

举例:select * from emp , dept where  emp.deptno =dept.deptno;

2.多表查询分类

  • 内连接:相当于查询A,B交集部分数据(符合条件数据就匹配,不符合条件数据就过滤掉)
  • 外连接:左外连接指查询左表所有数据,以及两张表交集部分数据。  右外连接查询右表所有数据,以及两张表交集部分数据。(发起连接的表中记录全部被匹配,一个也不能少)
  • 自连接:当前表与自身的连接查询,自连接必须使用表别名

内连接语法

隐式内连接:select  字段列名 from 表1,表2 where l连接条件

例子:select e.id , e.name, e.deptno,d.deptno,d.name from emp e ,dept d where e.deptno =d.deptno;

显式内连接:select  字段列名 from 表1  inner join  表2 on 连接条件

例子:select e.id , e.name, e.deptno,d.deptno,d.name from emp e inner join dept d on e.deptno =d.deptno;(因为是先显示from后面的语句,所以可以给表起别名,inner可省略)

外连接语法(outer可省略)

左外连接:select  字段列名 from 表1 left outer join 表2 on 连接条件

相当于查询表1(左表)所有数据包含表1和表2交集部分的数据

举例:查询emp表所有数据,和对应的部门信息(左外连接)

select  e.*,d.name from emp e left outer join dept d on e.deptno =d.deptno;

右外连接:select  字段列名 from 表1 right outer join 表2 on 连接条件

相当于查询表2(右表)所有数据包含表1和表2交集部分的数据

举例:查询dept表所有数据,和对应的部门信息(右外连接)

select  d.*,e.name from emp e right outer join dept d on e.deptno =d.deptno;

自连接语法

select  字段列名 from  表A  别名 A  join 表A  别名B on 连接条件

举例:查询员工及其所属领导的名字

SELECT a.name,b.Name FROM emp a ,emp b WHERE a.empNO=b.manager-id;

举例:查询员工emp 及其所属领导的名字emp ,如果员工没有领导也需要查询出来

表结构:emp a (员工),emp  b(领导)

SELECT a.name,b.Name FROM emp a LEFT OUTER JOIN emp b on b.empNO=a.maneger;

联合查询 union ,union all

l联合查询就是把多次查询的结果合并起来,形成一个新的查询结果集。

select  字段列名 from  表A   where l连接条件

union (all)

select  字段列名 from  表B  where l连接条件

对于联合查询的多张表列数必须保持一致,字段类型也需要保持一致

union all 会将全部的数据合并在一起,union 会对合并后的数据去重

举例:将薪资低于5000的员工和年龄大于50的员工全部查询出来

select * from emp where salary<5000

union all (all去掉去重)

select * from emp where age>50;

多表连接,非等值连接,在(a,b 表两表内共有相同字段)

SELECT empno,demname,salary
from demp a ,salary b 
WHERE a.salary BETWEEN minsalary AND mixsalary;

四,组函数

1.分组函数类型

AVG ([DISTINCT|ALL]n)    求平均数

SUM ([DISTINCT|ALL]n)    求和

COUNT ({ *|[DISTINCT|ALL]expr})    计数

MAX ([DISTINCT|ALL]expr) 求最大值

MIN ([DISTINCT|ALL]expr)    最小值

STDDEV ([DISTINCT|ALL]x)

VARIANCE ([DISTINCT|ALL]x)

举例:SELECT AVG(age),SUM(age),MAX(age),MIN(age),COUNT(Name),COUNT(DISTINCT Name)
from emp;

2.#GROUP BY 分组
#1,所有用来分组的列在SELECT列表中不能使用分组函数
#2,出现在group by子句中的列,必须出现在select语句中;(不包括组函数所作用的列)

举例

SELECT deptNO ,age, MAX(salary)
from emp 
GROUP BY deptNO,age;

 3.HVING子句

Having子句的作用是对行分组进行过滤筛选

 SELECT deptNO,max(Salary)
FROM emp
WHERE deptNO = 100
GROUP BY deptNO
HAVING max(Salary) > 3000
ORDER BY deptNO
LIMIT N ;

接下来我们了解下sql语句执行的顺序

例:从学生表t_student中筛选出3年级年龄最大的女孩儿们,结果按照学号id升序

select max(age) from t_student where grade = 3 group by sex having sex = girl order by studentID asc

第一步:from 选择表

第二步:where 筛选条件,筛选对象--行

第三步:group by 将筛选出来的数据进行分组

第四步:having 筛选条件,筛选对象--组

第五步:select 选取最后的结果

第六步:order by 将结果按照特定顺序排列

从上面的执行顺序我们又知道了先执行where,后group by分组,分组完之后才能使用分组函数。

所以where后面的筛选条件出现了分组函数那就会报错。还没有进行分组呢,不能使用分组函数。

当我们遇到这种情况时,就要改变思路,用子查询即可,where后面跟一个子查询就迎刃而解了。
————————————————
 

五,子查询 

1.什么是嵌套查询

定义:在一个SELECT语句中的WHERE子句或HAVING子句中嵌套另一个SELECT语句的查询称为嵌套查询。其中,外层的SELECT查询语句叫外层查询或父查询,内层的SELECT查询语句叫内层查询或子查询。

2.使用子查询的规则

  • 子查询要用括号括起来
  • 将子查询放在比较运算符的右边
  • 子查询中不要加 ORDER BY子句,ORDER BY子句只能对最终查询结果即最外层查询的结果集进行排序
  • 对单行子查询使用单行运算符
  • 对多行子查询使用多行运算符
  • 子查询又分为不相关子查询和相关子查询。当子查询的查询条件不依赖于父查询时,这类子查询称为不相关子查询;当子查询的查询条件依赖于父查询时,这类子查询称为相关子查询。

3.子查询种类

  • 单行子查询 (单行单列)
  • 多行子查询(多行单列)
  • 多列子查询   (单行多列)

3.1单行子查询

  • 返回一条记录,返回单行单列的数据
  • 使用单行记录比较运算符 =  >   <    >=   <=    <>   !=

举例:哪些员工的工资比marry的工资高

select * from emp where salary > (select salary from emp where name  = 'mary');

举例:查询最低工资大于50号部门最低工资的部门和其最低工资

select deptno ,min(salary) from emp group by deptno having min(salary) >(select  min(salary) from where deptno= 50);

举例:返回job与10号员工相同,salary比13号员工多的员工姓名,job和工资

select deptno ,job ,name, salary from emp where job=(select job from emp where deptno =10) and salary > (select salary from where deptno =13);

3.2多行子查询

  • 返回多行
  • 使用多行比较运算符 in  any   all
  • >all指大于最大值
  • <all 指小于最小值
  • >any 指大于最小值
  • <any 指小于最大值
  • any 和all都用于where查询的子句,any是只要满足括号里的一个条件就返回true,all是必须满足括号里的全部条件才返回true,

举例:查询出001班级中年龄大于002班级所有人的同学

select * from student where 班级=001 and age >all (select age from student  where 班级=002)

相当于select * from student where 班级=001 and age > (select max(age) from student  where 班级=002)

举例:查询出001班级中,年龄大于002班级任意一个的同学

 select * from student  where 班级=001 and age>any (select age from student where 班级=002)

相当于select * from student where 班级=001 and age > (select min(age) from student  where 班级=002)

3.3多列子查询

多列子查询则是指返回多列数据的子查询语句。当多列子查询返回单行数据时,在where子句中可以使用单行比较符。而返回多行数据时,在where字句中必须使用多行比较符。(in,all,any)。

举例:查询员工编号最小并且工资最高的员工信息

一般思路:SELECT * FROM employees WHERE emp_id=( SELECT MIN(empe_id) from employees ) AND salary=( SELECT MAX(salary) FROM employees );

行子查询思路:SELECT * FROM employees WHERE (employee_id,salary)=( SELECT MIN(employee_id),MAX(salary) from employees );

4.拷贝数据到新表

1.复制表结构及数据到新表

create table student001(新表)

select * from student(旧表);

2.1仅复制表结构到新表

create table student002(新表)

select*from student where 1=2; (where1=2代表错误信息)

2.2.仅复制表结构到新表

create table student100 like student;(like仅支持5.0MySQL版本)

3.新表已存在通过旧表复制数据到新表

insert into student100

select* from student;

4.新表已存在通过旧表复制数据到新表(表结构不一样)

INSERT INTO student009(ID,Name,Sex,Address,Age,Series) SELECT stuID,stuName,Sex,Address,Age,Series from student;

六,事务操作

事务操作分为两种: 自动事务(默认的), 手动事务

默认情况下,MySQL执行每条SQL语句都会自动开启和提交事务。为了让多条SQL语句纳入到一个事物之下,可以手动管理事务。

1.START TRANSACTION;COMMIT ;ROLLBACK;

  • 当下列情况发生时事务自动提交:执行一个 DDL 语句、执行一个 DCL 语句 、从 SQL*Plus正常退出
  • 当从SQL*PLUS中强行退出或系统失败时,事物自动回滚

2.COMMIT 和ROLLBACK优点

  • 保证数据一致性
  • 在数据永久性生效前重新查看修改的数据
  • 相关逻辑操作单元

3.提交或回滚前数据状态

  • 以前的数据可恢复.
  • 当前的用户可看到DML操作的结果.
  • 其他用户不能看到DML操作的结果.
  • 被操作的数据被锁住,其他用户不能修改这些数据.

4.提交后数据状态

  • 数据的修改被永久写在数据库中.
  • 数据以前的状态永久性丢失.
  • 所有的用户都能看到操作后的结果.
  • 记录锁被释放,其他用户可操作这些记录.
  • 所有的 savepoints 被去掉.

5.回滚后的数据状态

  • 语句将使所有的修改失效.
  • 修改的数据被回退.
  • 恢复数据以前的状态. 
  • 行级锁被释放.

6.事务特性

事务的ACID特性:

1、原子性(atomicity): 一个事务中包含的所有sql语句都是一个不可分割的单元。

2、一致性(consistency) 事务必须确保数据库的状态是一致的。

3、隔离性(isolation) 多个事务独立运行,彼此不影响。

4、持久性(durability) 事务一旦提交,数据库的变化就会被永久保留下来。

7.读一致性

  • 读一致性保证了查询数据得到一致的结果.
  • 不同用户修改的数据不会发生冲突.
  • 对相同的数据操作时确保:查询时不用等写完成 、写时不用等查询完成

七,约束、视图

1.什么是约束

  • 约束是表级强制执行的规则.
  • 当表中数据有相互依赖性时,可保护数据不被删除
  • Oracle 有如下类型的约束:NOT NULL、UNIQUE Key  、PRIMARY KEY  、FOREIGN KEY  CHECK

2.外键约束的关键词

  • FOREIGN KEY  定义子表的哪一列作为外键约束
  • REFERENCES 指示主表和参照的列
  • ON DELETE CASCADE 删除主表记录时将子表相关记录删除
  • ON DELETE SET NULL 将外键引用置为空值

3.约束的添加、修改。删除

添加主键约束:alter table student  add primary key(id)

修改主键约束:将id修改为name

alter table student  modify name varchar(32)primary key;

删除主键约束:alter table student drop primary key;

4.视图

4.1什么是视图

视图: view, 是一种有结构(有行有列)但是没结果(结构中不真实存放数据)的虚拟表, 虚拟表的结构来源不是自己定义, 而是从对应的基表中产生(视图的数据来源).

4.2视图的意义

  • 视图可以节省SQL语句: 将一条复杂的查询语句使用视图进行保存: 以后可以直接对视图进行操作
  • 数据安全: 视图操作是主要针对查询的, 如果对视图结构进行处理(删除), 不会影响基表数据(相对安全).
  •  视图往往是在大项目中使用, 而且是多系统使用: 可以对外提供有用的数据, 但是隐藏关键(无用)的数据: 数据安全
  • 视图可以对外提供友好型: 不同的视图提供不同的数据, 对外好像专门设计
  • 视图可以更好(容易)的进行权限控制

4.3可对视图进行DML操作,操作规则

 1在下列情况下不能删除记录: 视图包括组函数 、视图包括GROUP BY 子句 、视 图 包 括 DISTINCT  、Rownum伪列关键词 。

2.在下列情况下不能修改记录 : 前面所提到的情况、 列是由表达式定义的 、包括ROWNUM 虚列

3.在下列情况下不能添加记录 : 前面所提到的情况、 视图的基表有非空列,但在视图中没有此列

4.4创建视图

Create view 视图名字 as select语句; -- select语句可以是普通查询;可以是连接查询; 可以是联合查询; 可以是子查询. 创建单表视图: 基表只有一个  创建多表视图: 基表来源至少两个

例如CREATE VIEW student001as SELECT stuid , name,age  from student;

4.5查看视图

视图是一张虚拟表: 表, 表的所有查看方式都适用于视图: show tables [like]/desc 视图名字/show create table 视图名; 视图一旦创建: 系统会在视图对应的数据库文件夹下创建一个对应的结构文件: frm文件

4.6修改视图

Alter view 视图名字 as 新的select语句;

4.7删除视图

Drop view 视图名字;

4.8新增数据

1.多表视图不能新增数据

2.可以向单表视图插入数据: 但是视图中包含的字段必须有基表中所有不能为空(或者没有默认值)字段

3.视图是可以向基表插入数据的.

4.9删除数据

多表视图不能删除数据  单表视图可以删除数据

5.其它数据对象

5.1什么是序列号

自动生成唯一的数字 、是一个共享的对象 、典型的应用于表的主键 、可替代应用代码、 将序列号值放在缓存中可提高访问速度

create sequence 定义序号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值