前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sql必会基础2

sql必会基础2

作者头像
Java架构师历程
发布2018-09-26 16:50:35
6550
发布2018-09-26 16:50:35
举报
文章被收录于专栏:Java架构师历程Java架构师历程

031 在已经存在的表上创建唯一索引

1、CREATE UNIQUE INDEX index_name ON table_name (

field_name [(index_length)] [ASC|DESC])

2、ALTER TABLE table_name ADD UNIQUE INDEX|KEY

index_name(field_name [(index_length)] [ASC|DESC])

032 创建表时创建全文索引

table_name(

column_name

FULLTEXT INDEX|KEY [index_name](

field_name [(index_length)] [ASC|DESC])

)

033 在已经存在的表上创建全文索引

1、CREATE FULLTEXT INDEX index_name ON table_name (

field_name [(index_length)] [ASC|DESC])

2、ALTER TABLE table_name ADD FULLTEXT INDEX|KEY

index_name(field_name [(index_length)] [ASC|DESC])

034 创建多列索引

和上面的方法类似

index_name(field_name_1 [(index_length)] [ASC|DESC],

… ,

field_name_n [(index_length)] [ASC|DESC])

035 删除索引

DROP INDEX index_name ON table_name

036 创建视图

CREATE VIEW view_name AS select_query

037 查看视图信息

SHOW TABLE STATUS [FROM database_name] [LIKE ‘pattern’]

038 查看视图设计信息

DESC[RIBE] view_name

039 删除视图

DROP VIEW view_name[, view_name]

040 修改视图

1、CREATE OR REPLACE VIEW view_name AS select_query

2、ALTER VIEW view_name AS select_query

041 创建触发器

CREATE TIRGGER trigger_name

BEFORE|AFTER DELETE|INSERT|UPDATE

ON table_name FOR EACH ROW

Triggle_statement

Triggle_statement:触发器被触发要执行的语句(增、删、改、查等等)

042 查看触发器

SHOW TRIGGERS

043 删除触发器

DROP TRIGGER trigger_name

044 插入数据

INSERT INTO table_name (field_1, field_2, …) VALUES (value_1, value_2, vaule_3, …)

045 查看Mysql表结构的命令,如下:

desc 表名;

show columns from 表名;

describe 表名;

show create table 表名;

use information_schema

select * from columns where table_name=’表名’;

046 数据库分页查询

select * from userdetail where userid limit 0,20

047 MySQL数据库引擎种类

(mysql-5.5.5开始,InnoDB作为默认存储引擎)之前是MyISAM,更早是ISAM你能用的数据库引擎取决于mysql在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MYSQL。在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEYDB(BDB), 也常常可以使用。

ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。

URL:http://www.bianceng.cn/database/MySQL/201609/50453.htm

MYISAM是MYSQL的ISAM扩展格式和缺省的数据库引擎(5.5之前)。除了提供ISAM里所没有的索引和字段管理的大 量功能,MYISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MYISAM还有一些有用的扩展,例如用来修复数据库文件的 MYISAMCHK工具和用来恢复浪费空间的MYISAMPACK工具。

MYISAM强调了快速读取操作,这可能就是为什么MYSQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。

HEAP允许只驻留在内存里的临时表格。驻留在内存使得HEAP比ISAM和MYISAM的速度都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间,HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,用完表格后要删除表格。

INNODBBERKLEYDB(BDB)数据库引擎都是造就MYSQL灵活性的技术的直接产品,这项技术就是MySql++ API。在使用MySql的时候,你所面对的每一个挑战几乎都源于ISAM和MYIASM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和MYISAM引擎慢很多,但是INNODB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。

048 MySQL锁类型

根据锁的类型分,可以分为共享锁排他锁意向共享锁意向排他锁

根据锁的粒度分,又可以分为行锁表锁

对于mysql而言,事务机制更多是靠底层的存储引擎来实现,因此,mysql层面只有表锁,而支持事务的innodb存 储引擎则实现了行锁(记录锁(在行相应的索引记录上的锁)),gap锁(是在索引记录间歇上的锁),next-key锁(是记录锁和在此索引记录之前的gap上的锁的结合)。Mysql的记录锁实质是索引记录的锁,因为innodb是索引组织表;gap锁是索引记录间隙的锁,这种锁只在RR隔离级别下有效;next-key锁是记录锁加上记录之前gap锁的组合。mysql通过gap锁和next-key锁实现RR隔离级别。

