MySql学习笔记

(一)数据库的基本概念:

1、数据库(DateBase,DB)

2、什么是数据库:用于存储和管理数据的仓库。
(数据存储在内存中,电脑开机关机就没有啦;存储在文件就可以长久保存)

3、数据库的特点:a、持久化存储数据(存储在文件里面),其实数据库就是一个文件系统 b、方便存储和管理数据 c、使用统一的方式操作数据库-SQL

4、常见的数据库软件:oracle(收费,非常贵),mysql,sql server(收费),DB2

Mysql:开源免费数据库,小型数据库,已被orcle收购,6.0版本也开始收费
oracle:收费大型数据库
DB2:收费,常用于银行

mysql数据库软件

安装
https://www.mysql.com/downloads/

登录:
mysql -uroot -proot;
账号为root,密码为root ;u代表user;p代表password;

卸载:
1、去mysql的安装目录找到my.ini文件
复制:datadir=“C:/ProgramData/MySQL/MySQL Server 5.5/Data/”
2、控制面板,卸载,卸载完成后,并没有卸载干净
3、删除C:/ProgramData下的MySql文件夹就行啦

配置:(安装的其实是服务)

mysql服务启动:

方法1:手动
方法2:cmd:services.msc 打开服务窗口
方法3:使用管理员打开cmd: net start mysql启动 net stop mysql关闭

登录:
mysql -uroot -proot
mysql -uroot -p (自动登录本机)
mysql -hip -uroot -p (登录别人的mysql)
mysql --host =127.899 --user=root --pasword=root

退出:
exit;quit

安装目录结构:
1安装目录:my.ini是配置文件
2数据目录

几个概念:(数据库:文件夹;表:文件;数据:数据)

服务器:硬件+软件
一个服务器软件可以有多个数据库,数据库其实就是一个文件夹
一个数据库会有多个表,相当于文件夹的文件
在这里插入图片描述

1、什么是sql?

Structured query language:结构化查询语言,定义了操作所有关系型数据库的规则。a) 是一种所有关系型数据库的查询规范,不同的数据库都支持;b) 通用的数据库操作语言,可以用在不同的数据库中;c) 不同的数据库 SQL 语句有一些区别,每一种数据库操作的方式存在不一样的地方,成为‘方言’

2、 SQL通用语法

a、可单行,用分号结尾
b、可使用空格和缩进来增强语句的可读性
c、Mysql数据库的sql语句不区分大小写,但是关键字建议用大写

3、3种注释:

a、单行注释:-- 注释内容 或者 #注释内容
b、.多行注释/注释/

4、SQL 语句分类

a、Data Definition Language (DDL 数据定义语言) 如:建库,建表
(客户端操作数据库和表)
b、Data Manipulation Language(DML 数据操纵语言), 如:对表中的记录操作增删改
(客户端增删改表中的数据)
c、Data Query Language(DQL 数据查询语言),如:对表中的查询操作
(客户端查询表中的数据)
d、Data Control Language(DCL 数据控制语言),如:对用户权限的设置
(授权)

Data Definition Language (DDL :数据定义语言)

操作数据库:CRUD

【C(create):创建 ;R(retrieve):查询;U(update):修改;D(delete):删除;使用数据库】

1、创建查询数据库:
(1)显示所有数据库名字:show databases
在这里插入图片描述
Information_schema:里面存放的并不是表,而是视图

Mysql:存放核心数据库,里面有很多表文件

Performance_schema:改善性能的数据库,里面同样有很多表

以上三个数据库最好不要乱动,会存在一定的风险

Test:可以随便动,里面就是空的

以上四个均为mysql自带的数据库。

(2)查看某个数据库的字符集(查询某个数据库的创建语句):
show create database 数据库名称;

(3)创建数据库:

create database db1;
create database if not exists db1;
create database db3 character set gbk;

小练习:
创建db4数据库,判断是否存在,并指定字符集为gbk:
create database if not exists db4 character set gbk;

2、修改数据库的字符集
alter database 数据库名称 character set 字符集名称;

3、删除数据库;drop database 数据库名称;drop database if exisits db3;

5、使用数据库
a) 查询当前正在使用的数据库名称:select database();
b) 使用数据库:use db1;

(二)Data Definition Language (DDL :数据定义语言)

操作数据表:CRUD**

