当前位置: 首页 > 工具软件 > xzs-mysql > 使用案例 >

MySql基础知识

尚鸿才
2023-12-01

数据库的基本操作

查看数据库:SHOW DATABASES;

创建数据库:CREATE DATABASE database_name;

删除数据库:DROP DATABASE database_name;

查看mysql支持的存储引擎:SHOW ENGINES;

InnoDB 存储引擎:

1、支持事务,支持行锁

2、大数据处理性能好,CPU效率比别的存储引擎高

3、在主内存中缓存数据和索引维持缓冲池

4、支持外检约束

MyISAM 存储引擎:

1、支持大文件

2、执行dml时产生更少的碎片

3、BLOB和TEXT列可以使用索引

4、每个字符列可以有不同的字符集

数据表的基本操作

主键可以加快数据表查询的速度,分为单字段和多字段联合主键

1、定义列时指定主键

CREATE TABLE emp(

 id INT(11) PRIMARY KEY,

 name VARCHAR(25)

);

2、定义完所有列时指定主键

CREATE TABLE emp(

 id INT(11) ,

 name VARCHAR(25),

 PRIMARY KEY(id,name)

);

3、定义外键

CREATE TABLE emp(

 id INT(11) PRIMARY KEY,

 deptId INT(11),

 name VARCHAR(25),

 CONSTRAINT fk_emp_dept FOREIGN KEY(deptId)  REFERENCES dept(id)

);

4、非空约束

CREATE TABLE emp(

 id INT(11) PRIMARY KEY,

 deptId INT(11),

 name VARCHAR(25) NOT NULL

);

5、唯一性约束

CREATE TABLE emp(

 id INT(11) PRIMARY KEY,

 deptId INT(11),

 name VARCHAR(25) UNIQUE

);

6、默认约束

CREATE TABLE emp(

 id INT(11) PRIMARY KEY,

 deptId INT(11) DEFAULT 111,

 name VARCHAR(25) 

);

7、查看数据表结构:DESCRIBE 表名 或者 DESC 表名

8、查看建表语句:SHOW CREATE TABLE tb_name

9、修改表名:ALTER TABLE 旧表名 RENAME [TO] 新表名

10、修改字段的数据类型:ALTER TABLE 表名 MODIFY 字段名 数据类型

11、修改字段名:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型

12、添加字段:ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件] [FIRST | AFTER 已存在字段名]

13、删除字段:ALTER TABLE 表名 DROP 字段名

14、修改字段的排列位置:ALTER TABLE 表名 MODIFY 字段1 数据类型 FIRST | AFTER 字段2

15、更改表的存储引擎:ALTER TABLE 表名 ENGINE=更改后的存储引擎名

16、删除表的外键约束:ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名

17、删除没有被关联的表:DROP TABLE [IF EXISTS] 表1, 表2, ...

18、删除被其他表关联的主表:先解除关联关系,在删

19、并不是每一个表一定要有一个主键

20、并不是每个表都可以任意选择存储引擎,外键是不能跨存储引擎的

数据类型和运算符

1、整数类型:该类型字段可以添加 AUTO_INCREMENT 自增约束条件

TINYINT  1个字节

SMALLINT  2个字节

MEDIUMINT 3个字节

INT(INTEGER) 4个字节

BIGINT 8个字节

注意:如 year INT(4), 这表示year一半显示4位数字的宽度,和取值范围是无关的,只要取值不超过该类型最大范围就可以插入

2、浮点数类型和定点数类型

FLOAT 4个字节

DOUBLE 8个字节

DECIMAL(M,D) M+2个字节

3、日期与时间类型

YEAR   YYYY                                1个字节

TIME    HH:MM:SS                        3个字节

DATE   YYYY-MM-DD                    3个字节

DATETIME  YYYY-MM-DD HH:MM:SS  8个字节

TIMESTAMP   YYYY-MM-DD HH:MM:SS  4个字节

4、文本字符串类型

CHAR(M): 固定长度字符串

VARCHAR(M):长度可变字符串,实际占用空间为字符串实际长度加1

CHAR(4) 和 VARCHAR(4) 对比

插入值              CHAR(4)                  存储需求                    VARCHAR(4)               存储需求

   ''                        '    '                        4个字节                            ''                              1个字节

 'ab'                      'ab  '                      4个字节                            'ab'                           3个字节

'abcdef'                'abcd'                     4个字节                          'abcd'                         5个字节


TEXT : 保存非二进制字符串(TINYINT,TEXT,MEDIUMTEXT,LONGTEXT)

BLOB : 二进制字符串,主要存储图片,音频信息等


5、算术运算符

= 用来判断数字、字符串和表达式是否相等,与类型无关

expr BETWEET min AND max  expr 大于或等于min 且小于或等于max

LEAST(值1,值2,...值n),返回最小的一个

GREATEST(值1,值2,...值n),返回最大的一个

6、IF(expr,v1,v2),如果表达式是TRUE(expr <> 0 and exp <> null),则返回v1,否则返回v2