说明:对于更新操作(读不上锁),只有走索引才可能上行锁;否则会对聚簇索引的每一行上写锁,实际等同于对表上写锁。

若多个物理记录对应同一个索引,若同时访问,也会出现锁冲突;

当表有多个索引时,不同事务可以用不同的索引锁住不同的行,另外innodb会同时用行锁对数据记录(聚簇索引)加 锁。

MVCC(多版本并发控制)并发控制机制下,任何操作都不会阻塞读操作,读操作也不会阻塞任何操作,只因为读不上锁。

共享锁:由读表操作加上的锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写

排它锁:由写表操作加上的锁,加锁后其他用户不能获取该表或行的任何锁,典型是mysql事务中的更新操作

意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。

意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

049 MYSQL支持事务吗?

在缺省模式下,MYSQL是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql是不支持事务的。 但是如果你的MYSQL表类型是使用InnoDB Tables 或 BDB tables的话,你的MYSQL就可以使用事务处理,使用SET AUTOCOMMIT=0就可以使MYSQL允许在非autocommit模式, 在非autocommit模式下,你必须使用COMMIT来提交你的更改,或者用ROLLBACK来回滚你的更改。

示例如下:

START TRANSACTION;

SELECT @A:=SUM(salary) FROM table1 WHERE type=1;

UPDATE table2 SET summmary=@A WHERE type=1;

COMMIT;

050 MYSQL相比于其他数据库有哪些特点?

1、可以处理拥有上千万条记录的大型数据

2、支持常见的SQL语句规范

3、可移植行高,安装简单小巧

4、良好的运行效率,有丰富信息的网络支持

5、调试、管理,优化简单(相对其他大型数据库)

051 如何解决MYSQL数据库中文乱码问题?

1、在数据库安装的时候指定字符集

2、如果在安完了以后可以更改以配置文件

3、建立数据库时候:指定字符集类型

4、建表的时候也指定字符集

052 如何提高MySql的安全性?

1.如果MYSQL客户端和服务器端的连接需要跨越并通过不可信任的网络,那么需要使用ssh隧道来加密该连接的通信。

2.使用set password语句来修改用户的密码,先“mysql -u root”登陆数据库系统,然后mysql> update mysql.user set password=password(‘newpwd’),最后执行flush privileges就可以了。

3.Mysql需要提防的攻击有,防偷听、篡改、回放、拒绝服务等,不涉及可用性和容错方面。对所有的连接、查询、其他操作使用基于acl即访问控制列表的安全措施来完成。也有一些对ssl连接的支持。

4.设置除了root用户外的其他任何用户不允许访问mysql主数据库中的user表; 加密后存放在user表中的加密 后的用户密码一旦泄露,其他人可以随意用该用户名/密码相应的数据库;

5.使用grant和revoke语句来进行用户访问控制的工作;

6.不要使用明文密码,而是使用md5()和sha1()等单向的哈系函数来设置密码;

7.不要选用字典中的字来做密码;

8.采用防火墙可以去掉50%的外部危险,让数据库系统躲在防火墙后面工作,或放置在dmz区域中;

9.从因特网上用nmap来扫描3306端口,也可用telnet server_host 3306的方法测试,不允许从非信任网络中访问数据库服务器的3306号tcp端口,需要在防火墙或路由器上做设定;

10.为了防止被恶意传入非法参数,例如where id=234,别人却输入where id=234 or 1=1导致全部显示,所以在web的表单中使用”或””来用字符串,在动态url中加入%22代表双引号、%23代表井号、%27代表单引号;传递未检查过的值给mysql数据库是非常危险的;

11.在传递数据给mysql时检查一下大小;

12.应用程序需要连接到数据库应该使用一般的用户帐号,开放少数必要的权限给该用户;

13.在各编程接口(c c++ php perl java jdbc等)中使用特定‘逃脱字符’函数; 在因特网上使用mysql数据 库时一定少用传输明文的数据,而用ssl和ssh的加密方式数据来传输;

