SQL语句

其它

MySQL注释

注释在 SQL 语句中用来标识说明或者注意事项的部分,对 SQL 的执行没有任何影响。因此,注释内容中无论是英文字母还是汉字都可以随意使用。

  • 单行注释:(快捷键:‘ctrl’ + ‘/’)
    使用#注释符,格式为:# 注释内容
    使用--注释符,格式为:-- 注释内容
  • 多行注释:(快捷键:‘ctrl’ + ‘shift’ + ‘/’)
    使用/**/注释符,格式为:/* 注释内容 */

SQL语句书写规则

  • SQL关键字和函数名:
    SQL关键字和函数名不区分大小写

  • 数据库名、表名、视图名
    MySQL 用服务器主机的底层文件系统所包含的目录和文件来表示数据库和表。因此,数据库名和表名的默认大小写取决于服务器主机的操作系统在命名方面的规定。
    例如:Windows系统文件名不区分大小写,Linux系统文件名区分大小写。

  • 存储程序的名字
    存储函数、存储过程和事件的名字都不区分大小写。触发器的名字要区分大小写,这一点与标准 SQL 的行为有所不同。

  • 列名和索引名
    MySQL中,列名和索引名都不区分大小写。

  • 别名
    默认情况下,表的别名区分大小写,别名可以任意使用大小写组合。

数据库基本操作

创建数据库

在 MySQL 中,可以使用 CREATE DATABASE 语句创建数据库,语法格式如下:

CREATE DATABASE IF NOT EXISTS grade_sys
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci

使用SHOW CREATE DATABASE查看数据库的定义声明:

show create database grade_sys

说明:

  • <数据库名>grade_sys:
    创建数据库的名称。MySQL 的数据存储区将以目录方式表示 MySQL 数据库,因此数据库名称必须符合操作系统的文件夹命名规则,不能以数字开头,尽量要有实际意义。注意在 MySQL 中不区分大小写。

  • IF NOT EXISTS:
    建库前先判断库是否存在,避免重复创建已有数据库而导致报错。
    MySQL 不允许在同一系统下创建两个相同名称的数据库。

  • DEFAULT CHARACTER SET utf8
    DEFAULT COLLATE utf8_general_ci
    创建 MySQL 数据库时指定字符集校对规则

查看数据库

  • 查看所有数据库
show databases
  • Like从句查看指定数据库
# 库名完全匹配
show databases like 'grade_sys'
# 库名包含
show databases like '%grade%'
# 库名以xxx开头
show databases like 'grade%'
# 库名以xxx结尾
show databases like '%sys'

修改数据库属性

在 MySQL 数据库中只能对数据库使用的字符集和校对规则进行修改,数据库的这些特性都储存在 db.opt 文件中。
使用 ALTER DATABASE 来修改已经被创建或者存在的数据库的相关参数

# 使用命令行工具将数据库 grade_sys 的指定字符集修改为 gb2312,默认校对规则修改为 gb2312_unicode_ci
alter database grade_sys
default character set gb2312
default collate gb2312_chinese_ci
  • ALTER DATABASE 用于更改数据库的全局特性。
  • 使用 ALTER DATABASE 需要获得数据库 ALTER 权限。
  • 数据库名称可以忽略,此时语句对应于默认数据库。
  • CHARACTER SET 子句用于更改默认的数据库字符集。

删库

当数据库不再使用时应该将其删除,以确保数据库存储空间中存放的是有效数据。删除数据库是将已经存在的数据库从磁盘空间上清除,清除之后,数据库中的所有数据也将一同被删除。
在 MySQL 中,当需要删除已创建的数据库时,可以使用 DROP DATABASE 语句。

drop database if exists grade_sys

语法说明:

  • <数据库名>:指定要删除的数据库名。
  • IF EXISTS:用于防止当数据库不存在时发生错误。
  • DROP DATABASE:删除数据库中的所有表格并同时删除数据库。使用此语句时要非常小心,以免错误删除。如果要使用 DROP DATABASE,需要获得数据库 DROP 权限。

选择数据库

MySQL中有很多系统自带的数据库,操作前需要先选择要使用哪个库。
语法:

USE <数据库名>

------------------------------------------------------分割线---------------------------------------------

数据表基本操作

参考:http://c.biancheng.net/mysql/50/

------------------------------------------------------分割线---------------------------------------------

查询

sql执行顺序

参考:https://www.cnblogs.com/yuanshuo/p/11549251.html

一、sql执行顺序
(1)from
(3) join
(2) on
(4) where
(5)group by(开始使用select中的别名,后面的语句中都可以使用)
(6) avg,sum…
(7)having
(8) select
(9) distinct
(10) order by

从这个顺序中我们不难发现,所有的 查询语句都是从from开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入。

select name, sum('语文','数学','英语') as 总成绩
from tb_grade
where class_id = '001'
group by name
having sum('语文','数学','英语') > 300
order by sum('语文','数学','英语')

如上sql语句,执行顺序如下:
1、先执行from 子句,从tb_grade表组装源数据;
2、执行where条件子句,筛选符合条件的数据;
3、再执行group by,按照name分组
4、having子句中,先执行sum求和,然后才执行having子句
5、执行order by子句,根据指定条件排序

基本查询

  • 基本查询语句:
SELECT * FROM <表名>

例:查询students表所有数据
SELECT * FROM students;

SELECT是关键字,表示将要执行一个查询,*表示“所有列”,FROM表示将要从哪个表查询。
注意:查询结果也是一个二维表,它包含列名每一行的数据

  • SELECT语句用于计算
    SELECT语句其实并不要求一定要有FROM子句。下面的SELECT语句:
SELECT 100+200;

上述语句会直接计算出表达式的结果。
虽然SELECT可以用作计算,但它并不是SQL的强项。但是,不带FROM子句的SELECT语句有一个有用的用途,就是用来判断当前到数据库的连接是否有效。许多检测工具会执行一条SELECT 1,来测试数据库连接。

条件查询

  • 条件表达式:
SELECT * FROM <表名> WHERE <条件表达式>

例:查询成绩80分以上的学生信息
SELECT * FROM students WHERE score >= 80;
  • 多条件表达式:
    条件表达式可以用<条件1> AND/OR <条件2>表达满足条件1并且满足条件2。
    另一种条件是NOT <条件>,表示“不符合该条件”的记录。
SELECT * FROM <表名> WHERE <条件表达式1> AND <条件表达式2>

SELECT * FROM <表名> WHERE <条件表达式1> OR <条件表达式2>

SELECT * FROM <表名> WHERE NOT <条件表达式>
  • 若不加括号(),条件运算按照NOTANDOR的优先级进行,即NOT优先级最高,其次是AND,最后是OR。加上括号可以改变优先级。

常用的条件表达式有:
SQL常用条件表达式

投影查询

基本查询语句SELECT * FROM <表名> WHERE <条件>查询结果的二维表结构与原表时相同的,即查出了所有列。
如果不需要查询所有列的数据,则使用下面语句进行查询,结果集返回我们指定的列,如此成为投影查询

SELECT 列名1,列名2,列名3... FROM <表名>

例:查询学生的id、name、score:
SELECT id, score, name FROM students;

使用投影查询时,可以给查询的列指定一个别名,查询结果集的列名就可以和原表列名不同。

SELECT1 别名1,2 别名2,3 别名3 FROM <表名>

例:
SELECT id, score 分数, name 姓名 FROM students;

注:投影查询同样可以拼接WHERE条件语句,实现复杂查询,用法同条件查询。

排序

  • 排序:默认正序-从低到高,(关键字ORDER BY)
SELECT id, name, gender, score FROM students ORDER BY score;
  • 正序:从低到高-默认排序方式,(关键字ASC)
'ORDER BY score ASC''ORDER BY score' 效果一样

如果有WHERE子句,则ORDER BY子句要放到WHERE子句后面,如:

-- 带WHERE条件的ORDER BY
select id, name, gender, score
from students
where class_id = 1
order by score desc;
  • 倒序:从高到低,(关键字DESC)
SELECT id, name, gender, score FROM students ORDER BY score DESC;
  • 如果score列有相同的数据,要进一步排序,可以继续添加列名。例如,使用ORDER BY score DESC, gender表示先按score列倒序,如果有相同分数的,再按gender列排序
-- 按score, gender排序:
SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;

分页查询

