sql笔记

基础命令

mysql -u root -p123456 --登陆
exit;	--退出
show databases; --显示所有数据库
flush privileges; --刷新权限
use 数据库名 --切换数据库
create database [if not exists] 数据库名; --创建数据库
update user set password=password('123456')where user='root'; --修改密码(win)
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); --修改密码(mac)
--所有语句用;结尾
show tables;--查看数据库中所有的表的信息
--单行注释
/*
多行
注释*/
--mysql关键字不区分大小写
set password for username @localhost = password(’newpwd‘);--修改密码
describe user; --显示表数据库中user表的列信息
? 命令关键词 --寻求帮助
select version() --查询mysql版本

2、操作数据库

2.1、作数据库(了解)

操作数据库>操作数据库中的表>操作数据库中表的数据

1.创建数据库

create database [if not exists] 数据库名; --[]可选

2.删除数据库

drop database [if exists] 数据库名;

3.使用数据库

use `数据库名`; --如果你的表名或者字段名是特殊字符,需要带``

4.查看数据库

show databases; --查看所有数据库

--记住关键词,不要让自己记太多东西;对应可视化操作

2.2、数据库的列类型

数值

  • nityint 十分小的数据 1个字节
  • smallint 较小的数据 2个字节
  • mediumint 中等大小的数据 3个字节
  • int 标准的整数 4个字节 常用

注意:int(3),定义3位但是仍然可以存超过三位,这里指的是显示宽度

  • bigint 较大的数据 8个字节
  • float 浮点数 4个字节
  • double 浮点数 8个字节
  • decimal 字符串形式的浮点数 金融计算的时候,一般使用decimal 常用

字符串

  • char 固定大小的字符串 0~255
  • varchar 可变长字符串 0~65535 常用的变量

注意:不同于int(3),varchar(3)就只能存3位

  • tinytext 微型文本 比carchar大 2……8-1
  • text 文本串 2^16-1 保存大文本,怎么存都不溢出

时间日期

  • data YYYY-MM-DD 日期格式
  • time HH:mm:ss 时间格式
  • datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
  • timestamp 时间戳 1970.1.1到现在的毫秒数 全球统一
  • year 年份表示

null

  • 没有值,未知
  • 注意不要使用NULL进行运算,结果为NULL

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

Unsigned

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

zerofill

  • 0填充 ,不足的位数,使用0来填充
  • 例:int(3),输入为5,填充后为005

自增

  • 自动在上一条的基础上 +1(默认)
  • 通常用来设计唯一的主键,必须是整数类型
  • 可以自定义设计主键自增的起始值和步长

非空

  • 设置为not null,若不赋值就会报错;否则不填写就位null

默认

  • 设置默认的值,例:gentle默认值为男,若不指定该列的值,默认为男

每张表的固定字段(拓展,目前了解即可)

  • id 主键
  • version 用于乐观锁
  • is_delete 伪删除
  • gmt_create 创建时间吗
  • gmt_update 修改时间

每张表都必须存在以上字段,表示一个记录存在意义

2.4、创建数据库表(重点)

--使用sql创建学生表(列,字段)
--学号int 登陆密码varchar(20),姓名,性别varchar(20),出生日期(datatime),家庭住址,email