查询数据

1、HAVING 在数据分组之后进行过滤来选择分组,而WHERE 在分组之前用来选择记录

2、使用limit限制查询结果的数量

3、内连接

      非标准内连接:SELECT  *  FROM  emp e,dept d WHERE e.dept_id = d.id

      标准规范内连接:SELECT  *  FROM  emp e INNER JOIN dept d ON e.dept_id = d.id    (推荐的方式)

4、外连接

      左连接(左外连接):LEFT JOIN(LEFT OUTER JOIN),返回左表中的所有记录和右表中符合条件的记录

      右连接(右外连接):RIGHT JOIN(RIGHT OUTER JOIN),返回右表中的所有记录和左表中符合条件的记录

5、合并查询结果:两个表对应的列数和数据类型必须相同

     UNION:会过滤重复的记录

     UNIIN ALL:不会过滤重复记录


索引

1、索引优点:

     1)、唯一索引可以保证数据的唯一性

     2)、可以大大加快数据的查询速度

     3)、加速表和表之间的链接

     4)、使用分组和排序时,可以减少查询中分组和排序时间

2、索引的缺点:

     1)、创建和维护索引会耗费时间,并且随着数据量的增加所耗费的时间也会增加

     2)、每一个索引要占据一定的物理空间,如果有大量索引,索引文件会吃掉很多磁盘空间

     3)、对表进行dml操作时,索引也会动态维护,这样会降低dml操作的执行速度

3、索引的分类:

    1)、普通索引和唯一索引

    2)、单列索引和组合索引

    3)、全文索引(只有MyISAM存储引擎支持)

    4)、空间索引(只有MyISAM存储引擎支持)

4、索引的设计原则:

    1)、索引并非越多越好,大量索引会占据磁盘空间,影响DML操作的性能

    2)、避免对经常更新的表进行过多的索引,索引列尽可能少,对经常做查询条件的字段添加索引

    3)、数据量小的表最好不要建索引,查询的时间可能比遍历索引的时间少

    4)、在不同值较多的列上建立索引,在不同值较少的列上不要建立索引(比如性别、婚否等)

    5)、当唯一性是某种数据本身的特征时,指定唯一索引

    6)、在频繁进行排序或分组的列上建立索引,如果有多个可以建立组合索引

5、创建索引

    1)、创建表时创建索引:INDEX index_name(col_name1,col_name2...)、UIQUE INDEX index_name(col_name1,col_name2...)

    2)、在已经存在表中创建索引:ALTER TABLE table_name ADD [UNIQUE | FULLTEXT | SPATIAL]  INDEX  index_name (col_name[length],...)  [ASC | DESC]

                                                        CREATE [UNIQUE | FULLTEXT | SPATIAL]  INDEX  index_name  ON table_name (col[length],...) [ASC | DESC]

6、删除索引

   1)、ALTER TABLE table_name DROP INDEX index_name;

   2)、DROP INDEX index_name ON table_name;

7、尽量使用短索引

8、使用like关键字时,如果匹配字符第一个为"%",索引则不会生效,只有"%"不在第一个位置时才生效

9、对于多列索引,只有查询条件中使用了这些字段中的第一个时,索引才会生效

10、使用or关键字时,只有or前后的字段列都是索引时,查询时才使用索引

11、优化子查询时尽量使用join

12、优化数据结构应该考虑数据的冗余、查询和更新的速度、字段数据类型是否合理等

13、优化插入速度,禁用索引、禁用唯一性检查


#####索引失效场景

1.WHERE字句的查询条件里有不等于号(WHERE column!=…),MYSQL将无法使用索引

2.类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=…),MYSQL将无法使用索引

3.在JOIN操作中(需要从多个数据表提取数据时),MYSQL只有在主键和外键的数据类型相同时才能使用索引,否则即使建立了索引也不会使用

4.如果WHERE子句的查询条件里使用了比较操作符LIKE和REGEXP,MYSQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKE 'abc%',MYSQL将使用索引;如果条件是LIKE '%abc',MYSQL将不使用索引。

5.在ORDER BY操作中,MYSQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。尽管如此,在涉及多个数据表的查询里,即使有索引可用,那些索引在加快ORDER BY操作方面也没什么作用。

6.如果某个数据列里包含着许多重复的值,就算为它建立了索引也不会有很好的效果。比如说,如果某个数据列里包含了净是些诸如“0/1”或“Y/N”等值,就没有必要为它创建一个索引。

7.索引有用的情况下就太多了。基本只要建立了索引,除了上面提到的索引不会使用的情况下之外,其他情况只要是使用在WHERE条件里,ORDER BY 字段,联表字段,一般都是有效的。 建立索引要的就是有效果。 不然还用它干吗? 如果不能确定在某个字段上建立的索引是否有效果,只要实际进行测试下比较下执行时间就知道。

8.如果条件中有or(并且其中有or的条件是不带索引的),即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

9.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

10.如果mysql估计使用全表扫描要比使用索引快,则不使用索引




 类似资料: