一、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文件,里面保存了对应的数据库选项(字符集和校对集)

sql server应用写入数据响应时间 sql数据库写入数据_数据库

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存储引擎对应的表数据)

sql server应用写入数据响应时间 sql数据库写入数据_表名_02

(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 表名;

sql server应用写入数据响应时间 sql数据库写入数据_表名_03

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条件