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')
注意事项:
-
字段间用英文逗号隔开
-
字段可以省略,但值一定要一一对应,不能多不能少
-
可以同时插入多条数据,一对括号代表一条
-
插入datetime数据时,要带英文引号
-
表名前不要加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
测试
/*
连接查询
如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
内连接 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(); /*用户*/

浙公网安备 33010602011771号