Mysql学习笔记

1.初识mysql

命令行启动mysql

net start mysql

mysql -u root -p

123456
在这里插入图片描述

所有数据库都在目录:D:\MYSQL\mysql-5.7.34-win32\data

在这里插入图片描述

sqlyog操作

1.创建数据库school

在这里插入图片描述

2.新建一张表student

字段:id,name,age

在这里插入图片描述

常用基本命令

update user set password=password('123456')where user='root'; -- 修改密码
flush privileges; -- 刷新数据库
show databases; -- 显示所有数据库
use dbname;-- 打开某个数据库
show tables; -- 显示数据库mysql中所有的表
describe user; -- 显示表mysql数据库中user表的列信息
create database name; -- 创建数据库
use databasename; -- 选择数据库

exit; -- 退出Mysql
ctrl+c;-- 强行终止
? 命令关键词 :-- 寻求帮助
-- 单行注释
/*多行注释*/ 

2.操作数据库

操作数据库

创建数据库 : create database [if not exists] 数据库名;

删除数据库 : drop database [if exists] 数据库名;

查看数据库 : show databases;

使用数据库 : use 数据库名;

[]表示可要可不要

如果表名和字段名是一个特殊字符,则需要加上``

数据库的列类型

数值

名称适用大小
tinyint十分小的数据1个字节
smallint较小的数据2个字节
mediumint中等大小的数据3个字节
int标准的整数4个字节
bigint较大的数据8个字节
float浮点数4个字节
double浮点数8个字节
decimal字符串形式的浮点数金融计算使用

字符串

名称适用大小
char固定大小的字符串0~255
varchar可变字符串0~65535
tinytext微型文本2^8-1
text文本串2^16-1

时间日期

名称形式含义
dateYYYY-MM-DD日期
timeHH: mm: ss时间
datetimeYYYY-MM-DD HH: mm: ss
timestamp时间戳1970.1.1到现在的毫秒数
year年份

null

  • 没有值,位置
  • 不要使用NULL进行运算,结果未NULL

数据库的字段属性(重点)

Unsigned:

  • 无符号的整数
  • 声明了该列不能声明为负数

zerofill

  • 0填充的
  • 不足的位数,使用0来填充,int(3),5-----005

自增-08:36

  • 通常理解为自增,自动在上一条记录的基础上+1
  • 通常用设计唯一的主键~index,必须是整数类型
  • 可以自定义设计主键自增的起始值和步长

非空

  • 不给赋值就会报错

默认

  • 设置默认的值
  • sex,默认值为男

创建数据库表(重点)

-- 目标 : 创建一个school数据库
-- 创建学生表(列,字段)
-- 学号int 登录密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭住址,email
-- 创建表之前 , 一定要先选择数据库

CREATE TABLE IF NOT EXISTS `student` (
`id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` varchar(2) NOT NULL DEFAULT '男' COMMENT '性别',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`address` varchar(100) DEFAULT NULL COMMENT '地址',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

格式

CREATE TABLE IF NOT EXISTS `表名`(
	`字段名` 列类型 [属性] [索引] [注释]
	`字段名` 列类型 [属性] [索引] [注释]
	 .......
	`字段名` 列类型 [属性] [索引] [注释] 	
)[表类型][字符集设置][注释]

常用命令

-- 查看创建数据库的语句
SHOW CREATE DATABASE school;
-- 查看创建数据表的语句
SHOW CREATE TABLE student;
-- 显示表结构
DESC student;  -- 设置严格检查模式(不能容错了)SET sql_mode='STRICT_TRANS_TABLES';

数据表的类型(05:08)

-- 关于数据库引擎
/*
INNODB默认使用~
MYISAM早些年使用的
*/
MYISAMINNODB
事务支持不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间大小较小较大,约2倍

常规使用操作

  • MYISAM 节约空间,速度较快
  • INNODB 安全性高,事务的处理,多表多用户操作

MySQL引擎在物理文件上的区别

  • INNODB在数据表中只有一个*.frm文件,以及上级目录下的ibdata1文件
  • MYISAM对应文件
    • *.frm -表结构定义文件
    • *.MYD数据文件(data)
    • *.MYI索引文件(index)

设置数据表字符集

我们可为数据库,数据表,数据列设定不同的字符集,设定方法 :

  • 创建时通过命令来设置 , 如 : CREATE TABLE 表名()CHARSET = utf8;
  • 如无设定 , 则根据MySQL数据库配置文件 my.ini 中的参数设定

修改删除表

修改

修改表名 :ALTER TABLE 旧表名 RENAME AS 新表名
添加字段 : ALTER TABLE 表名 ADD字段名 列属性[属性]
修改字段 :
ALTER TABLE 表名 MODIFY 字段名 列类型[属性]
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[属性]

删除

删除表的字段:ALTER TABLE 表名 DROP 字段名
删除表:DROP TABLE [IF EXISTS] 

3.MySQL数据管理

外键(了解即可)

DML语言(全部记住)

  • 插入数据:INSERT INTO 表名([字段1,字段2,字段3,...] )VALUES('值1'),('值2'),('值3')

    -- 一次插入多条数据
    INSERT INTO grade(gradename) VALUES ('大三'),('大四');
    
  • 修改数据:UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];

    在这里插入图片描述

  • 删除数据:DELETE FROM 表名 [WHERE condition];

    -- 删除最后一个数据
    DELETE FROM grade WHERE gradeid = 5
    -- 清空年级表
    TRUNCATE grade
    

    注意:TRUNCATE区别于DELETE命令

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

    • 不同 :

      • 使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器
      • 使用TRUNCATE TABLE不会对事务有影响 (事务后面会说)