1、查询:

查询某个数据库中所有的表:show tables;
查询表结构:desc 表名;

2、创建表:

(1)语法:
创建表:create table 表名(列名1 数据类型1,……,列名n 数据类型n);
注:最后一列,不需要加逗号
复制表:create table stu like student;

(2)数据类型:

int:整数类型 age int;

double:小数类型 score double(5,2);一共5位,保留2位小数

data:日期,只包含年月日,yyyy-MM-dd

datatime:日期,包含年月日,时分秒,yyyy-MM-dd HH:mm:SS

timestamp:时间戳类型,包含年月日,时分秒,yyyy-MM-dd HH:mm:SS;如果将来不给这个自带赋值,或者赋值为NULL,则自动赋值为系统时间

varchar:字符串 name varchar(20); 姓名限最大20个字符

3、删除表

删除表:drop table 表名;drop table if exists 表名;
复制表:create table stu like student;

4、修改表:

(1)修改表名
alter table 表名 rename to 新的表名;

(2)修改表的字符集
show create table stu2;
alter table stu2 character set utf-8;

(3)添加一列
alter table 表名 add 列名 数据类型;

(4)修改列名称 类型
alter table 表名 change 列名 新的列名 新的数据类型;
alter table stu2 change gender sex varchar(20);
alter table stu2 modify sex varchar(10)

5、删除列

Alter table 表名 drop 列名;
Alter table stu2 drop sex;

(四)DML:增删改表中数据

1、添加数据:

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

INSERT INTO stu2(id,NAME,age) VALUES(1,'张无忌',18);

注意:
(1)列名和值要一一对应,类型也要对应
(2)表名后不定义列名,默认给所有列添加值

INSERT INTO stu2 VALUES(2,'赵敏',17,99.9,NULL,NULL);

(3)除了数字类型,其他类型要用引号引起来

2、删除数据:

Delete from 表名where 【条件】;

DELETE FROM stu2 WHERE id=1;

(1)若不写条件,则删除表中所有数据,表中有多少条记录,他就会执行几次,就算是为了删除所有数据,也不建议用,因为效率太低;
(2)Truncate table stu2;—删除表,再创建一个一摸一样的空表
(3)删除表中所有记录的方法:

delete from 表名;--不推荐使用,有多少条记录就会执行多少次删除操作
truncate table stu2;--推荐使用,先删除表,再创建一张一样的空表

3、修改数据:
Update 表名 set 列名1=值1,列名2=值2,。。。。where 条件;

UPDATE stu2 SET age=20 WHERE id =1;
UPDATE stu2 SET age=18,score=100 WHERE id=2;

注意:如果不加任何条件,将修改表中所有记录;

(五)DQL:查询表中的记录

1、语法:

Select 
	字段列表
From
	表名列表
Where
	条件列表
Group by
	分组字段
Having
	分组之后的条件
Order by
	排序
Limit
	分页限定	

2、基础查询

(1)多个字段的查询

SELECT NAME,age FROM student2;

在这里插入图片描述
查询所有字段,可以使用*来替代字段列表(不建议使用)

(2)去除重复(distinct)

SELECT DISTINCT address FROM student2;

(3)计算列

可使用四则运算计算一些列的值(一般只会进行数值型的计算)

Ifnull(表达式1,表达式2):
表达式1:那个字段需要判断是否为null
表达式2:表达式1的字段为null后的替换值

SELECT NAME,math,english,math+english FROM student2;

在这里插入图片描述

SELECT NAME,math,english,math+IFNULL(english,0) FROM student2;

在这里插入图片描述
(4)起别名(As:as也可以省略)

SELECT NAME,math,english,math+IFNULL(english,0) AS 总分 FROM student2;(用空格代表as也行)

在这里插入图片描述
3、条件查询
(1)where 子句后跟条件

SELECT * FROM student2 WHERE english IS NOT NULL;

在这里插入图片描述
(2)运算符查询
<、>、 <=、 >= 、=、 <>、!=
Between …and
In(集合)
Like:模糊查询(占位符:_:单个任意字符;%:多个任意字符)
Isnull

