(二)SQL语句
语法规则
- 不区分大小写,但是建议关键字大写,表名、列名小写
SELECT * FROM user;
- 支持多行编写sql语言(在SQLyog中可以用F12来快速格式化语句)
# 查询cno=20201/20202 sno=2020004的值
SELECT
grade as grade1,
(SELECT
grade
FROM
sc
WHERE sno = "2020004"
AND cno = "20201") AS grade2
FROM
sc
WHERE sno = "2020004"
AND cno = "20202"
执行顺序
sql语句的编写顺序
SQL语句的编写顺序:select ----from---- where---- group by ----having ----order by
sql语句的执行顺序
SQL语句的执行顺序:from-----where------group by------having ----select-----order by
DQL语言
数据库查询语言
基础查询
#1. 查询常量值
select 100;
#2. 查询表达式
select 100%9;
#3. 查询函数
select version();
#4. 去重
SELECT DISTINCT sno FROM sc
#5. +号的作用:只能做运算符
select 100+90 =190
select '100'+90 =190
select 'num'+90=0+90=90
select null+10 =null 只要一方为null,结果就是null
#6. 拼接 concat('a','b')
SELECT CONCAT(mno,mname) AS "m all" FROM major
模糊查询
select * from stu where sname like "_张"; --小张 x张
# _ 匹配单个任意字符
select length("a张") --output 4
-- 查看当前的编码
SHOW VARIABLES LIKE '%char%'
--其中有一条结果 character_set_client utf8
-- 在utf8中每一个汉字占3个字节,gbk是2字节
条件查询
in
select * from sc where sno="C001" or sno="C002";
等价于 select * from sc where sno in ('C001','C002');
∴ select * from sc where sno in ('C001','C%');
等价于 select * from sc where sno = ‘C001’ or sno='C%';
结论:通配符在in中是不生效的,是= 不是like
排序查询
# 先按成绩降序 再按sno升序
select * from sc order by grade desc ,sno ;
特点:
asc【默认升序】 desc 降序
oder by 子句一般放在查询语句的最后面,limit子句除外
聚合函数
sum 求和
avg 平均值
max 最大值
min 最小值
count 计算个数
1. 以上函数都忽略null值
select count(*) from stu 统计行数(因为只要有一列的不为null,就会统计进去)
2. 可以和distinct一起使用实现去重
select count(distinct sno) from stu;
group by 分组
1. 【ERROR】select mno,count(*) from stu group by mno where count(*)>2
where 后面的跟的必须是表中有的字段,而表中没有count(*)字段
∵是根据分组后再进行筛选,∴在group by 后面加 having
小结:
where 分组前筛选放group by前
having 分组后筛选放group by后
连接查询
分类
左连接:取左边的表的全部,右边的表按条件,符合的显示,不符合则显示null
右连接:取右边的表的全部,左边的表按条件,符合的显示,不符合则显示null
内连接:返回两张表都满足条件的部分
语法
select 查询列表
from 表1 别名
inner/left outer/right outer/full join 表二 别名
on 连接条件;
SELECT sname,cname,grade
FROM sc
INNER JOIN stu s ON sc.`sno`=s.`sno`
INNER JOIN cou c ON sc.`cno`=c.`cno`;
SELECT sname,mname
FROM stu
LEFT OUTER JOIN major ON stu.`mno`=major.`mno`
子查询
出现在其他语句中的select语句,称为子查询
分类
where或having后面 (☆)
子查询特点
①子查询放在小括号内
②子查询一般放在条件的右侧
③标量子查询,一般搭配这单行操作符使用 > < >= <= <>
④列子查询,一般搭配着多行操作符使用 in
--1. 标量子查询
案例: 谁的年龄比`小点`大?
一、查询大大的年龄
SELECT age FROM stu WHERE sname="小点"
二、查询谁的年龄比`小点`大?
SELECT sname FROM stu
WHERE age>(
SELECT age
FROM stu
WHERE sname LIKE "小点"
)
--2.列子查询
案例:返回专业名包含"工程"的总学生人数
SELECT COUNT(*)
FROM stu
WHERE stu.`mno` IN (
SELECT mno
FROM major
WHERE mname LIKE '%工程%'
)
select后面
-- 1.查询学号是20200016学生的20201和20202的总分
SELECT grade+(
SELECT grade
FROM sc
WHERE cno="20201" AND sno='20200016') AS tol
FROM sc
WHERE cno="20202" AND sno='20200016'
from后面
注意点:将子查询结果充当一张表,要求必须起别名
exists后面(相关子查询)
exists返回的结果1或0
分页查询
语法
在sql最后添加
limit offset,size
offset 要显示条目的起始索引(从0开始)
size 要显示条目的个数
-- 查询前五条学生的信息,学号倒序
SELECT * FROM stu ORDER BY sno DESC LIMIT 0,5
联合查询
union
合并 :将多条查询语句的结果合并成一个结果
应用场景:
要查询的结果来自多个表,且多个表没有直接的连接关系,但查询的信息一致时
特点:
1. 要求多条查询语句的列数是一致的,否则报错
2. 要求多条查询语句的查询的每一列的类型和顺序最好一致
3. union 默认会去重,union all 可以包含重复项
select id,name from stu
union
select id,tname from tea;
DML语言
数据库操作语言
添加
-- 插入多值
INSERT INTO `grade`(`name`) VALUES('大二'),('大三')
-- 支持子查询
INSERT INTO sc
SELECT * FROM sc_copy
修改
-- 联表修改的记录
-- 案例:修改软件工程的所有学生年龄+1
update stu
inner join major on stu.mno=major.mno
set stu.age=stu.age+1
where major.mname="软件工程"
删除
delete 和 truncate 区别
1. delete 可以加where条件,truncate 不行
语法:
delete from stu where sname="大大"
truncate table stu
2. truncate 删除,效率高一点
因为他没有where
3. 假如要删除的表中有自增长列(auto_increment),如果用delete删除后,再删除从断点开点
truncate清空表后,从1开始
4.delee删除有返回值,truncate删除没有返回值
delete eg:共3行受到影响
truncate eg:共0行受到影响
5.truncate删除不能回滚,delete删除可以回滚
DDL语言
数据库定义语言
创建表
# id自动增长
# 在name字段上建立一个唯一性索引
create table user(
id int auto_increment,
name varchar(30) unique,
unique index user_index(name)
)
# 给id创建一个普通索引
create table user(
id int,
index(id)
)
# 复制表
CREATE TABLE sc1
SELECT * FROM sc
WHERE 1=2
常见数据类型
整型、浮点型、字符型、日期型
varchar和char的区别
varchar的长度是可变 ,而char的长度是固定的。所以,查找的时候,char的效率更高。
常见约束
六大约束
not null 非空 用于保证该字段不能为空
default 默认,用于保证该字段有默认值,比如性别 default '男'
primary key 非空且唯一
unique 保证字段唯一,可以为空,比如:手机号
foreign key 外键
check 检查【在mysql中不支持】
最佳实践
数据库就是单纯的表,只是用来存放行和列
如果想使用外键,程序实现
约束添加分类
列级约束(在字段后加) | 表级约束(在表所有字段最后加) |
---|---|
六大约束都支持,除了外键约束没有效果 | 除了非空、默认,其他都支持 |
age int default 18 | foreign key(mno) references major(mno) |
(二)SQL语句的更多相关文章
- 数据库学习之二--SQL语句以及数据类型
一.SQL语句种类: 1. DDL(Data Definition Language,数据定义语言)用来创建或者删除存储数据用的数据库以及数据库中的表;包含以下几种指令: a. CREATE:CREA ...
- MyBatis 入门到精通(二) SQL语句映射XML文件
MyBatis 真正强大之处就在这些映射语句,也就是它的魔力所在.对于它的强大功能,SQL 映射文件的配置却非常简单. 如果您比较SQL 映射文件配置与JDBC 代码,您很快可以发现,使用SQL 映射 ...
- MSSQL数据库导入导出大全二(SQL语句)
Excel文件导入数据库多个Sheet if exists(select 1 from sysobjects where name=N'p_import_excel' and type='P')dro ...
- 二 sql语句,常用字段数据类型
MySQL中常用DDL命令 database definition language 与 DML命令 : database definition language 操作数据库: 创建数据库 : ...
- MySQL学习(二)——SQL语句创建删除修改以及中文乱码问题
一.对数据库的操作 1.创建一个库 create database 库名; 创建带有编码的:create database 库名 character set 编码; 查看编码:show create ...
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
- MyBatis学习 之 二、SQL语句映射文件(1)resultMap
目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...
- 戈多编程-小谈sql语句的优化分析
在sqlserver大数据查询中,避免不了查询效率减慢,暂且抛弃硬件原因和版本原因,仅从sql语句角度分析. 一. sql 语句性能不达标,主要原因有一下几点: 1. 未建索引,检索导致全表扫描 2. ...
- MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存
二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...
- MyBatis学习(二)、SQL语句映射文件(1)resultMap
二.SQL语句映射文件(1)resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyB ...
随机推荐
- Python:垃圾回收
有很多不同的方法来实现垃圾回收,例如跟踪,引用计数,转义分析,时间戳和心跳信号等.不同的语言依赖于不同的垃圾回收实现,例如,有些将其与编译器和运行时系统集成在一起.而其他语言则可能需要事后设置,甚至可 ...
- LAB1 启动操作系统
从机器上电到运行OS发生了什么? 在电脑主板上有一个Flash块,存放了BIOS的可执行代码.它是ROM,断电不会丢掉数据.在机器上电的时候,CPU要求内存控制器从0地址读取数据(程序第一条指令)的时 ...
- linux软件管理之yum管理操作软件包
什么是rpm 1.1`RPM` 全称 `RedHat Package Manager` 缩写,由红帽开发用于软件包的安装.升级.卸载与查询. 1.2rpm包名组成部分 `RPM` 包命名以-将软件分成 ...
- Flutter原理简介
Flutter 是怎么运转的? 与用于构建移动应用程序的其他大多数框架不同,Flutter 是重写了一整套包括底层渲染逻辑和上层开发语言的完整解决方案.这样不仅可以保证视图渲染在 Android 和 ...
- Kafka 消息存储机制
Kafka 消息以 Partition 作为存储单元,那么在 Partition 内消息是以什么样的格式存储的呢,如何处理 Partition 中的消息,又有哪些安全策略来保证消息不会丢失呢,这一篇我 ...
- 茫茫内存,我该如何用 windbg 找到你 ?
一:背景 1. 讲故事 前天wx上有个朋友丢给我一个dump,让我帮忙鉴定一下某些敏感信息在内存中是否也是加密的,现在数据安全很重要,不仅数据库中的信息要加密,灌到内存后数据同样也需密文存储,随用随解 ...
- Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF
1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...
- @Scheduled注解
1 概述 @Scheduled注解是spring boot提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行.注意需要配合@EnableScheduling使用,配 ...
- Day07_33_链表
链表 单链表 双向链表 * 什么是双向链表? 双向链表是链表的一种,由节点组成,每个数据结点中都有两个指针,分别指向直接后继和直接前驱. ---Nacos持久化Mysql8.0版本
Nacos持久化Mysql8.0版本 有关Nacos之前写过三篇文章. Spring Cloud Alibaba(3)---Nacos概述 Spring Cloud Alibaba(4)---Naco ...