4.DQL查询语言(最重点)

DQL

(Data Query Language:数据查询语言)

指定查询字段

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

-- 查询所有学生信息
SELECT * FROM student;

-- 查询指定列(学号 , 姓名)
SELECT studentno,studentname FROM student;

AS 子句作为别名

-- 这里是为列取别名(当然as关键词可以省略)
SELECT studentno AS 学号,studentname AS 姓名 FROM student;

-- 使用as也可以为表取别名
SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;

-- 使用as,为查询结果取一个新名字
-- CONCAT()函数拼接字符串
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;

DISTINCT去重

-- # 查看哪些同学参加了考试(学号) 去除重复项
SELECT * FROM result; -- 查看考试成绩
SELECT studentno FROM result; -- 查看哪些同学参加了考试
SELECT DISTINCT studentno FROM result; -- 了解:DISTINCT 去除重复项 , (默认是ALL)

使用表达式的列(05:25)

-- selcet查询中可以使用表达式
SELECT @@auto_increment_increment; -- 查询自增步长
SELECT VERSION(); -- 查询版本号
SELECT 100*3-1 AS 计算结果; -- 表达式

-- 学员考试成绩集体提分一分查看
SELECT studentno,StudentResult+1 AS '提分后' FROM result;

where条件子句

逻辑运算符

运算符语法描述
and &&a and b a&&b
or ||a or b a||b
Not !not a !a
-- 满足条件的查询(where)
SELECT Studentno,StudentResult FROM result;

-- 查询考试成绩在95-100之间的
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;

-- AND也可以写成 &&
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 && StudentResult<=100;

-- 模糊查询(对应的词:精确查询)
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult BETWEEN 95 AND 100;

-- 除了1000号同学,要其他同学的成绩
SELECT studentno,studentresult
FROM result
WHERE studentno!=1000;

-- 使用NOT
SELECT studentno,studentresult
FROM result
WHERE NOT studentno=1000;

模糊查询

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

-- 模糊查询 between and \ like \ in \ null

-- =============================================
-- LIKE
-- =============================================
-- 查询姓刘的同学的学号及姓名
-- like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘%';

-- 查询姓刘的同学,后面只有一个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘_';

-- 查询姓刘的同学,后面只有两个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘__';

-- 查询姓名中含有 嘉 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '%嘉%';

-- 查询姓名中含有特殊字符的需要使用转义符号 '\'
-- 自定义转义符关键字: ESCAPE ':'

-- =============================================
-- IN
-- =============================================
-- 查询学号为1000,1001,1002的学生姓名
SELECT studentno,studentname FROM student
WHERE studentno IN (1000,1001,1002);

-- 查询地址在北京,南京,河南洛阳的学生
SELECT studentno,studentname,address FROM student
WHERE address IN ('北京','南京','河南洛阳');

-- =============================================
-- NULL 空
-- =============================================
-- 查询出生日期没有填写的同学
-- 不能直接写=NULL , 这是代表错误的 , 用 is null
SELECT studentname FROM student
WHERE BornDate IS NULL;

-- 查询出生日期填写的同学
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;

-- 查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;

联表查询

操作描述
Inner join如果表中至少有一个 匹配就返回行
left join会从左表中返回所有的值,即使右表中没有匹配
right join会从右表中返回所有的值,即使左表中没有匹配
/*
连接查询
   如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
内连接 inner join
   查询两个表中的结果集中的交集
外连接 outer join
   左外连接 left join
       (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
   右外连接 right join
       (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)
       
等值连接和非等值连接

自连接
*/

-- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
SELECT * FROM student;
SELECT * FROM result;

/*思路:
(1):分析需求,确定查询的列来源于两个类,student result,连接查询
(2):确定使用哪种连接查询?(内连接)
*/
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno

-- 右连接(也可实现)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.studentno = s.studentno

-- 等值连接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s , result r
WHERE r.studentno = s.studentno

-- 左连接 (查询了所有同学,不考试的也会查出来)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno

-- 查一下缺考的同学(左连接应用场景)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
WHERE StudentResult IS NULL

-- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno

自连接

自己的表和自己的表连接,核心:一张表拆成两张一样的表

分页和排序

排序

/*============== 排序 ================
语法 : ORDER BY
   ORDER BY 语句用于根据指定的列对结果集进行排序。
   ORDER BY 语句默认按照ASC升序对记录进行排序。
   如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
   
*/

-- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
-- 按成绩降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC

分页(04:18)

/*============== 分页 ================
语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
好处 : (用户体验,网络传输,查询压力)

推导:
   第一页 : limit 0,5
   第二页 : limit 5,5
   第三页 : limit 10,5
   ......
   第N页 : limit (pageNo-1)*pageSzie,pageSzie
   [pageNo:页码,pageSize:单页面显示条数]
   
*/

-- 每页显示5条数据
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5

子查询

5.Mysql函数

常用函数

  • 数学运算

    SELECT ABS(-8);  /*绝对值*/
    SELECT CEILING(9.4); /*向上取整*/
    SELECT FLOOR(9.4);   /*向下取整*/
    SELECT RAND();  /*随机数,返回一个0-1之间的随机数*/
    SELECT SIGN(0); /*符号函数: 负数返回-1,正数返回1,0返回0*/
    

    字符串函数

  •  SELECT CHAR_LENGTH('狂神说坚持就能成功'); /*返回字符串包含的字符数*/
     SELECT CONCAT('我','爱','程序');  /*合并字符串,参数可以有多个*/
     SELECT INSERT('我爱编程helloworld',1,2,'超级热爱');  /*替换字符串,从某个位置开始替换某个长度*/
     SELECT LOWER('KuangShen'); /*小写*/
     SELECT UPPER('KuangShen'); /*大写*/
     SELECT LEFT('hello,world',5);   /*从左边截取*/
     SELECT RIGHT('hello,world',5);  /*从右边截取*/
     SELECT REPLACE('狂神说坚持就能成功','坚持','努力');  /*替换字符串*/
     SELECT SUBSTR('狂神说坚持就能成功',4,6); /*截取字符串,开始和长度*/
     SELECT REVERSE('狂神说坚持就能成功'); /*反转
     
     -- 查询姓周的同学,改成邹
     SELECT REPLACE(studentname,'周','邹') AS 新名字
     FROM student WHERE studentname LIKE '周%';
    
  • 日期时间函数

     SELECT CURRENT_DATE();   /*获取当前日期*/
     SELECT CURDATE();   /*获取当前日期*/
     SELECT NOW();   /*获取当前日期和时间*/
     SELECT LOCALTIME();   /*获取当前日期和时间*/
     SELECT SYSDATE();   /*获取当前日期和时间*/
     
     -- 获取年月日,时分秒
     SELECT YEAR(NOW());
     SELECT MONTH(NOW());
     SELECT DAY(NOW());
     SELECT HOUR(NOW());
     SELECT MINUTE(NOW());
     SELECT SECOND(NOW());
    
  • 系统信息函数

    SELECT VERSION();  /*版本*/
    SELECT USER();     /*用户*/
    

聚合函数

函数名称描述
COUNT()返回满足Select条件的记录总和数,如 select count(*) 【不建议使用 *,效率低】
SUM()返回数字字段或表达式列作统计,返回一列的总和。
AVG()通常为数值字段或表达列作统计,返回一列的平均值
MAX()可以为数值字段,字符字段或表达式列作统计,返回最大的值。
MIN()可以为数值字段,字符字段或表达式列作统计,返回最小的值。
-- 查询不同课程的平均分,最高分,最低分
 -- 前提:根据不同的课程进行分组
 
 SELECT subjectname,AVG(studentresult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
 FROM result AS r
 INNER JOIN `subject` AS s
 ON r.subjectno = s.subjectno
 GROUP BY r.subjectno
 HAVING 平均分>80;
 
 /*
 where写在group by前面.
 要是放在分组后面的筛选
 要使用HAVING..
 因为having是从前面筛选的字段再筛选,而where是从数据表中的>字段直接进行的筛选的
 */
  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值