文章目录

  • 一、Other
    • 1.1 简单的创表语句
    • 1.2 innoDB和MyIsam引擎的比较
    • 1.3 添加物理外键约束
    • 1.4 DML
  • 二、DQL
    • 2.1 简单的查询
    • 2.2 联表查询
    • 2.3 自连接
    • 2.4 分页和排序
    • 2.5 子查询和嵌套查询
  • 三、常用函数
    • 3.1 数学运算
    • 3.2 字符串
    • 3.3 时间和日期函数
    • 3.4 查看系统和用户
    • 3.5 聚合和分组
    • 3.6 md5加密

一、Other

1.1 简单的创表语句

创建一个student表。

创建一个school数据库
创建学生表,使用SQL创建
学号int 非空 登录密码varchar(20)默认123456 姓名,性别,出生日期(datetime),家庭住址,email

CREATE DATABASE IF NOT EXISTS school;
USE school;
CREATE TABLE IF NOT EXISTS `student`(`id` INT(5) NOT NULL AUTO_INCREMENT COMMENT '学号',`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',`name` VARCHAR(10) NOT NULL DEFAULT '匿名' COMMENT '姓名',`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',`address` VARCHAR(50) DEFAULT NULL COMMENT '家庭住址',`email` VARCHAR(30) DEFAULT NULL COMMENT '邮箱',PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

1.2 innoDB和MyIsam引擎的比较

  • innoDB支持事务,支持外键,支持行级锁定
  • MyIsam占用空间小,支持全文检索

1.3 添加物理外键约束

USE school;
CREATE TABLE IF NOT EXISTS `student1`(`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '年级',`name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',`gradeId` INT(10) NOT NULL COMMENT '学生年级',PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `grade`(`gradeId` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',`gradeName` VARCHAR(20) NOT NULL COMMENT '年级名称',PRIMARY KEY(`gradeId`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;-- 创建了两个表,student1和grade,现在需要用student1来创建一个外键约束引用到grade表
-- 注意这里创建的是物理外键,正常情况下使用不多。因为要删除被引用的表就需要先删除引用他的表
-- 这里就不能直接删除grade表,必须删除student1表后才能删除grade表。
-- 原则:数据库就是存储数据,单纯的行列。需要这种外键操作时可以通过程序来实现。
ALTER TABLE `student1`
ADD CONSTRAINT `FK_gradeId` FOREIGN KEY(`gradeId`) REFERENCES `grade`(`gradeId`);

下面是直接删除grade表,会报错

1.4 DML

数据库管理语言:包括 insert   delete from   update

-- DML
DESC student;
-- 一次插两条记录
INSERT INTO `student`(`id`,`name`,`birthday`)
VALUES(1,'弱智','2000-01-01 12:00:01'),(3,'王华子','2000-08-13 12:00:13');-- 不写字段,直接插入值,但是值要和字段一一对应
INSERT INTO `student`
VALUES(4,'abcdefg','王凯子','1999-09-20','湖南槟榔村','shuaige@qq.com');-- 修改数据
UPDATE `student` SET `name`='亿羊干洗',`birthday`=CURRENT_TIME WHERE `id`=1;   /*可使用变量 current_time */
-- where条件判断 还有 betweent...and.. AND, OR这些-- 删除数据
DELETE FROM `student` WHERE `name`='王华子';
-- truncate和delete都可以清空表数据,但是有一些区别:
/* 1、truncate清空表数据会重置自增点;2、truncate不影响 事务 */

二、DQL

首先准备四张表。

-- DQL
-- 首先准备四张表。
CREATE DATABASE IF NOT EXISTS test;
USE test;
CREATE TABLE IF NOT EXISTS `grade`(`gradeId` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号',`gradeName` VARCHAR(20) NOT NULL COMMENT '年级名称',PRIMARY KEY(`gradeId`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
/* insert data into table `grade` */
INSERT INTO `grade`(`gradeName`)
VALUES('大一'),('大二'),('大三'),('大四'),('预科班');CREATE TABLE IF NOT EXISTS `result`(`studentNu` INT(4) NOT NULL COMMENT '学号',`subjectNu` INT(4) NOT NULL COMMENT '课程编号',`examDate` DATETIME NOT NULL COMMENT '考试日期',`score` INT(4) NOT NULL COMMENT '考试成绩',KEY `FR_subjectNu`(`subjectNu`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
/* insert data into table `result` */
INSERT INTO `result`(`studentNu`,`subjectNu`,`examDate`,`score`) VALUES(1000,1,'2022-06-13 14:00:00',88),(1000,2,'2022-06-14 08:30:00',78),(1001,3,'2022-06-15 14:00:00',68);CREATE TABLE IF NOT EXISTS `student`(`studentNu` INT(4) NOT NULL COMMENT '学号',`loginPwd` VARCHAR(20) DEFAULT NULL,`studentName` VARCHAR(20) NOT NULL COMMENT '学生姓名',`sex` TINYINT(1) DEFAULT NULL COMMENT '性别,0或1',`gradeId` INT(11) DEFAULT NULL COMMENT '年级编号',`phone` VARCHAR(11) NOT NULL COMMENT '联系电话',`address` VARCHAR(50) COMMENT '地址',`borndate` DATETIME DEFAULT NULL COMMENT '出生日期',`email` VARCHAR(20) NOT NULL COMMENT '邮箱',`idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',PRIMARY KEY(`studentNu`),UNIQUE KEY `idCard`(`idCard`),KEY `email`(`email`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `student`
VALUES(1000,'12345678','乌鸦哥',1,4,'13813457896','铜锣湾','1980-11-20 02:00:00','53252279@qq.com','411523198011200832'),(1001,'12345678','乌蝇哥',1,3,'15913457896','香港','1970-11-20 12:00:00','53752279@qq.com','不详');CREATE TABLE IF NOT EXISTS `subject`(`subjectNu` INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',`subjectName` VARCHAR(20) DEFAULT NULL COMMENT '课程名称',`classHour` INT(4) DEFAULT NULL COMMENT '课时',`gradeId` INT(4) DEFAULT NULL COMMENT '年级编号',PRIMARY KEY(`subjectNu`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `subject`(`subjectNu`,`subjectName`,`classHour`,`gradeId`)
VALUES(1,'高等数学',100,1),(2,'大学英语',90,1),(3,'C语言',48,1),(4,'计算机网络',36,2);

2.1 简单的查询

-- DQL
SELECT * FROM `result`;
SELECT * FROM `student`;
SELECT `studentName` AS `姓名`, `loginPwd` AS `密码` FROM `student`;
SELECT CONCAT('密码:', `loginPwd`) AS `New name` FROM `student`;
select version();        //查询版本
select @@auto_increment_increment;        //查询自增
select 100*3+1 as comp_result;         //用作计算
select distinct `studentNu` from `result`;      //distinct去重-- =============模糊查询=============
is NULL
is not NULL
between AND
LIKE
IN-- 查询姓刘的同学
select `studentName` from `student` where studentName like '刘%';      // %匹配任意个字符-- 查询两个字的姓刘的同学
select `studentName` from `student` where studentName like '刘_';  // _匹配一个字符-- 查询地址在安徽,洛阳,江苏的学生
select `studentName`, `studentNu` from `student` where address in ('安徽','洛阳','江苏');

2.2 联表查询

left join, right join, inner join的区别

-- 联表查询
/* 思路
1. 分析需求,分析查询的字段来自哪些表
2. 确定使用那种连接查询?确定交叉点
*/ALTER TABLE `result`
MODIFY COLUMN `score` INT(4);-- 查询学生的成绩
SELECT s.studentNu,studentName,subjectNu,score
FROM student AS s
INNER JOIN result AS r
ON s.studentNu = r.studentNu;SELECT s.studentNu,studentName,subjectNu,score
FROM student AS s
LEFT JOIN result AS r
ON s.studentNu = r.studentNu;SELECT s.studentNu,studentName,subjectNu,score
FROM student AS s
RIGHT JOIN result AS r
ON s.studentNu = r.studentNu;-- 查询缺考的同学
-- 即成绩为NULL的学生
SELECT s.studentNu,studentName,subjectNu,score
FROM student s
LEFT JOIN result r
ON s.studentNu = r.studentNu
WHERE score IS NULL;-- 三张表查询
/*  查询从参加考试的学生的信息:学号,姓名,科目,分数查询三张表:student, result, subject
*/
-- 先连接两张表,然后再连接第三张表
SELECT s.studentNu,studentName,subjectName,score
FROM student s
RIGHT JOIN result r
ON r.studentNu = s.studentNu
INNER JOIN SUBJECT sub
ON r.subjectNu = sub.subjectNu;

2.3 自连接

  • 连接的是同一张表
-- 自连接
-- 连接的是同一张表
CREATE TABLE `category`(`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题ID',`pid` INT(10) NOT NULL COMMENT '父ID',`categoryName` VARCHAR(20) NOT NULL COMMENT '主题名',PRIMARY KEY (`categoryid`)
)ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;INSERT INTO `category`(`categoryid`,`pid`,`categoryName`)
VALUES(2,1,'信息技术'),(3,1,'软件开发'),(4,3,'数据库'),(5,1,'美术设计'),(6,3,'Web开发'),(7,5,'PS技术'),(8,2,'办公信息');SELECT a.categoryName AS 父栏目, b.categoryname AS 子栏目
FROM `category` AS a
INNER JOIN `category` AS b
ON a.categoryid = b.pid;

2.4 分页和排序

  • limit, order by, desc, asc 几个关键字
-- 分页和排序 limit, order by
-- asc:升序 desc:降序
select s.`studentNu`,`studentName`,`score` from student s
inner join `result` r
on s.studentNu = r.studentNu
order by score DESC
limit 1,2;

2.5 子查询和嵌套查询

这里举个查询的例子来演示

  • 查询C语言成绩大于60分的学生学号和姓名,
-- 查询C语言成绩大于60分的学生学号和姓名,有三种方式都可以实现:联表查询,子查询,嵌套查询-- 1、普通的联表查询
select s.`studentNu`,`studentName`
from `student` s
inner join `result` r
on s.studentNu = r.studentNu
inner join `subject` sub
on r.subjectNu = sub.subjectNu
where subjectName = 'C语言' and score >= 60;-- 2、子查询
select s.`studentNu`,`studentName`
from `student` s
inner join `result` r
on s.studentNu = r.studentNu
where score >= 60 and `subjectNu` = (select subjectNu from subjectwhere subjectName = 'C语言'
);-- 3、嵌套查询
select `studentNu`,`studentName`
from `student`
where studentNu in (select studentNu from resultwhere score >= 60 And subjectNu = (select subjectNu from subjectwhere subjectName = 'C语言')
);

三、常用函数

3.1 数学运算

  • 包含求绝对值(abs),取整(ceiling || floor),随机数(rand) 这些常用的
-- 数学运算
select abs(-8)  -- 绝对值
select ceiling(9.4) -- 向上取整
select floor(9.4)   -- 向下取整
select rand()   -- 生成0~1之间的随机数
select sign(10) -- 判断是正数(1)还是负数(-1),或者0(0)

3.2 字符串

  • char_length, concat, lower, upper, instr, substr, reverse 等常用函数
-- 字符串
select char_length('你个老逼登') -- 字符串长度5
select concat('你','是','鲨臂')   -- 拼接
select lower('WoDiaoNiMaDe')  -- 小写
select upper('WoDiaoNiMaDe')  -- 大写
select instr('WoDiaoNiMaDe', 'Ma')  -- 返回第一次出现的子串索引
select replace('你个老逼登','逼登','可爱') -- 替换
select substr('他们说坚持就能成功',4,6)    -- 返回指定长度的字符串
select reverse('我叼你妈的')   -- 反转
  • 示例:查询姓肖的同学,并将肖改为萧
select replace(studentName,'肖','萧') from student
where studentName like '肖%';

3.3 时间和日期函数

  • 返回当前时间(now),时间戳(unix_timestamp),年月日
-- 时间和日期函数
select current_date()
select curdate()select unix_timestamp(now())    -- 返回时间戳
select from_unixtime(1666425897)    -- 时间戳转换为时间
select now()
select localtime()
select sysdate()select year(now())
select month(now())
select day(now())
select hour(now())
select minute(now())
select second(now())

3.4 查看系统和用户

-- 系统
select system_user()
select user()
select version()

3.5 聚合和分组

常用的聚合函数包含这几种:

  • count, sum, avg, min, max
-- count, sum, avg, min, max
select count(`bornDate`) from student;    -- 会忽略null值
select count(*) from student;   -- 不会忽略null值,返回行数
select count(1) from student;   -- 不会忽略null值,返回行数select sum(score) as 总分 from result;
select avg(score) as 平均分 from result;
select max(score) as 最高分 from result;
select min(score) as 最低分 from result;
  • 分组

示例:查询不同课程的平均分,最高分,最低分,要求显示平均分大于80分的

select sub.subjectName,avg(score) as 平均分,max(score) as 最高分,min(score) as 最低分 from result r
inner join subject sub
on r.subjectNu = sub.subjectNu
group by r.subjectNu
having 平均分 > 80;

3.6 md5加密

首先创建一个testmd5表,

create table `testmd5`(`id` int(4) not null,`name` varchar(12) not null,`pwd` varchar(20) not null,primary key(`id`)
)engine=innodb default charset=utf8;
desc testmd5;
alter table `testmd5` modify `pwd` varchar(50) not null;

插入密码和校验密码

-- 明文密码
insert into testmd5 values(1,'zhangsan','123456'),(2,'lisi','123456'),(3,'wangwu','123456');-- MD5加密
update testmd5 set pwd=md5(pwd);
select char_length(pwd) from testmd5 where id = 1;-- 插入数据库时加密
insert into testmd5 values(4,'xiaoming',md5('123456'));-- 校验密码  一般 是在程序中进行校验
select * from testmd5 where `name`='xiaoming' and pwd=md5('123456');

mysql语法使用总结相关推荐

  1. MySQL语法语句大全

    MySQL语法语句大全 一.SQL速成   ; B/ X* Q; t/ W) v" ]结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件(如表 ...

  2. db2和mysql语句区别_db2和mysql语法的区别是什么

    MySQL默认使用大小写敏感的数据库名.表名和列名(可以通过lower_case_table_names参数控制是否大小写敏感),DB2数据库对大小写不敏感. 虽然MySQL与DB2都遵循并符合SQL ...

  3. mongodb和mysql的对比_Mongodb与mysql语法比较

    Mongodb与mysql语法比较 mongodb与mysql命令对比 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据 ...

  4. MySQL语法中有哪些可以利用的漏洞?

    「作者主页」:士别三日wyx 「作者简介」:CSDN top100.阿里云博客专家.华为云享专家.网络安全领域优质创作者 「专栏简介」:此文章已录入专栏<MySQL数据库快速入门> MyS ...

  5. Mysql语法大全(命令行)(简洁、明了、全面)

    Mysql命令行的语法 另外一个Mysql语法大全的版本:点这里 两个Mysql语法大全以及命令行代码!!!基本上学习Mysql没有问题 嘿嘿!学习是一个长期的过程!!!还会继续更新!!! 基本的My ...

  6. MySQL语法练习---常见题型练习

    前言 这些都是在Navicat上实现的 一.创建表 CREATE TABLE products ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(4 ...

  7. MySQL语法学习笔记

    MySQL语法学习笔记 学习之道,非尽心竭力者不能进也!我是小七黛,欢迎查看我的笔记,有问题欢迎交流探讨. SQL是一种结构查询语言,用于查询关系数据库的标准语言,包括若干关键字和一致的语法,便于数据 ...

  8. Oracle merge into语法修改为MySQL语法解决方案

    (Oracle merge into语法修改为MySQL语法解决方案) 在MySQL中得使用"on duplicate key update"来实现判断新增还是更新操作. 但是这里 ...

  9. antlr4 mysql_Antlr4解析MySQL语法使用方法

    image.png 按照Oracle文件夹里的说明https://github.com/mysql/mysql-workbench/tree/8.0/library/parsers/grammars ...

  10. mssql mysql 语法区别_mssql与mysql区别之——变量区别

    sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的): 申明局部变量语法:declare @变量名 数据类型:例如:declare ...

最新文章

  1. 波士顿动力机器狗学会「撒尿」!拉风狗还不上街遛一遛?
  2. 协议森林08 不放弃 (TCP协议与流通信)
  3. 「神策 2020 数据驱动用户大会」10 月 13 日即将开幕,5 大亮点提前解锁!
  4. “山东土地集团杯”暨滨州市数据应用创新创业大赛正式启动!
  5. STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数
  6. 关于三体执剑者的一点思考
  7. 苹果“撞上”反垄断,围墙花园能否坚挺?
  8. 2017百度之星复赛:1006. Valley Numer(数位DP)
  9. 输出重定向与输入重定向
  10. centos7搭建ELK Cluster集群日志分析平台(四):Fliebeat-简单测试
  11. [转]Eclipse遇到的常见问题
  12. matlab/simulink 永磁直驱海上风电场仿真模型 含集群电流源等效 海上风电场线路结构
  13. PHP从入门到精通pdf
  14. pc网页唤起QQ、企业微信、skype、whatsApp等
  15. class类型重定义
  16. 十一、看门狗定时器实现1秒定时
  17. 全球与中国前置式翻斗车市场深度研究分析报告
  18. 转战物联网·基础篇02-物联网中的角儿
  19. 浏览器中的data类型的Url格式,data:image/png,data:image/jpeg!
  20. 头条的动态页面爬取+百度下拉搜索框

热门文章

  1. 人生路上前进的方向----有几条线贯穿自己的人生
  2. 微信APP支付申请方法
  3. 数据相关的在职研究生_南方医科大学2020年招收在职博士研究生导师名单及复试考生名单!...
  4. APP代码打包成apk文件
  5. windows11文件夹共享设置 如何共享 如何访问
  6. 2020计算机夏令营+预推免统计
  7. 微信公众号定位用户所在位置
  8. 移动开发与H5交互的研究
  9. 基于安卓的校园跳蚤市场app
  10. Linux shell随手记——ps -ef