-- 查询年龄大于20
SELECT * FROM student2 WHERE age > 20;
-- 查询年龄大于等于20小于等于30范围内的
SELECT * FROM student2 WHERE age >=20 && age<=30;  -- 不推荐&&
SELECT * FROM student2 WHERE age >=20 AND age<=30;
SELECT * FROM student2 WHERE age BETWEEN 20 AND 30; -- 包含20和30
-- 查询22岁,19岁,25岁的信息
SELECT *FROM student2 WHERE age=22 OR age=19 OR age=25;
SELECT *FROM student2 WHERE age IN (22,18,30);
-- 查询没有英语成绩的
SELECT *FROM student2 WHERE English IS NULL; -- null 不能用=或则!=
-- 查询英语成绩不是null的
SELECT * FROM student2 WHERE english IS NOT NULL;

(3)模糊查询

-- 查询姓马的有那些?
SELECT * FROM student2 WHERE NAME LIKE '马%';
-- 查询第二个字符是化的人
SELECT * FROM student2 WHERE NAME LIKE '_化%';
-- 查询姓名是三个字的人
SELECT * FROM student2 WHERE NAME LIKE '___';
-- 查询姓名中包含马的人
SELECT * FROM student2 WHERE NAME LIKE '%马%';

4、排序查询
语法:order by 子句

	Order by 排序字段1 排序方式1,排序字段2 排序方式2

排序方式:
ASC:升序,默认的
Desc:降序,

SELECT * FROM student2 ORDER BY math; -- 排序方式;
SELECT * FROM student2 ORDER BY math DESC; -- 排序方式;
-- 按照数学成绩排名,如果数学成绩一样,则按照英语成绩排名
SELECT * FROM student2 ORDER BY math ASC , english ASC;

注意:当有多个排序条件时,只有第一条件一样时才会使用第二条件

5、聚合函数:将一列数据作为一个整体,进行纵向的计算

(1)count:计算个数

a、一般选非空的列:主键
b、Count(*)

SELECT COUNT(NAME) FROM student2;

注意:聚合函数的计算会排除NULL的值
解决方案:a、选择非空的列进行计算;b、ifnull函数

(2)max:计算最大值
(3)min:计算最小值
(4)sum:计算和
(5)avg:计算平均值

SELECT COUNT(NAME) FROM student2;
SELECT COUNT(IFNULL(english,0)) FROM student2;
SELECT COUNT(*) FROM student2;
SELECT MAX(math) FROM student2;
SELECT MIN(math) FROM student2;
SELECT SUM(math) FROM student2;
SELECT AVG(math) FROM student2;

6、分组查询
语法:group by 分组字段;

注意:

(1)分组查询的字段只能是:分组字段或者聚合函数

(2)Where与having的区别?

Where 在分组之前进行限定,如果不满足则不参与分组,Having 在分组之后进行限定,如果不满足结果,则不会被查询出来;where 后不可以跟聚合函数的判断,having后可以跟聚合函数的判断

-- 按照性别分组,分别查询男女同学的平均分
SELECT sex, AVG(math) FROM student2 GROUP BY sex;
-- 按照性别分组,分别查询男女同学的人数,平均分
SELECT sex, COUNT(math), AVG(math) FROM student2 GROUP BY sex;
-- -- 按照性别分组,分别查询男女同学的人数,平均分,分数低于70分不参与分组
SELECT sex, COUNT(math), AVG(math) FROM student2 WHERE math>70 GROUP BY sex;
-- 按照性别分组,分别查询男女同学的人数,平均分,分数低于70分不参与分组,人数大于2个人
SELECT sex, COUNT(math), AVG(math) FROM student2 WHERE math>70 GROUP BY sex HAVING COUNT(id)>2;
SELECT sex, COUNT(math) 人数, AVG(math) FROM student2 WHERE math>70 GROUP BY sex HAVING 人数>2;

7、分页查询
(1)语法:limit 开始的索引,每页查询的条数;
(2)公式:开始的索引 = (当前页面-1)*每页显示的条数

SELECT * FROM student2 LIMIT 0,3;-- 第一页
SELECT * FROM student2 LIMIT 3,3;-- 第二页
SELECT * FROM student2 LIMIT 6,3;-- 第二页

(3)limit是一个MySql的‘方言’

(六)约束

概念: 对表中的数据进行限定,保证数据的准确性、有效性和完整性

分类:
1、 主键的约束:primary key
2、 非空约束:not null
3、 唯一约束:unique
4、 外键约束:foreign key

