MySQL基础

一、为什么要学习数据库

1.持久化数据

2.方便检索

3.存储大量数据

4.共享、安全

5.通过组合分析,获取新的数据

二、数据库的相关概念

DB

database数据库,存储一系列有组织数据的容器

DBMS

Database Management System数据库管理系统,使用DBMS管理和维护DB

SQL

StructureQueryLanguage结构化查询语言,程序员用于和DBMS通信的语言

三、数据库存储数据的特点

1、数据先放在表中,表再放在库中

2、一个库可以有多张表,每张表都有自己的唯一标识名

3、一张表的设计,类似于java中"类"的设计

​ 表中的字段的设计,类似于属性的设计

​ 表中的单条记录,类似于一个对象

​ 表中的所有的记录,类似于对象的集合

orm :object relation mapping 对象关系映射

四、初始MySQL

1、MySQL产品的介绍

​ MySQL 前身属于瑞典的一家公司AB,2008年被sun公司收购,2009年sun被oracle公司收购。

特点:

① 体积小、安装较方便
②开源、免费
③性能高、稳定性好
④兼容性好

2、MySQL产品的安装 ★

基于C/S架构的DBMS,需要安装服务端和客户端

www.oracle.com

MySQL5.5

3、MySQL服务的启动和停止 ★

方式一:图形化

右击——计算机管理——服务——MySQL服务

方式二:通过管理员身份运行dos

net start 服务名

net stop 服务名

4、MySQL服务的登录和退出 ★

方式一:通过dos命令

mysql -h主机名 -P端口号 -u用户名 -p密码

注意:

如果是本机,则-h主机名 可以省略

如果端口号是3306,则-P端口号可以省略

方式二:通过图形化界面客户端

通过sqlyog,直接输入用户名、密码等连接进去即可

5、MySQL的常见命令和语法规范

①常见命令

  • show databases 显示当前连接下所有数据库

  • show tables 显示当前库中所有表

  • show tables from 库名 显示指定库中所有表

  • show columns from 表名 显示指定表中所有列

  • use 库名 打开/使用指定库

②语法规范

不区分大小写

每条命令结尾建议用分号

注释:

  • #单行注释

  • – 单行注释

  • /多行注释/

五、DQL语言的学习 ★

DQL:Data Query Language 数据查询语言

select

1、基础查询

语法:

select 查询列表 from 表名

特点

①查询结果集是一个虚拟表

②查询列表可以是单个字段、多个字段、常量、表达式、函数,可以是以上的组合

起别名

select 字段名 as "别名" from 表名;

select 字段名 "别名" from 表名;

+的作用

作用:加法运算

  • 如果两个操作数都是数值型,则直接做加法运算
  • 如果其中一个为非数值型,则将强值转换成数值型,如果转换失败,则当做0
  • 如果其中一个为null,则结果直接为null
'123'+4====》127

'abc'+4====》 4

去重

select distinct department_id from employees;

补充函数

select version();

select database();

select user();

select ifnull(字段名,表达式);

select concat(字符1,字符2,字符3);

select length(字符/字段);获取字节长度

2、条件查询

语法:

select 查询列表

from 表名

where 筛选条件;

特点:

筛选条件的分类:

①按条件表达式筛选

关系运算符:>= < <= > <> =

②按逻辑表达式筛选

逻辑运算符:and or not

③模糊查询

like:一般和通配符搭配使用

​ _ 任意单个字符

​ % 任意多个字符

between and:一般用于判断某字段是否在指定的区间

​ a between 10 and 100

in:一般用于判断某字段是否在指定的列表

​ a in(10,30,50)

is null:判断null值

3、排序查询

语法:

select  查询列表

from 表名

where 筛选条件

order by 排序列表 ;

特点:

①排序列表可以是 单个字段、多个字段、函数、表达式、别名、列的索引,以及以上的组合

②升序,通过asc

​ 降序,通过desc

4、常见函数

说明:sql中的函数分为单行函数和分组函数

调用语法:select 函数名(实参列表);

(1)字符函数

concat(str1,str2,..):拼接字符

substr(str,pos):截取从pos开始的所有字符,   起始索引从1开始

substr(str,pos,len):截取len个从pos开始的字符,起始索引从1开始

length(str):获取字节个数

char_length(str):获取字符个数

upper(str):变大写

lower(str):变小写

trim(【substr from】str):去前后指定字符,默认是去空格

left(str,len):从左边截取指定len个数的 字符

right(str,len):从右边截取指定len个数的 字符

lpad(str,substr,len):左填充

rpad(str,substr,len):右填充

