sql
- SQL语言包括四种主要程序设计语言类别的语句:
- 数据定义语言(DDL)
- 数据操作语言(DML)
- 数据控制语言(DCL)
- 事务控制语言(TCL)
一、DDL
本文主要介绍DDL中的"增删改查",对应关键字:
- 增:Create
- 删:Drop / Truncate
- 改:Alter + add/drop/modify/change
- 查:Show / Desc
严格的讲,DDL中的增删改查对象不只是database和table,还有Procedure、Function、Trigger、Index、View等等,但今天本文仅聚焦于database和table。
1.create
- 1创建数据库:
create database <数据库名>
一般来说,Create语法都可以在对象之后增加If not exists,用于处理创建表已存在的情况,此时仅会发出警告而不会报错。
同时,还可以为新创建的数据库指定字符集 charset 和 校对规则 collate:
CREATE DATABASE [IF NOT EXISTS] <数据库名>
[[DEFAULT] CHARACTER SET <字符集名>]
[[DEFAULT] COLLATE <校对规则>];
如果不指定字符集和校对规则,所建数据库默认为:utf8和utf8_general_ci。当然,需注意的是MySQL中的utf8字符集实际上是一个伪utf-8,真正意义上的uft-8在MySQL中是uft8mb4(utf-8 more bytes 4)。具体可查阅相关文档介绍。
-
创建表
相较于建库而言,建表的可选项较多,当然这里的可选项是指针对定义表中列字段而言。与建库类似,create建表也支持if not exists语法,用来处理表重复的情形。
CREATE Table [IF NOT EXISTS] <数据表名> (字段名1 类型(长度) [DEFAULT] [NOT NULL], ……, [PRIMARY KEY], [FOREIGEN KEY ]) create table <表名>( id int(10) not null,name varchar(20), )
还可以在列字段后指定引擎信息,例如不想使用默认引擎innodb,而想使用MyISAM引擎,则可在建表语句后增加如下语法:
CREATE Table [IF NOT EXISTS] <数据表名>(……) ENGINE = MyISAM;
当想从一个表中筛选若干数据来建立一个新表时,可以在表名后接as语句。如下语句将使用表tb中数据创建一个一样表结构和表记录的新数据表:
CREATE Table [IF NOT EXISTS] <数据表名> AS SELECT * FROM tb;
2.DROP
与Create对应的关键字是Drop,且其操作对象也几乎一致:不仅可以Drop数据库和数据表,也可以drop函数、过程、索引等等。当然,这里还是主要介绍drop数据库和数据表。
- 删数据库
与create类似、又比create更为简单,drop语句用法有限,没有太多可定义的操作选项,仅需增加drop对象的关键字即可。所以在drop数据库时,即
DROP Database <数据库名> ;
再一次与create类似,为了防止数据库不存在时删除引发错误,可增加存在性判断。当然,创建时是要判断是否不存在,而drop时则判断是否存在:
DROP Database [If Exists] <数据库名> ;
- 删数据表
常规的删数据表与删数据库几乎完全一致,仅需更改关键字和对应表名即可:
DROP Table [If Exists] <数据表名> ;
除了Drop关键字删数据表外,还有另外一个关键字可以删数据表,即Truncate,英文截断的意思。如其名字描述的那样,Truncate与Drop(完全丢弃)不同,用Truncate删除数据表时仅是"截断"记录数据,而保留数据表的结构信息。
Truncate Table <数据表名> ;
某种意义上,Truncate的效果与Delete 不加限定条件时的效果一致,但其速度更快;且由于truncate是数据定义语言,其操作对象不是记录,所以不支持事务和触发器等。
3.Alter
对于已定义的数据库和数据表来说,如果想修改其中的某些选项和信息,此时就要用到alter关键字。Alter英文即是更改,键盘的alt即为其缩写。
因为广义上的更改含义有多种,例如增加或删除个字段叫更改,修改一些选项信息也叫更改,所以Alter其实又常常配套以下几个附属关键字:
- set
alter与set配套使用常用于修改字段默认值等信息,例如:
ALTER TABLE <已有数据表> ALTER <字段> SET DEFAULT <默认值>;
- add
对数据表增加字段:
ALTER TABLE <数据表名> ADD <新字段名> <数据类型> [……];
添加表的约束(外键)
alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名);
- drop
有增加即有删减,对已有数据表删减字段的语法为:
ALTER TABLE <数据表名> DROP <已有字段名>;
- modify
对已有表进行修改,例如修改其数据类型等:
ALTER TABLE <数据表名> MODIFY <已有字段名> <数据类型>;
- change
修改表信息的另一个关键字是应用change,例如仍然修改某个字段的数据类型,则应用change语法为:
ALTER TABLE <数据表名> CHANGE <已有字段名> <已有字段名> <数据类型>;
注意到其与modify的一个重要不同是需要写字段名2次,所以实际上change还可用于更改字段名,即将新字段名放于已有字段名之后即可,若字段名相同意味着不修改,也不会报错。
- rename
modify和change都是用于更改列字段信息,rename则是用于更改表名,其语法为:
ALTER TABLE <已有数据表名> RENAME TO <新数据表名>;
4. Show
与DML中查询最为复杂不同,DDL中的查询用法其实最为简单。主要是应用Show关键字进行显示查询:
例如,显示数据库创建信息:
Show Create Database <数据库名>;
类似的,可用如下语句查询数据表创建信息:
Show Create Table <数据表名>;
如果应用Desc关键字,则可用于显示数据表结构信息:
Desc <数据表名>;
注意,desc查询的数据表信息,包括各字段名、数据类型、默认值等等;而show查询返回的则是创建该数据表时的SQL语句。
另外,还有一个可算是查询的用法,即为了查询当前应用的是哪个数据库时,可用如下语句:
Select Database();
返回的当前应用数据库名。值得注意的是这里的database()算作内置函数,与select version()查询MySQL版本信息用法类似。
二、DML
主要是进行插入元组、删除元组、修改元组的操作。主要有insert、update、delete语法组成。
1.insert
insert into <表名> (字段1, 字段2,字段3) VALUES (值1,值2,值3),(值1,值2,值3),...;
insert into <表名> values (值1,值2,值3);
INSERT INTO student (name, course,grade) VALUES ('张飞','语文',90),('刘备','数学',70),('关羽','历史',25),('张云','英语',13);
2.update
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
update <table> set 字段=新值 where name='张三'
3.delete
DELETE FROM 表名称 WHERE 列名称 = 值
delete from <table> where name='关羽'
4.select
select [distinct] 字段1,字段2,..
from <table2> inner|left|right join <table2> on table1.id=table2.id
where 字段=‘值’ or 字段=‘值’ and 字段 like ‘N%|%g|_ss’ and 字段 in ('字段1','字段2')
or column_name BETWEEN value1 AND value2
group by 字段 having count(*)>30
order by 字段 desc(降序)
limit 5
HAVING类似于WHERE(唯一的差别是WHERE过滤行,HAVING过滤组)
4.1 select stuff()
Stuff(原字符,开始位置,删除长度,插入字符)
从指定的起点处开始删除指定长度的字符,并在此处插入另一组字符
查询语句select stuff('lo ina',3, 1, 've ch')结果为?love china
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理