14.学会使用tcpdump和strings工具来查看传输数据的安全性,例如tcpdump -l -i eth0 -w -src or

dst port 3306 strings。以普通用户来启动mysql数据库服务;

15.不使用到表的联结符号,选用的参数 –skip-symbolic-links;

16.确信在mysql目录中只有启动数据库服务的用户才可以对文件有读和写的权限;

17.不许将process或super权限付给非管理用户,该mysqladmin processlist可以列举出当前执行的查询 文本;super权限可用于切断客户端连接、改变服务器运行参数状态、控制拷贝复制数据库的服务器;

18.file权限不付给管理员以外的用户,防止出现load data ‘/etc/passwd’到表中再用select 显示出来

的问题;

19.如果不相信dns服务公司的服务,可以在主机名称允许表中只设置ip数字地址;

20.使用max_user_connections变量来使mysqld服务进程,对一个指定帐户限定连接数;

21.grant语句也支持资源控制选项;

22.–local-infile=0或1 若是0则客户端程序就无法使用local load data了,赋权的一个例子grant insert(user) on mysql.user to ‘user_name’@’host_name’;若使用–skip-grant-tables系统将对任何用户的访问不做任何访问控制,但可以用 mysqladmin flush-privileges或mysqladmin reload来开启访问控制;默认情况是show databases语句对所有用户开放,可以用–skip-show-databases来关闭掉。

23.碰到error 1045(28000) access denied for user ‘root’@’localhost’ (using password:no)错误时,你需要重新设置密码,具体方法是:先用–skip-grant-tables参数启动mysqld,然后执行 mysql -u root mysql,mysql>update user set password=password(’newpassword’) where user=’root’;mysql>flush privileges;,最后重新启动mysql就可以了。

053 MySQL取得当前时间的函数是?,格式化日期的函数是

取得当前时间用 now() 就行。在数据库中格式化时间 用DATE_FORMAT(date, format)。根据格式串

format 格式化日期或日期时间值date,返回结果串。

054 你如何确定 MySQL 是否处于运行状态?

答案: Debian 上运行命令 service mysql status,在RedHat 上运行命令 service mysqld status。然后看看输出即可。

055 如何开启或停止 MySQL 服务?

答案:运行命令 service mysqld start 开启服务;运行命令 service mysqld stop 停止服务。

056 如何通过 Shell 登入 MySQL?

答案:运行命令 mysql -u root –p

057 如何列出所有数据库?

答案:运行命令 show databases;

058 如何切换到某个数据库并在上面工作?

答案:运行命令 use database_name; 进入名为 database_name 的数据库。

059 如何列出某个数据库内所有表?

答案:在当前数据库运行命令 show tables;

060 如何获取表内所有 Field 对象的名称和类型?

答案:运行命令 describe table_name;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年4月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 031 在已经存在的表上创建唯一索引
  • 032 创建表时创建全文索引
  • 033 在已经存在的表上创建全文索引
  • 034 创建多列索引
  • 035 删除索引
  • 036 创建视图
  • 037 查看视图信息
  • 038 查看视图设计信息
  • 039 删除视图
  • 040 修改视图
  • 041 创建触发器
  • 042 查看触发器
  • 043 删除触发器
  • 044 插入数据
  • 045 查看Mysql表结构的命令,如下:
  • 046 数据库分页查询
  • 047 MySQL数据库引擎种类
  • 048 MySQL锁类型
  • 049 MYSQL支持事务吗?
  • 050 MYSQL相比于其他数据库有哪些特点?
  • 051 如何解决MYSQL数据库中文乱码问题?
  • 052 如何提高MySql的安全性?
  • 053 MySQL取得当前时间的函数是?,格式化日期的函数是
  • 054 你如何确定 MySQL 是否处于运行状态?
  • 055 如何开启或停止 MySQL 服务?
  • 056 如何通过 Shell 登入 MySQL?
  • 057 如何列出所有数据库?
  • 058 如何切换到某个数据库并在上面工作?
  • 059 如何列出某个数据库内所有表?
  • 060 如何获取表内所有 Field 对象的名称和类型?
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档