一、SQL基本操作
1、基本操作:增删改查(CRUD)
注:从计算机的角度出发,增删改都属于写,查属于读(计算机只有两种操作:读和写)
2、将SQL的基本操作根据操作对象进行分类,分为三类:库操作、表(字段)操作、数据操作
3、SQL的注释(单行注释)有两种写法
(1)双中划线(--)+空格
(2)使用#开头
二、库操作
1、库操作:对数据库的增删改查
2、新增数据库
-- 创建数据库
create database 数据库名字 [库选项(字符集+校对集)];
create database mydatabase charset utf8;
(1)库选项:数据库的相关属性。用来约束数据库,分为两个选项
a). 字符集设定:character set/charset 具体字符集。常用字符集:GBK和UTF8
b). 校对集设定:collate 具体校对集
注:
a). 字符集:数据存储的编码格式。是当前数据库下的所有表存储的数据默认指定的字符集。如果数据库没有指定字符集,就会使用DBMS默认的字符集(安装数据库时指定的)
b). 校对集:数据比较的规则。校对集依赖字符集
(2)数据库名字不能使用关键字或保留字。如果非要使用关键字或保留字,必须使用反引号(esc键下面的键在英文状态下的输出:``)
create database `database`;
(3)中文数据库是可以的,但是有前提条件:保证服务器能够识别(不建议使用中文数据库)
-- 告诉服务器当前中文的字符集是什么
set names gbk;
(4)当创建数据库的SQL语句执行之后,发生了什么?
a). 在数据库系统中,增加了对应的数据库信息
b). 会在保存数据的文件夹下(C:\ProgramData\MySQL\MySQL Server 5.5\data),创建一个对应数据库名字的文件夹
注:关系型数据库存储在磁盘,有对应的文件来保存结构和数据
c). 每个数据库文件夹下都有一个.opt文件,里面保存了对应的数据库选项(字符集和校对集)
3、查看数据库
(1)查看所有数据库
-- 查看所有数据库
show databases;
注:系统原有的数据库(四个)
a). information_schema:保存整个数据库中所有的结构消息(eg:表、库等)。show databases; 就是从这个数据库对应的表中查到的
b). mysql:核心数据库。里面保存权限关系/用户关系
c). performance_schema:效率库。eg:查看某个数据库运行的效率高不高,就可以在这个数据库下找对应的数据
d). test:测试库。是一个空库
(2)查看指定部分的数据库(模糊查询)
-- 查看指定部分的数据库(模糊查询)
show databases like 'pattern'; -- pattern是匹配模式
-- 查看以information_开始的数据库。下划线_需要被转义,写成 \_
-- 此处的\_是转义的下划线,不是匹配单个字符
show databases like 'information\_%';
-- 相当于information%
-- 此处的_%相当于%
show databases like 'information_%';
注:
a). %:表示匹配当前位置多个字符
b). _:表示匹配指定位置单个字符
(3)查看数据库的创建语句
-- 查看数据库的创建语句
show create database 数据库名字;
show create database mydatabase;
注:数据库在执行SQL语句之前会优化SQL,系统保存的是优化后的结果,而非原始指令
4、更新数据库
-- 更新数据库
-- 数据库的修改仅限库选项,即字符集和校对集(不要随意修改校对集)。数据库名字不能修改
alter database 数据库名字 [库选项(字符集+校对集)];
alter database mydatabase charset gbk;
(1)数据库的修改仅限库选项,即字符集和校对集(不要随意修改校对集)
a). 修改字符集:character set/charset 具体字符集
b). 修改校对集:collate 具体校对集
(2)数据库名字不可以修改(MySQL5.5之前可以用rename命令修改数据库名字,但MySQL5.5之后不可以修改)
注:修改数据库名字不安全。表名一般以数据库名为前缀,修改数据库名还要修改表名。所以不能修改数据库名,再创建一个新数据库即可
(3)数据库(字符集和校对集)一旦修改成功,在对应的.opt文件中就会体现
(4)通常不修改数据库,尤其是当数据库中已经确定有数据之后,就不会再去修改了
5、删除数据库
-- 删除数据库
drop database 数据库名字;
(1)当删除数据库语句执行之后,发生了什么?
a). 在数据库内部看不到对应的数据库
b). 在对应的数据库存储的文件夹内,数据库名字对应的文件夹被删除,里面的数据表全部被删除,.opt文件也被删除(级联删除)-- 对应的存储数据的文件夹被删除
(2)不要随意删除数据库,删除时应该先进行备份后操作(删除不可逆)
(3)drop不能跨数据库操作
注:如果数据库不存在,那么删除数据库时会提示数据库不存在,删除出错
6、选择数据库
-- 选择数据库
use 数据库名字;
三、表操作
1、表和字段是密不可分的
2、新增数据表
-- 新增数据表
create table [if not exists] 表名(
字段名字 数据类型 [字段属性],
字段名字 数据类型 [字段属性],
......
字段名字 数据类型 [字段属性] -- 最后一行不需要逗号
)[表选项];
-- 先指定数据库
use mydatabase;
-- 再创建表
create table student(
name varchar(10),
gender varchar(10),
number varchar(10),
age int
)charset utf8;
(1)if not exists:如果表名不存在,就创建。否则不执行创建代码 -- 检查功能(可省略)
(2)表选项:控制表的表现
a). 字符集:character set/charset 具体字符集。保证表中数据存储的字符集,只对当前自己表有效(级别比数据库高)
b). 校对集:collate 具体校对集
c). 存储引擎:engine 具体的存储引擎(innodb | myisam)。存储引擎是MySQL提供的具体存储数据的方式,默认是innodb(MySQL5.5以前默认是myisam)
注:数据库管表,库选项的字符集控制在数据库中存储的表的数据类型(DBMS在安装时设置过默认的字符集)。表管字段,表选项的字符集控制字段的数据类型
(3)任何一个表的设计都必须指定数据库
a). 方案一:显式的指定表所属的数据库(数据库名字.数据表名字)
-- 创建数据表时,显式的指定表所属的数据库
-- 即 将当前数据表创建到指定的数据库下
create table [if not exists] 数据库名字.表名(
字段名字 数据类型 [字段属性],
字段名字 数据类型 [字段属性],
......
字段名字 数据类型 [字段属性] -- 最后一行不需要逗号
)[表选项];
create table mydatabase.student( -- 显式的将student表放到mydatabase数据库下
name varchar(10),
gender varchar(10),
number varchar(10),
age int
)charset utf8;
b). 方案二:隐式的指定表所属的数据库。先进入到某个数据库环境,后面创建的表自动归属到该数据库
-- 进入某个数据库环境
use 数据库名字;
-- 进入数据库
use mydatabase;
-- 创建表
create table student(
name varchar(10),
gender varchar(10),
number varchar(10),
age int
)charset utf8;
(4)当创建数据表的SQL指令执行之后,发生了什么?
a). 指定数据库下已经存在对应的表
b). 在数据库对应的文件夹下,会产生对应表的结构文件xxx.frm(.frm代表结构文件,跟存储引擎有关。innodb存储引擎所有的文件都存储在外部的ibdata文件中,即ibdata文件存储所有innodb存储引擎对应的表数据)
(5)新增数据表的另一种方式:复制已有表结构。即从已经存在的表复制一份,生成一个新表
-- 复制已有表结构
-- 如果在同一个数据库中,可以直接使用表名,省略"数据库名."
create table 新表名 like 数据库名.表名;
-- 只要使用数据库名.表名,就可以在任何数据库下访问其他数据库中的表
-- 进入test数据库
use test;
-- 在test数据库下创建一个与mydatabase中的teacher表一样的表
create table teacher like mydatabase.teacher;
注:
a). 只要使用数据库名.表名,就可以在任何数据库下访问其他数据库中的表
b). 复制已有表结构:只复制表结构。如果表中有数据,也只复制表结构,不复制表中数据
c). 好处:不需要写复杂的字段等内容
d). 用途:数据库迁移、自己的简单备份等 -- 通常不使用此种方式
(6)数据库中的数据表名字通常有前缀,前缀为数据库的前两个字母加下划线
3、查看数据表
(1)数据库可以查看的方式,表都可以查看
(2)查看所有表
-- 查看所有表
show tables;
(3)查看部分表(模糊查询)
-- 查看部分表(模糊查询)
-- pattern是匹配模式。%表示匹配当前位置多个字符,_表示匹配指定位置单个字符
show tables like 'pattern';
-- 查看以s结尾的表
show tables like '%s'; -- 前面模糊后面确定的查询效率低(索引失效)
注:
a). 最好指定前面部分是确定的,后面用%代替
b). 前面模糊后面确定的sql效率低,此种情况下索引失效(索引是提升效率的,索引失效,说明效率降低)
(4)查看表的创建语句
-- 查看表的创建语句
show create table 表名;
show create table student;
show create table student\g -- \g:相当于分号
show create table student\G -- \G:将查到的结果旋转90度变成纵向
注:
a). 分号(;) 和 \g:字段在上排横着,下面跟对应的数据
b). \G:字段在左侧竖着,数据在右侧横着
(5)查看表结构(查看表中的字段信息 -- 名称、类型、属性等)
-- 查看表结构(查看表中的字段信息 -- 名称、类型、属性等)
show columns from 表名;
desc/describe 表名;
4、修改数据表
(1)表的修改分为两个部分:修改表本身和修改字段
修改表本身
(2)修改表名
-- 修改表名
rename table 老表名 to 新表名;
-- 重命名表:student表-->my_student(取数据库名字的前两个字母)
rename table student to my_student;
(3)修改表选项:字符集、校对集、存储引擎
-- 修改表选项
alter table 表名 表选项 [=] 值;
alter table my_student charset = gbk;
注:如果数据库已经确定了,且里面有很多数据,此时不要轻易修改表选项。字符集影响不大,但存储引擎和校对集会有较大影响
修改字段
(4)新增字段
-- 新增字段
-- 位置有两个取值:(1)first(2)after 字段名。默认添加到最后
alter table 表名 add [column] 字段名 数据类型 [属性][位置];
-- 给学生表增加id字段,放到第一个位置
alter table my_student add id int first;
注:
a). 位置:字段名可以存放在表中的任意位置。取值:
first:第一个位置
after 字段名:在某个字段之后。默认是在最后一个字段之后
(5)修改字段:通常是修改属性或者数据类型
-- 修改字段:通常是修改属性或者数据类型
-- 属性是指:是否为空、是否有默认值、是否有对应的索引等
alter table 表名 modify 字段名 数据类型 [属性][位置];
-- 将my_student表中的学号number字段变成固定长度(char类型),且放到第二位(id之后)
alter table my_student modify number char(10) after id;
注:由于不同类型的数据在MySQL中的存储方式并不一定相同,所以修改数据类型可能会影响到表中的数据。因此,当表中存在数据时,最好不要修改数据类型
(6)重命名字段
-- 重命名字段
alter table 表名 change 旧字段名 新字段名 数据类型 [属性][位置];
-- 将my_student表中的gender字段改为sex
alter table my_student change gender sex varchar(10);
(7)删除字段
-- 删除字段
alter table 表名 drop 字段名;
注:删除字段会清空该字段的所有数据,且不可逆
5、删除数据表
-- 删除数据表
-- 删除没有被其他表关联的数据表
drop table 表名1, 表名2, ... ; -- 可以一次性删除多张表
(1)当删除数据表的指令执行之后,发生了什么?
a). 在表空间中,没有了指定的表,表中的数据也没有了
b). 在数据库对应的文件夹下,表对应的文件(与存储引擎有关)也会被删除
(2)删除有危险,操作需谨慎(不可逆)
(3)drop不能跨数据库操作
四、数据操作
1、新增数据
(1)方法一:给全表字段插入数据。不需要指定字段列表,但要求值列表的顺序必须与表中字段出现的顺序一致。且凡是非数值类型数据,都需要使用引号包裹(建议使用单引号)
-- 新增数据:给全表字段插入数据
-- 需要指定好类型和顺序(可以一次性插入多条记录)
insert into 表名 values (值列表1)[, (值列表2), ...];
-- 插入数据
insert into my_student values (1, 'itcast001', 'jim', 'male'), (2, 'itcast002', 'Hanmeimei', 'female');
(2)方法二:给部分字段插入数据。需要选定字段列表,字段列表出现的顺序与表中字段的顺序无关,但是值列表的顺序必须与选定的字段列表的顺序一致
-- 新增数据:给部分字段插入数据
insert into 表名 (字段列表) values (值列表1)[, (值列表2), ...];
-- 插入数据:指定字段列表
insert into my_student (number, sex, name, id) values ('itcast0003', 'male', 'Tom', 3), ('itcats0004', 'female', 'Lili', 4);
注:上面两种插入方法的效率不高,使用批量插入提高效率
2、查看数据
-- 查看数据
select */字段列表 from 表名 [where 条件];
-- 查看所有数据
select * from my_student;
-- 查看指定字段、指定条件的数据
-- 查看id=1的学生信息
select id, number, sex, name from my_student where id=1;
注:每次对数据执行修改操作后,最好执行此语句查看结果
3、更新数据
-- 更新数据
-- 建议都有where。不使用where是更新全部
update 表名 set 字段1=值1[, 字段2=值2, ...] [where 条件];
update my_student set sex='no', number='it00001' where name='jim';
注:
(1)alter是操作结构性的东西,eg:数据库、数据表、字段。操作数据用update
(2)更新不一定会成功。如果没有真正要更新的数据,此条更新语句就不算成功。判断数据是否更新成功,要看有没有数据被影响,有数据被影响才是更新成功了(不是sql语句执行了就一定是更新成功了)
4、删除数据
-- 删除数据
delete from 表名 [where 条件];
注:
(1)删除是不可逆的,需谨慎删除
(2)如果没有where条件,意味着系统会自动删除该表所有数据。所以,一般都需要加where条件