SELECT查询,结果集数据量较大,则需要分页查询。分页功能,其实就是从结果集中取出M~N条记录。分页子句:LIMIT <M> OFFSET <N>

-- 结果集分页,每页10条记录,查询第1页记录。
select id, name, gender, score
from students
order by score desc
limit 10 offset 0

-- 查询第2页记录,需要跳过第一页的记录。
select id, name, gender, score
from students
order by score desc
limit 10 offset (2-1)*10

*在MySQL中,LIMIT 15 OFFSET 30还可以简写成LIMIT 30, 15

*使用LIMIT <M> OFFSET <N>分页时,随着N越来越大,查询效率也会越来越低。

聚合查询

  • COUNT()-统计数据总量
    通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果:
-- 使用聚合查询并设置结果集的列名为num:
select count(*) num from students

聚合查询同样可以使用WHERE条件:

select count(*) boys 
from students
where gender = 'M';

COUNT()外,SQL还提供了如下聚合函数:
SQL聚合函数
注意,MAX()MIN()函数并不限于数值类型。如果是字符类型,MAX()和MIN()会返回排序最后排序最前的字符。

-- 使用聚合查询计算男生平均成绩:
select AVG(score) average 
FROM students 
WHERE gender = 'M'

要特别注意:如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()AVG()MAX()MIN()会返回NULL。

多表查询

基本语法:

select * from <表名1>, <表名2>;

这种一次查询两个表的数据,查询的结果也是一个二维表,它是students表和classes表的==“乘积”,即students表的每一行与classes表的每一行都两两拼在一起返回。结果集的列数是students表和classes表的列数之和,行数是students表和classes表的行数之积。
当两个表存在
字段名相同时,需要使用"投影查询"的设置别名==,给对应字段设置一个别名,便于区分:

select
	students.id sid,
	students.name,
	classes.id cid,
	classes.name
from students, classes;
# 也可以使用表的`表别名.列名`这样的格式来引用列
select
	s.id sid,
	s.name,
	c.id cid,
	c.name
from students s, classes c;
# 多表查询同样可以使用where条件
select
	s.id sid,
	s.name,
	g.score_math gmath,
	g.score_eng geng
from students s, grades g
where s.gender = 0 and g.score_math > 100

连接查询

连接查询其实是另一种类型的多表查询,连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。

假设:学生表、班级表单独存储,需要查询学生及其对应的班级信息。

select 
	s.id
	s.name 姓名
	c.name 班级
from students s
left join classes c #左联(这里的目的是查学生信息,学生为主体)
on s.class_id = c.id #这是关联条件
  • MySQL中,连接包含:左连"left join on"、右连’right join on’、内连’inner join on’。
    如何选择,需要根据具体业务需求,几种连接查询的结果集如下:

  • LEFT JOIN:选出左表存在的记录:
    左连

  • RINGHT JOIN:选出右表存在的记录
    右连

  • INNER JOIN:选出两张表都存在的记录
    右连

修改数据

插入 INSERT

当我们需要向数据库表中插入一条新记录时,就必须使用INSERT语句。
语法结构如下:

insert into <表名> (字段1,字段2,...) values (1,2, ...);

# 举个栗子
insert into students (name,gender,class_id) 
values ('酱爆', 0, '20211101');

select * from students;
# 一次添加多条记录(中间用','隔开)
insert into students (name,gender,class_id) 
values
('秋香', 0, '20211101'),
('石榴姐', 0, '20211101');

修改 UPDATE

需要更新数据表的记录时,就需要使用UPDATE语句。
语法结构如下:

update <表名> set 字段1=1, 字段2=2,... where <条件>;

# 举个栗子(students表中,id=5的数据录入错误,需要修改)
update students 
set name = 'giao哥', gender = 1
where id = 5;
注意:要特别小心的是,`UPDATE`语句可以没有WHERE条件。此时,整个表的所有记录都会被更新

删除

需要删除数据表中的记录时,可以使用DELETE语句。
语法结构如下:

DELETE FROM <表名> where <条件>;

# 举个栗子(删除id=2的学生)
delete from students where id = '2';

当where条件没有匹配到如何记录时,DELETE语句不会报错,也不会删除任何记录。

注意:和UPDATE一样,不使用where条件的`DELETE`	语句,将会删除整个表的记录,需要小心使用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值