MySQL

数据库基本操作

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • https://www.bilibili.com/video/av19538278?p=2https://blog...
    指向远方的灯塔阅读 586评论 0 1
  • 数据库概念 定义1 数据库(database)是按照数据结构来组织、存储、管理数据的建立在计算机存储设备上的仓库 ...
    好好秦先生阅读 1,149评论 0 3
  • 第1章 初涉MySQL 1.1 MySQL文件 (1)MySQL目录结构 (2)MySQL配置向导文件(安装后配置...
    凛0_0阅读 779评论 1 0
  • 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始...
    轨之迹空阅读 405评论 0 0
  • 在互联网行业从事数据分析,要学一些必备的技能,比如SQL/HIVE。因此我将之前学习的SQL知识资源进行统一整理一...
    年少轻狂不能用来挥霍阅读 998评论 0 0