strcmp(str1,str2):比较两个字符的大小

instr(str,substr):获取substr在str中第一次出现的索引

(2)数学函数

ceil(x):向上取整

floor(x):向下取整

round(x,d):四舍五入

mod(x,y):取模/取余

truncate(x,d):截断,保留小数点后d位

abs(x):求绝对值

(3)日期函数

now():获取当前日期——时间

curtime():只有时间

curdate():只有日期

date_format(date,格式):格式日期为字符

str_to_date(str,格式):将字符转换成日期

datediff(date1,date2):获取两个日期之间的天数差

year(date)

month(date)

(4)流程控制函数

①if(条件,表达式1,表达式2):如果条件成立,返回表达式1,否则返回表达式2

②case 表达式

when 值1 then 结果1

when 值2 then 结果2

...

else 结果n

end

5、分组函数

sum求和

avg平均

max最大

min最小

count个数

特点:

①实参的字段的类型,sum和avg只支持数值型,其他三个可以支持任意类型

②这五个函数都忽略null值

③count可以支持以下参数

count(字段):查询该字段非空值 的个数

count(*) :查询结果集的行数

count(1):查询结果集的行数

④分组函数可以和distinct搭配使用,实现去重的统计

select count(distinct 字段) from 表

6、分组查询

语法:

select 分组函数,分组的字段

from 表名

where 分组前的筛选条件

group by 分组列表

having 分组后的筛选条件

order by 排序列表;

特点:

①分组列表可以是单个字段、多个字段

②筛选条件分为两类

筛选的基表使用的关键字位置
分组前的筛选原始表wheregroup by 前面
分组后的筛选分组后的结果集havinggroup by 后面

7、连接查询

说明:当查询中涉及到了多个字段,则需要通过多表连接

笛卡尔乘积:

​ 出现原因:没有有效的连接条件

​ 解决办法:添加有效的连接条件

SQL92语法

select 查询列表 

from 表1 别名,表2 别名,... 

where 连接条件 

and 筛选条件

group by 分组列表

having 分组后筛选

order by 排序列表;
执行顺序:
1、from子句
2、where子句
3、and子句
4、group by子句
5、having子句
6、select子句
7、order by子句
(1)等值连接

① 多表等值连接的结果为多表的交集部分
②n表连接,至少需要n-1个连接条件
③ 多表的顺序没有要求
④一般需要为表起别名
⑤可以搭配前面介绍的所有子句使用,比如排序、分组、筛选

SELECT NAME,boyName 
FROM boys,beauty
WHERE beauty.boyfriend_id= boys.id;
为表起别名

①提高语句的简洁度
②区分多个重名的字段

注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定

SELECT e.last_name,e.job_id,j.job_title
FROM employees  e,jobs j
WHERE e.`job_id`=j.`job_id`;
(2)非等值连接
SELECT salary,grade_level
FROM employees e,job_grades g
WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`
AND g.`grade_level`='A';
(3)自连接
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;

SQL99语法

(1)内连接
语法:
select 查询列表    

from 表1 别名

【inner】 join 表2 别名 on 连接条件  

【inner】 join 表3 别名 on 连接条件

where 筛选条件  

group by 分组列表

having 分组后的筛选

order by 排序列表
SQL92和SQL99的区别:
SQL99,使用JOIN关键字代替了之前的逗号,并且将连接条件和筛选条件进行了分离,提高阅读性!!!
①等值连接
SELECT COUNT(*) 员工个数,d.department_name
FROM employees e
JOIN departments d
ON e.`department_id`=d.`department_id`
GROUP BY d.`department_id`
HAVING 员工个数>10
ORDER BY 员工个数 DESC;
②非等值连接
SELECT COUNT(*) 个数,grade
FROM employees e
JOIN sal_grade g
ON e.`salary` BETWEEN g.`min_salary` AND g.`max_salary`
WHERE e.`department_id` BETWEEN 10 AND 90
GROUP BY g.grade;
③自连接
SELECT e.`last_name`,m.`last_name`
FROM employees e
JOIN employees m
ON e.`manager_id`=m.`employee_id`;
(2)外连接
说明:

查询结果为主表中所有的记录,如果从表有匹配项,则显示匹配项;如果从表没有匹配项,则显示null

应用场景:

一般用于查询主表中有但从表没有的记录

特点:

1、外连接分主从表,两表的顺序不能任意调换
2、左连接的话,left join左边为主表
右连接的话,right join右边为主表

语法:
select 查询列表
from 表1 别名
left|right|full 【outer】 join 表2 别名
on 连接条件
where 筛选条件;
①左连接
SELECT b.`name`
FROM beauty b
LEFT JOIN boys bo ON b.`boyfriend_id` = bo.`id`
WHERE bo.`id`  IS NULL;
②右连接
SELECT b.*,bo.*
FROM boys bo
RIGHT JOIN  beauty b ON b.`boyfriend_id` = bo.`id`
WHERE bo.`id`  IS NULL;

8、子查询

说明

当一个查询语句中又嵌套了另一个完整的select语句,则被嵌套的select语句称为子查询或内查询
外面的select语句称为主查询或外查询。

分类:

1、select后面
	要求:子查询的结果为单行单列(标量子查询)
2、from后面
	要求:子查询的结果可以为多行多列
3、where或having后面 ★
	要求:子查询的结果必须为单列
		单行子查询
		多行子查询
4、exists后面
	要求:子查询结果必须为单列(相关子查询)

特点:

1、子查询放在条件中,要求必须放在条件的右侧
2、子查询一般放在小括号中
3、子查询的执行优先于主查询
4、单行子查询对应了 单行操作符:> < >= <= = <>
   多行子查询对应了 多行操作符:any/some  all in   

(1)放在where或having后面

①单行子查询
SELECT last_name,job_id,salary
FROM employees
WHERE job_id = (
	SELECT job_id
	FROM employees
	WHERE employee_id = 141
) AND salary>(
	SELECT salary
	FROM employees
	WHERE employee_id = 143
);
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(
	SELECT MIN(salary)
	FROM employees
	WHERE department_id = 50
);
②多行子查询

in:判断某字段是否在指定列表内

any/some:判断某字段的值是否满足其中任意一个

all:判断某字段的值是否满足里面所有的

SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<ALL(
	SELECT DISTINCT salary
	FROM employees
	WHERE job_id = 'IT_PROG'
);

(2)放在select后面

SELECT 
(
	SELECT COUNT(*)
	FROM employees
	WHERE department_id = 50
)  个数;

(3)放在from后面

SELECT dep_ag.department_id,dep_ag.ag,g.grade
FROM sal_grade g
JOIN (
	SELECT AVG(salary) ag,department_id
	FROM employees
	GROUP BY department_id
) dep_ag ON dep_ag.ag BETWEEN g.min_salary AND g.max_salary;

(4)放在exists后面

SELECT bo.*
FROM boys bo
WHERE NOT EXISTS(
	SELECT boyfriend_id
	FROM beauty b
	WHERE bo.id = b.boyfriend_id
);

9、分页查询

应用场景

当页面上的数据,一页显示不全,则需要分页显示

分页查询的sql命令请求数据库服务器——>服务器响应查询到的多条数据——>前台页面

语法:

select 查询列表
from 表1 别名
join 表2 别名
on 连接条件
where 筛选条件
group by 分组
having 分组后筛选
order by 排序列表
limit 起始条目索引,显示的条目数

执行顺序

1》from子句
2》join子句
3》on子句
4》where子句
5》group by子句
6》having子句
7》select子句
8》order by子句
9》limit子句

特点:

①起始条目索引如果不写,默认是0
②limit后面支持两个参数
参数1:显示的起始条目索引
参数2:条目数

公式:

假如要显示的页数是page,每页显示的条目数为size

select *
from employees
limit (page-1)*size,size;

page	size=10
1                       limit 0,10
2			limit 10,10
3			limit 20,10
4			limit 30,10

10、union联合查询

说明

当查询结果来自于多张表,但多张表之间没有关联,这个时候往往使用联合查询,也称为union查询

语法

select 查询列表 from 表1  where 筛选条件  
	union
select 查询列表 from 表2  where 筛选条件  

特点

1、多条待联合的查询语句的查询列数必须一致,查询类型、字段意义最好一致
2、union实现去重查询
union all 实现全部查询,包含重复项

六、DML语言的学习

1、插入语句

语法

插入单行
insert into 表名(字段名1,字段名2 ,...) values (值1,值2,...);
插入多行
insert into 表名(字段名1,字段名2 ,...) values(值1,值2,...),(值1,值2,...),(值1,值2,...);

特点

①字段和值列表一一对应
包含类型、约束等必须匹配

②数值型的值,不用单引号
非数值型的值,必须使用单引号

③字段顺序无要求

2、修改语句

语法

update 表名 set 字段名 = 新值,字段名=新值,...
where 筛选条件;		

3、删除语句

方式1:delete语句

delete from 表名 where 筛选条件;

方式2:truncate语句

truncate table 表名;	

七、DDL语言的学习

说明

​ Data Define Language数据定义语言,用于对数据库和表的管理和操作

1、库和表的管理 √

(1)创建数据库

CREATE DATABASE stuDB;

CREATE DATABASE IF NOT EXISTS stuDB;

(2)删除数据库

DROP DATABASE stuDB;

DROP DATABASE IF EXISTS stuDB;

(3)创建表 ★

语法:
CREATE TABLE [IF NOT EXISTS] 表名(
	字段名  字段类型  【字段约束】,
	字段名  字段类型  【字段约束】,
	字段名  字段类型  【字段约束】,
	字段名  字段类型  【字段约束】,
	字段名  字段类型  【字段约束】
);
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE IF NOT EXISTS stuinfo(
	stuid INT PRIMARY KEY,#添加了主键约束
	stuname VARCHAR(20) UNIQUE NOT NULL,#添加了唯一约束+非空
	stugender CHAR(1) DEFAULT '男',#添加了默认约束
	email VARCHAR(20) NOT NULL,
	age INT CHECK( age BETWEEN 0 AND 100),#添加了检查约束,mysql不支持
	majorid INT,
	CONSTRAINT fk_stuinfo_major FOREIGN KEY (majorid) REFERENCES major(id)#添加了外键约束

);

(4)修改表[了解]

语法
ALTER TABLE stuinfo RENAME TO students;

ALTER TABLE 表名 ADD|MODIFY|CHANGE|DROP COLUMN 字段名 字段类型 【字段约束】;

(5)删除表 √

DROP TABLE IF EXISTS students;

(6)复制表√

#仅仅复制表的结构

CREATE TABLE newTable2 LIKE major;

#复制表的结构+数据

CREATE TABLE newTable3 SELECT * FROM girls.`beauty`;

2、常见数据类型介绍 √

(1)整型

TINYINT SMALLINT  INT  BIGINT 

(2)浮点型

FLOAT(m,n)
DOUBLE(m,n) 
DECIMAL(m,n)
m和n可选

(3)字符型

CHAR(n):n可选
VARCHAR(n):n必选
TEXT
n表示最多字符个数

(4)日期型

DATE TIME  DATETIME TIMESTAMP

(5)二进制型

BLOB 存储图片数据

3、常见约束 √

说明

用于限制表中字段的数据的,从而进一步保证数据表的数据是一致的、准确的、可靠的!

NOT NULL 非空:用于限制该字段为必填项

DEFAULT 默认:用于限制该字段没有显式插入值,则直接显式默认值

PRIMARY KEY 主键:用于限制该字段值不能重复,设置为主键列的字段默认不能为空
	一个表只能有一个主键,当然可以是组合主键
	
UNIQUE 唯一:用于限制该字段值不能重复

CHECK检查:用于限制该字段值必须满足指定条件
	CHECK(age BETWEEN 1 AND 100)
	
FOREIGN KEY 外键:用于限制两个表的关系,要求外键列的值必须来自于主表的关联列
	要求:
	①主表的关联列和从表的关联列的类型必须一致,意思一样,名称无要求
	②主表的关联列要求必须是主键			
字段是否可以为空一个表可以有几个
主键×1个
唯一n个


八、TCL语言的学习

事务和事务处理

概念

由一条或多条sql语句组成,要么都成功,要么都失败

特性:ACID

原子性
一致性
隔离性
持久性

分类

隐式事务

没有明显的开启和结束标记
比如DML语句的insert、update、delete语句本身就是一条事务

insert into stuinfo values(1,'john','男','ert@dd.com',12);
显式事务

具有明显的开启和结束标记

​ 一般由多条sql语句组成,必须具有明显的开启和结束标记

步骤
取消隐式事务自动开启的功能
1、开启事务
2、编写事务需要的sql语句(1条或多条)
	insert into stuinfo values(1,'john','男','ert@dd.com',12);
	insert into stuinfo values(1,'john','男','ert@dd.com',12);
3、结束事务
SHOW VARIABLES LIKE '%auto%'

#演示事务的使用步骤

#1、取消事务自动开启
SET autocommit = 0;

#2、开启事务
START TRANSACTION;

#3、编写事务的sql语句

#将张三丰的钱-5000
UPDATE stuinfo SET balance=balance-5000 WHERE stuid = 1;

#将灭绝的钱+5000
UPDATE stuinfo SET balance=balance+5000 WHERE stuid = 2;

#4、结束事务

#提交
#commit;

#回滚
ROLLBACK;

SELECT * FROM stuinfo;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值