数据库基本操作
SQL语句语法:单条语句可以换行,语句结束使用“;”分割,语句不区分大小写,字段大小写区分需要通过管理员进行设定。
注释分为三种,单行注释:1.“--”,2.“#”。多行注释:3.“/**/”
[]表示可以内部内容可省略
连接数据库方法:在cmd界面
mysql -h localhost -u root -p //-h为ip地址,在此使用localhost,即127.0.0.1;-u为用户名 -h为密码
后按下enter,输入密码登陆
后续默认已经连接到数据库
EXPLAIN解释当前SQL语句
1.创建、连接及删除数据库
CREATE DATABASE database_name;--创建名为database_name 的数据库
SHOW DATABASES;--展示所有数据库信息
USE database_name;--使用名为database_name的数据库
DROP DATABASE database_name;--删除名为database_name的数据库
2.数据表的基本操作
在选择数据库以后可以在数据库中进行数据表的相关操作。
查看数据库中表:SHOW TABLES;
2.1数据表的创建相关
CREATE TABLE table_name
(
字段1,数据类型 [约束条件] [默认值];
字段2,数据类型 [约束条件] [默认值];
字段3,数据类型 [约束条件] [默认值];
字段4,数据类型 [约束条件] [默认值];
......
[表级别约束条件]
);
列级约束有:主键Primary key、外键foreign key 、唯一 unique、检查 check 、默认default 、非空/空值 not null/ null
表级约束有:主键、外键、唯一、检查
主键约束(PRIMARY):表中一列或多列的组合,要求主键列数据唯一且不为空,可以定义不同数据表之间关系,且加快数据库查询速度。主键唯一。
表级主键: [CONSTRAINT <约束名> ] PRIMARY KEY [字段1,字段2......]
外键约束(FOREIGN):外键用来在两个表的数据间建立连接,可以是一列或多列,一个表可以有一个或多个外键。外键可为空,若非空,则必须对应另一个表中主键的某个值。
外键约束通常创建为表级约束:
[CONSTRAINT <外键名> ] FOREIGN KEY 字段1[,字段2......]
REFERENCE <主表名> 主键列1[,主键列2.....]
非空约束(NOT NULL):非空约束指定的字段不能为空,一般作为列级约束出现。
唯一约束(UNIQUE):唯一约束要求该字段数据不可重复,一般作为列级约束出现。
默认约束:对该列字段指定默认值,在插入数据时如果不对该字段进行插入则自动生成默认值。
除上述约束外,在主键的某一列创建时还有自增设置(每个表只能有一个自增字段)
方法为 :字段 数据类型 AUTO_INCREMENT
自增默认增量为1,会记录该字段中最大值,而后每次自增都在最大值基础上变动
2.2 数据表修改删除操作
DESC table_name;--查看表基本结构
SHOW CREATE table_name;--查看表详细结构,包括引擎和字符编码格式
ALTER TABLE old_tablename RENAME [TO] new_tablename;--修改表名
ALTER TABLE table_name MODIFY row type;--修改字段数据类型,row为字段名,type为类型
ALTER TABLE table_name CHANGE old_rowname new_rowname new_type;
--修改字段名,类型不变则和原先一致,不可省略
ALTER TABLE table_name ADD row_name type [约束条件] [FIRST|AFTER 已有字段];
--新建字段,FIRST指作为首字段,AFTER 已有字段为在该字段后插入,默认为在尾部插入
ALTER TABLE table_name DROP rowname;--删除字段
ALTER TABLE table_name MODIFY row_name type FIRST|AFTER row_name2;
--将row_name字段放在第一列/row_name2后面
ALTER TABLE tablename ENGINE=enginename;-更换引擎
ALTER TABLE table_name DROP FOREIGN KEY keyname;--删除外键约束
DROP TABLE [IF EXISTS] table1,table2...;--删除没有与其它表相关联的表
--如果表与其它表存在外键约束,则无法直接删除,需要先删除外键约束方可
3.表数据的相关操作
3.1 表数据的查询操作
SELECT语句:
SELECT *|row1[,row2......] /*选取所有数据|某些列的数据*/
FROM tablename1[,tablename2......] /*指定表范围*/
[WHERE 筛选条件] /*筛选条件*/
[GROUP BY 分组条件[HAVING 筛选条件]]/*按条件分组,分组中进行筛选*/
[ORDER BY rowname ASC|DESC[,rowname1 ASC|DESC]]/*按rowname升序|降序排列,可多列排序 */
[LIMIT a,b]/*从a+1开始b行*/
UNION连接:
可以使用UNION或者UNION ALL进行多个SELECT语句连接,其中UNION返回不重复的搜索条件,UNION ALL返回所有值。
查询条件:
IN():在指定条件内
BETWEEN (A) AND (B):在A和B之间
LIKE: 字符串匹配
IS NULL:查询空值
DISTINCT:结果不重复
COUNT()统计总数
MAX()最大值
MIN()最小值
SUM()总和
AVG()平均值
子查询:
ANY():有一个就为真
SOME():同ANY()
ALL():同时满足所有条件
EXISTS():存在就行
IN():存在就行
EXISTS和IN的区别
in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;
例如:表A(小表),表B(大表)
select * from A where cc in(select cc from B) -->效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc) -->效率高,用到了B表上cc列的索引。
相反的:
select * from B where cc in(select cc from A) -->效率高,用到了B表上cc列的索引
select * from B where exists(select cc from A where cc=B.cc) -->效率低,用到了A表上cc列的索引。
连接查询
INNER JOIN 两个表都有才返回连接
LEFT JOIN 左表有就返回
RIGHT JOIN 右表有就返回
FULL JOIN 直接返回
JOIN 默认INNER JOIN ,后面要接 ON [条件]
3.2 表数据的插入操作
直接插入
INSERT INTO table_name (column1[,column2....]) VALUE (val1[,val2......]);
--向目标column中插入数据,未显示部分为默认值
INSERT INTO table_name VALUE(val1,val2......);--不设置column时需要对所有字段赋值,不然会报错
INSERT INTO table_name (column1[,column2....]) VALUE (val11[,val21......]), (val12[,val22......]), (val13[,val23......]);
--向目标column中插入多条数据,此时执行结束后会返回插入结果
Records:插入数目
Duplicates:被忽略的记录,可能是记录包含了重复主键
Warings:有问题的数据记录,如发生数据类型转换
插入查询结果
INSERT INTO table_name (column1[,column2....])
SELECT 对应字段数目 FROM table_name1 WHERE 条件;
3.3表数据更新、删除
UPDATE table_name SET column1=value1[,.....] WHERE 条件;--更新数据
DELETE FROM table_name WHERE 条件;--删除符合条件的数据
DELETE FROM table_name;--删除表数据
TRUNCATE table_name;--复制表结构后,删除整个表,将表结构作为结果
增加计算列
ALTER TABLE table_name ADD row_name type [GENERATED ALWAYS] AS(计算列表达式)
[约束条件] [FIRST|AFTER 已有字段] ;--创建计算列
4.索引
索引是单独的,存储在磁盘上的数据结构,包含对数据表中所有记录的引用指针,可以快速找出在某个或多个列拥有特定值的行,是提高查询速度的最佳途径。
索引的优点:
1.创建唯一索引,保证数据库表中每一行数据的唯一性
2.大大加快数据查询速度
3.加速表和表之间连接
4.进行分组和排序子查询时可以减少分组和排序时间
索引的缺点:
1.创建和维护索引需要时间,随数据量呈正相关关系
2.需要占用物理空间,当使用大量索引时可能比数据占用更大空间
3.当表中数据进行改动的时候,索引相应也要动态维护,降低了数据维护速度
索引设计原则:
1.索引数目不是越多越好
2.经常更新的表索引尽量少,且索引中列数目尽量少
3.数据量小的表最好不要使用索引
4.在字段中不同值情况较多的时候使用索引,在不同值很少的情况下尽量不使用索引
5.当唯一性是某种数据本身特征时,使用唯一索引
6.在频繁进行排序或分组的列上建立索引,若排序列有多个,则进行组合索引建立
索引分类:
聚集索引:索引文件即数据文件;非聚集索引:索引文件存放的是数据文件地址。
按照存储类型,可分为BTREE索引和HASH索引。
HASH索引:在建立索引时对索引字段进行哈希算法计算,得到哈希值并在哈希数组排序,查找时一次定位。
哈希索引缺点:
1.由于结果是哈希运算后的哈希值,无法直接用其比较大小,无法进行排序操作,只能使用=,IN,<=>查询,无法使用范围查询
2.多列索引的情况下,由于HASH操作是对所有索引列进行操作,因此无法对部分索引键进行查询。
3.由于多个不同信息可能存在相同HASH值,因此即使获取到符合条件的信息,也必须进行表扫描
4.当存在大量HASH值相同的情况,HASH索引速度不一定高于BTREE索引
BTREE索引:使用BTREE作为底层数据结构,在INNODB和MYISAM中差别较大。
INNODB中为聚集索引,
在创建表时添加索引在字段设置完毕后添加
[UNIQUE] INDEX [indexname](column1[,column2.......]);--unique表示唯一索引
在已有表上添加索引:
ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name [length],......) [ASC|DESC];
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON table_name (col_name[length],......) [ASC|DESC];
存储过程和函数:
创建存储过程:
CREATE PROCEDURE procrdure_name(参数列表)
BEGIN
[存储过程]
END