1、 非空约束(not null)

-- 创建表时加非空约束
CREATE TABLE stu(
		id INT,
		NAME VARCHAR(20) NOT NULL
);
-- 删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
-- 创建表完后添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

2、 唯一约束(unique)

注意:在mysql中,唯一约束限定的列可以有多个null

-- 创建表时添加唯一约束
CREATE TABLE stu(
		id INT,
		phone_name VARCHAR(20) UNIQUE
);
SELECT * FROM stu;
-- 删除唯一约束
ALTER TABLE stu DROP INDEX phone_name;
-- 创建表后添加唯一约束
ALTER TABLE stu MODIFY phone_name VARCHAR(20) UNIQUE;

3、主键约束(primary key)

注意:
(1)含义:非空且唯一
(2)一张表只能有一个字段为主键
(3)主键就是表中记录的唯一标识

-- 创建时添加主键
CREATE TABLE stu(
		Id INT PRIMARY KEY,
		NAME VARCHAR(20)
);

SELECT * FROM stu;
-- 删除主键
-- 错误示例   alter table stu modify id int;
ALTER TABLE stu DROP PRIMARY KEY;
-- 创建完表后添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;

4、自动增长:
概念: 如果某一列时数值类型的,使用auto_increment可以来完成值的自动增长

-- 创建时添加自动增长
CREATE TABLE stu(
		Id INT PRIMARY KEY AUTO_INCREMENT,
		NAME VARCHAR(20)
);
SELECT * FROM stu;
INSERT INTO stu VALUES(NULL,'CC');
-- 删除自动增长
ALTER TABLE stu MODIFY id INT;
-- 添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

5、外键约束:foreign key

让表与表产生关系,从而保证数据的正确性

(1)在创建表时,可以添加外键

语法:

Create table 表名(
	 ………
	外键列
Constraint 外键名称 foreign key 外键列名称 references 主表名称(主表列名称)
);

——————

--创建表时添加
CREATE TABLE emp (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(30),
	age INT,
	dep_name VARCHAR(30),
	dep_location VARCHAR(30)
);
-- 添加数据
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳');

SELECT * FROM emp;

– 数据有冗余
– 表的拆分

-- 一表 部门表
CREATE TABLE department(
	id INT PRIMARY KEY AUTO_INCREMENT,
	dep_name VARCHAR(20),
	dep_location VARCHAR(20)
);
-- 创建员工表(id,name,age,dep_id)
-- 多方,从表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT,
	dep_id INT, -- 外键对应主表的主键
	CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id)
);
-- 添加 2 个部门
INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳');
SELECT * FROM department;
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);


SELECT * FROM employee;

SELECT * FROM department;

DROP TABLE employee;
DROP TABLE department;
SHOW TABLES;

(2)删除外键

ALTER TABLE 表名DROP FOREIGN KEY 外键名称;

-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;

(3)-- 添加外键

ALTER TABLE 表名ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES department(id);

6、级联操作

(1)添加级联操作
语法:

alter table 表名 add constraint 外键名称
Foreign key (外键字段名称) references 主键名称(主表列名称) on update cascade on delete cascade;

(2)分类

级联更新:on update cascade
级联删除:on delete casdate

(七)多表查询

1、

Select * from table1,table2;

会进行笛卡尔积:有两个集合,会取两个集合的所有组成情况
2、多表查询,是为了消除无用的笛卡尔积

多表查询的分类:内连接查询,外连接查询,子查询

1、内连接查询(等值连接):只返回两个表中连接字段相等的行
(a)隐式内连接:使用where,消除无用数据

Select * from table1,table2 where;

(b) 显式内连接(inner join):

Select 字段列表 from 表名1 inner join 表名2 on 条件;

(c)内连接查询:1.从哪些表中查询数据;2.查询条件是什么;3.查询哪些字段

2、外连接查询:
(1)左外连接:返回左表中的所有记录和右表中连接字段相等的记录

Select 字段列表 from 表名1 left outer join 表名2 on 条件

(2)右外连接:返回右表中所有记录和左表中连接字段相等的记录

Select 字段列表 from 表名1 right outer join 表名2 on 条件

(3)全外连接:返回左右表中所有记录和左右表中连接字段相等的记录

3、 子查询
查询中嵌套查询

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

进击的小白菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值