--注意,使用英文(),表的名称和字段尽量使用``括起来
--AUTO_INCREMENT 自增
--字符串使用单引号括起来
--所有语句后加英文逗号,最后一句不用加
--PRIMARY KEY主键,一个表一般只有唯一的一个,建议加到最后一句
CREATE TABLE IF NOT EXISTS `student` (
	`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT'学号',
	`name` VARCHAR(30) NOT NULL DEFAULT'未命名' COMMENT'姓名',
	`pwd` VARCHAR(30) NOT NULL DEFAULT'123456' COMMENT'密码',
	`sex` VARCHAR(3) 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 --查看student数据表的定义语句
DESC `student` --查看表的具体结构

2.5、关于数据表的区别

--关于数据库引擎
/*
INNODB 默认使用

MYISAM 早些年使用
*/
MYISAM INNODB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间的大小 较小 约为MYISAM的两倍

常规使用操作

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

在物理空间存在的位置

所有的数据库文件都存在data目录下

本质还是文件的存储

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

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

设置数据库表的字符集编码

CHARSET=utf8

不设置的话是mysql的默认字符集编码(不支持中文)

MySQL的默认编码是Latin1,不支持中文

也可以在my.ini中配置默认编码

character-set-serve=utf8 --建议不这么做,降低通用性

2.6、修改删除表

修改表

--修改表名
--ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher1

--ALTER TABLE 表名 ADD 字段名 列属性 增加新的字段
ALTER TABLE teacher1 ADD age INT(11)

--修改表的字段 重命名,修改约束
--ALTER TABLE 表名 MODIFY 字段名 列属性[]
ALTER TABLE teacher1 MODIFY age VARCHAR(11) --修改约束

--ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[]
ALTER TABLE teacher CHANGE age age1 INT(1) --字段重命名

/*最终结论:change用来字段重命名,不能修改字段类型和约束
					modify不能用来字段重命名,只能修改字段类型和约束
*/

--删除表的字段 
--ALTER TABLE 表名 DROP 字段名
ALTER TABLE teacher1 DROP age1

删除表

--删除表(如果表存在再删除)
DROP TABLE IF EXISTS teacher1

所有的创建和删除操作尽量加上判断以免报错

注意点:

  • 字段名用``包裹
  • 注释-- /**/
  • sql关键字大小写不敏感,建议小写
  • 所有的符号全部用英文

3、MySQL数据管理

3.1、外键(了解即可)

方式一、在创建表的时候,增加约束(麻烦且比较复杂)

create table if not exists `grade`(
	`gradeid` int(3) not null auto_increment comment'gradeid',
	`gradename` varchar(4) not null comment'gradename',
	primary key(`gradeid`)
)engine=innodb default charset=utf8

--学生表的gradeid字段要去引用年纪表的gradeid字段
--定义外键key
--给这个外键添加约束(执行引用) references引用

create table if not exists `student`(
	`id` int(3) not null auto_increment comment'学号',
	`name` varchar(4) not null default'未命名' comment'姓名',
	`sex` varchar(3) not null default'女' comment'性别',
	`gradeid` int(3) not null comment'学生的年级',
	primary key(`id`),
	key `FK_gradeid`(`gradeid`),
	constraint `FK_gradeid` foreign key (`gradeid`) references `grade`(`gradeid`)
)engine=innodb default charset=utf8

--删除有外键关系的表时,要先删除引用别人的表(从表),再删除被引用的表(主表)

方式二、创建表成功后添加外键约束

alter table `student` add constraint foreign key (`gradeid`) references `grade`(`gradeid`)
--alter table 表名 add constraint 约束名 foreign key 作为外键的列 references 被引用的表(被引用的字段)

以上都是物理外键,数据库级别的外键,不建议使用(避免数据库过多造成困扰)

最优选:

  • 数据库就是单纯的表格,只用来存数据,只有行(数据)和列(字段)
  • 我们想使用多张表的数据,想使用外键用程序实现

3.2、DML语言(全部记住)

数据库意义:数据存储,数据管理

DML语言:数据库操作语言

  • insert
  • update
  • delete

3.3、添加

insert

--插入语句(添加)
--insert into 表名([字段名1,字段名2,字段名3]) values('值1','值2','值3'),('值1','值2','值3')
insert into `grade`(`gradename`) values('大一') --主键自增可以省略

insert into `grade` values(2,'大二') --不写字段名会一一匹配

--插入多条
insert into `grade` values(3,'大一'),(4,'大二')

语法:insert into 表名([字段名1,字段名2,字段名3]) values('值1','值2','值3'),('值1','值2','值3')

注意事项:

  1. 字段间用英文逗号隔开

  2. 字段可以省略,但值一定要一一对应,不能多不能少

  3. 可以同时插入多条数据,一对括号代表一条

  4. 插入datetime数据时,要带英文引号

  5. 表名前不要加table

    insert into `student`values(90,'tom','male',1,'2023-02-09 15:56:05')
    

3.4、修改

Update 修改谁(条件) set 原来值=新值

update `student` set `name`='张三 ' where id=1

--不指定条件的情况下,会改变所有的表!
update `student` set `name`='李四'

--语法
--update `表名` set `colnum_name`=value,[colnum_name`=value,colnum_name`=value] where [条件] --即可修改多个字段的值

条件:where子句 运算符 id等于某个值,大于某个值,在某个区间内修改

操作符 含义 范围 结果
= 等于 5=6 false
<>或!= 不等于 5<>6 true
>
<
>=
<=
between and 在某个范围内 [2,5] 2,3,4,5
and && 5>1 && 1>2 false
or || 5>1 && 1>2 true
--通过多个条件定位数据,条件数量无上限
update `student` set `name`='张三' where `id`=3 and `gradeid`=2

--操作允许
update `student` set `id`=3 where `id`=8

注意事项:

  • colnum_name是数据库的列,尽量带上``
  • 条件若没有指定,则会修改所有的列
  • value可以是一个具体的值,也可以是一个变量
  • 多个设置的字段之间,使用英文逗号隔开
update `student` set `birthday`=current_time where id=15
--current_time指当前系统时间

3.5、删除

delete命令

语法:delete from 表名 [where 条件]

--删除数据(避免这样写,会全部删除)
delete from `student`

--删除指定数据
delete from `student` where id=15

truncate命令

完全清空一个数据库表,表的结构和索引约束不会变

--清空student表
truncate `student`

delete与truncate

  • 相同点:都能删除数据,都不会删除表结构
  • 不同:
    • truncate重新设置自增列,计数器会归零
    • truncate不会影响事务
create table if not exists `test`(
	`id` int(3) not null auto_increment,
	`name` varchar(4) default null,
	primary key(`id`)
)engine=innodb default charset=utf8


alter table `test` modify `name` varchar(10)

insert into `test` (`name`) values('name1'),('name2'),('name3')

delete from `test`  --不会影响自增

truncate `test`     --自增会归零

了解即可:delete删除的问题,重启数据库现象

  • innodb 自增列会从1开始 (存在内存中的,断电即失)实测重启mysql服务以及重启系统
  • MyISAM 继续从上一个自增量开始 (存在文件中的,不会丢失)

4、DQL查询数据(最重点)

4.1、DQL

data query language数据查询语言

  • 所有的查询操作都用它 关键词select
  • 简单的查询、复杂的查询都能做
  • 数据库中最核心的语言,最重要的语句
  • 使用频率最高的的语句

select完整语法

SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
  [left | right | inner join table_name2]  -- 联合查询
  [WHERE ...]  -- 指定结果需满足的条件
  [GROUP BY ...]  -- 指定结果按照哪几个字段来分组
  [HAVING]  -- 过滤分组的记录必须满足的次要条件
  [ORDER BY ...]  -- 指定查询记录按一个或多个条件排序
  [LIMIT {[offset,]row_count | row_countOFFSET offset}];
   -- 指定查询的记录从哪条至哪条
--注意 : [ ] 括号代表可选的 , { }括号代表必选得
--上下位置不能换,比如order by必须在limit上面

4.2、指定查询字段

--查询全部学生 select 字段 from 表
select * from `student`

--查询指定字段
select `studentno`,`studentname` from `student`

--别名,给结果起一个名字
--as 可以给字段起别名,也可以给表起别名
select `studentno` as '学号',`studentname` as '姓名' from `student`

--函数 concat(a,b)
select concat('姓名:',studentname) as '新名字' from `student`

语法:select 字段,... from 表

有的时候列名不是那么见名知意 我们起别名as

字段名 as 别名 表名 as 别名

去重 distinct

去除select语句查询出来的结果中重复的数据,只显示一条

--查询有哪些同学参加了考试
select * from `result` --查询全部的考试成绩
select `studentno` from `result` --查询有哪些同学参加了考试
select distinct `studentno` from `result` --去重
select version() --查询mysql版本
select 100*3-1 as '结果' --用来计算
select @@auto_increment_increment --查询自增的步长
select `studentno`,`studentresult`+1 as '加1分后成绩' from result --学员成绩加1分查看

数据库中的表达式:文本值,列,null,函数,计算表达式,系统变量……

select 表达式

4.3、where条件子句

作用:检索数据中符合条件的值

搜索的条件是由一个或多个表达式组成,结果为布尔值

逻辑运算符

运算符 语法 描述
and && a and b a&&b 逻辑与 两个都为真,结果为真
or || a or b a||b 逻辑或 一个为真,结果为真
not ! not a !a 逻辑非 真为假,假为真
select `studentno`,`studentresult` from `result`

--查询在95~100之间的成绩
select `studentno`,`studentresult` from `result`
where `studentresult`>=95 and `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

模糊查询 本质是比较运算符

运算符 语法 描述
is null a is null 若操作符为null,结果为真
is not null a is not null 若操作符不为null,结果为真
between a between b and c 若a在b和c间,结果为真
like a like b sql匹配,若a匹配b,结果为真
in a in(a1,a2,a3) 假设a在a1,a2,a3的某一个值,结果为真
--查询姓刘的同学
--like结合%(代表0到任意个字符) _(代表1个字符)
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 '%嘉%'

--in (具体的一个值或多个值)
--查询1001,1002,1003号学员
select `studentno`,`studentname` from `student` where `studentno` in(1001,1002,1003)

--查询学生地址
select `studentno`,`studentname` from `student` where `address` in('安徽','河南洛阳')

--查询地址为空的学生
select `studentno`,`studentname` from `student` where `address`='' or `address` is null

--查询有出生日期的学生
select `studentno`,`studentname` from `student` where `borndate` is not null

--查询没有填写出生日期的学生
select `studentno`,`studentname` from `student` where `borndate` is null

4.4、连表查询

join 对比

操作符名称 描述
inner join 只返回两个表中来联结字段相等的行
left join 返回包括左表中的所有记录和右表中联结字段相等的记录
right join 返回包括右表中的所有记录和左表中联结字段相等的记录

其中join

7_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 AS s
INNER JOIN result AS 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

join on 为连接查询

where 为等值查询

自连接

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

-- 创建一个表
CREATE TABLE `category` (
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id',
`pid` INT(10) NOT NULL COMMENT '父id',
`categoryName` VARCHAR(50) 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','办公信息');

-- 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
-- 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'
FROM category AS a,category AS b
WHERE a.`categoryid`=b.`pid`

-- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
select s.studentno,studentname,subjuctname,studentresult
from student as s
inner join result as r on s.studentno=r.studentno
inner join subject as sub on r.subjectno=sub.subjectno

-- 查询学员及所属的年级(学号,学生姓名,年级名)
select studentno,studentname,gradename
from student as s inner join grade as g
on s.gradeid=g.gradeid

-- 查询科目及所属的年级(科目名称,年级名称)
select subjectname,gradename
from subject as sub inner join grade as g
on sub.gradeid=g.gradeid

-- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
select s.studentno,s.studentname,sub.subjectname,r.studentresult
from student as s inner join result as r 
on s.studentno=r.studentno
inner join subject as sub 
on r.subjectno=sub.subjectno
where subjectname='数据库结构-1'

4.5、分页和排序

/*============== 排序 ================
语法 : 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

/*============== 分页 ================
语法 : 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:单页面显示条数]
   limit 起始值 页面的大小
   总页数=数据总数/页面大小
*/
--语法:`limit 查询起始下标,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

-- 查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)
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='JAVA第一学年' AND StudentResult>80
ORDER BY StudentResult DESC
LIMIT 0,10

4.6、子查询

where(这个值是计算出来的)

本质:在where语句中嵌套一个子查询语句

where(select * from)

/*============== 子查询 ================
什么是子查询?
   在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句
   嵌套查询可由多个子查询组成,求解的方式是由里及外;
   子查询返回的结果一般都是集合,故而建议使用IN关键字;
*/

-- 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列
-- 方法一:使用连接查询
SELECT studentno,r.subjectno,StudentResult
FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = '数据库结构-1'
ORDER BY studentresult DESC;

-- 方法二:使用子查询(执行顺序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
   SELECT subjectno FROM `subject`
   WHERE subjectname = '数据库结构-1'
)
ORDER BY studentresult DESC;

-- 查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名
-- 方法一:使用连接查询
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.`StudentNo` = r.`StudentNo`
INNER JOIN `subject` sub
ON sub.`SubjectNo` = r.`SubjectNo`
WHERE subjectname = '高等数学-2' AND StudentResult>=80

-- 方法二:使用连接查询+子查询
-- 分数不小于80分的学生的学号和姓名
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80

-- 在上面SQL基础上,添加需求:课程为 高等数学-2
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80 AND subjectno=(
   SELECT subjectno FROM `subject`
   WHERE subjectname = '高等数学-2'
)

-- 方法三:使用子查询
-- 分步写简单sql语句,然后将其嵌套起来
SELECT studentno,studentname FROM student WHERE studentno IN(
   SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
       SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2'
  )
)

/*
练习题目:
   查 C语言-1 的前5名学生的成绩信息(学号,姓名,分数)
   使用子查询
*/

select s.studentno,studentname,studentresult
from student s
inner join result r
on s.studentno=r.studentno
where subjectno=(
	select subjectno from subject
    where subjectname='C语言-1'
)
limit 0,5

MySQL函数

5.1、常用函数(不那么常用)

数据函数

 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();     /*用户*/

5.2、聚合函数(常用)

posted @ 2023-02-08 15:41  你好苏  阅读(71)  评论(0)    收藏  举报