简答题1. 如何确定MySQL是否处于运行状态?如何开启MySQL服务?
分为Linux和Windows来讨论。
1)在Linux下启动MySQL服务:
在Linux下,也可以通过“netstat -nip|grep mysqld”来查看MySQL服务的状态:
[root@testdb/]#netstat -nlp|grep mysqld
tcp 0 0:::3306 :::* LISTEN 13853/mysqld
unix 2 [ACC] STREAM LISTENING 38511 13853/mysqld /var/lib/mysq157/mysql.sock
也可以使用mysqld_safe命令启动MySQL数据库,通过mysqladmin来关闭MySQL数据库:
在数据库启动的时候可以加上从指定参数文件进行启动,如下:
mysqld_safe--defaults-file=/etc/my.cnf &
2)在Windows下启动MySQL服务:
D:\MySQL\MySQL-advanced-5.6.21-win32\bin>net start mysql
MySQL 服务正在启动...
MySQL 服务已经启动成功。
进入Windows的服务可以看到:
[考点] 启动
2. 创建GBK字符集的数据库NEWLHR,并查看已建库的完整语句。
3. 如何查看当前数据库里有哪些用户?
可以通过查询mysql.user表来查询数据库的用户。
[考点] 创建数据库
4. 如何查看数据库的版本、当前登录用户和当前的数据库名称?
通过VERSION()函数可以查询版本,通过USER()函数可以查询当前登录数据库的用户,通过DATABASE()函数可以获取当前连接的数据库名称,如下:
[考点] 创建数据库
5. 如何连接到MySQL数据库?
连接到MySQL数据库有多种写法,假设MySQL服务器的地址为192.168.59.130,可以通过如下几种方式来连接MySQL数据库:
1)mysql -p。
2)mysql -uroot -p。
3)mysql -uroot -h192.168.59.130 -p。
[考点] 连接数据库
6. 哪个命令可以查看所有数据库?
运行命令:show databases;。
[考点] 连接数据库
7. 如何切换到某个特定的数据库?
运行命令:use database_name;。
[考点] 连接数据库
8. 列出数据库内所有的表。
在当前数据库运行命令:show tables;。
[考点] 连接数据库
9. 在MySQL中,VARCHAR与CHAR的区别是什么?VARCHAR(50)中的50代表的含义是什么?
CHAR是一种固定长度的类型,VARCHAR则是一种可变长度的类型。
CHAR列的长度固定为创建表时声明的长度。长度可以为0~255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。
VARCHAR列中的值为可变长字符串。长度可以指定为0~65535之间的值。VARCHAR的最大有效长度由最大行大d,~ll使用的字符集确定。在MySQL 4.1之前的版本,VARCHAR(50)的“50”指的是50字节(Byte)。如果存放UTF8汉字时,那么最多只能存放16个(每个汉字3字节)。从MySQL 4.1版本开始,VARCHAR(50)的“50”指的是50字符(Character),无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个。
CHAR和VARCHAR类型声明的长度表示保存的最大字符数。例如,CHAR(30)可以占用30个字符。对于MyISAM表,推荐CHAR类型;对于InnoDB表,推荐VARCHAR类型。另外,在进行检索的时候,若列值的尾部含有空格,则CHAR列会删除其尾部的空格,而VARCHAR则会保留空格。
[考点] 数据类型
10. MySQL中运算符“<=>”的作用是什么?
比较运算符“<=>”表示安全的等于,这个运算符和“=”类似,都执行相同的比较操作,不过“<=>”可以用来判断NULL值,在两个操作数均为NULL时,其返回值为1而不为NULL,而当一个操作数为NULL时,其返回值为0而不为NULL。示例如下:
[考点] 数据类型
11. MySQL数据类型有哪些属性?
数据类型的属性包括auto_increment、binary、default、index、not null、null、primary key、unique和zerofill,具体见下表。
属性
|
列
|
auto_increment
|
1)auto_increment能为新插入的行赋予一个唯一的整数标识符,该属性只用于整数类型 2)auto_increment一般从1开始,每行增加1。可以通过“ALTER TABLE TB_NAME AUTO_INCREMENT=n;”语句强 制设置自动增长列的初始值,但是该强制的默认值是保留在内存中的。如果该值在使用之前数据库重新启动,那么这个强 制的默认值就会丢失,需要在数据库启动以后重新设置 3)可以使用LAST_INSERT_ID()查洵当前线程最后插入记录使用的值。如果一次插入了多条记录,那么返回的是第一 条记录使用的自动增长值 4)MySQL要求将auto_increment属性用于作为主键的列 5)每个表只允许有一个auto_increment列 6)自动增长列可以手工插入,但是插入的值如果是空或者0,那么实际插入的将是自动增长后的值 7)对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列,但是对于MylSAM表, 自动增长列可以是组合索引的其他列,这样插入记录后,自动增长列是按照组合索引的前几列进行排序后递增的
|
binary
|
binary属性只用于CHAR和VARCHAR值。当为列指定了该属性时,将以区分大小写的方式排序和比较
|
default
|
default属性确保在没有任何值可用的情况下,赋予某个常量值,这个值必须是常量,因为MySQL不允许插入函数或表 达式值。此外,此属性无法用于BLOB或TEXT列。如果已经为此列指定了NULL属性,那么当没有指定默认值时默认 值将为NULL,否则默认值将依赖于字段的数据类型
|
index
|
如果所有其他因素都相同,要加速数据库查询,那么使用索引通常是最重要的一个步骤。索引一个列会为该列创建一 个有序的键数组,每个键指向其相应的表行。以后针对输入条件可以搜索这个有序的键数组,与搜索整个未索引的表相比, 这将在性能方面得到极大的提升
|
not null
|
如果将一个列定义为not null,那么将不允许向该列插入null值。建议在重要情况下始终使用not null属性,因为它提供 了一个基本验证,确保已经向奁洵传递了所有必要的值
|
null
|
为列指定null属性时,该列可以保持为空,而不论行中其他列是否已经被填充。null精确的说法是“无”,而不是空字 符串或0
|
primary key
|
primary key属性用于确保指定行的唯一性。指定为主键的列中,值不能重复,也不能为空。为指定为主键的列赋予 auto_increment属性是很常见的,因为此列不必与行数据有任何关系,而只是作为一个唯一标识符。主键又分为以下两种: 1)单字段主键。如果输入数据库中的每行都已经有不可修改的唯一标识符,一般会使用单字段主键。注意,此主键一旦设置 就不能再修改 2)多字段主键。如果记录中任何一个字段都不可能保证唯一性,那么就可以使用多字段主键。这时,多个字段联合起 来确保唯一性。如果出现这种情况,那么指定一个auto_increment整数作为主键是更好的办法
|
unique
|
被赋予unique属性的列将确保所有值都有不同的值,只是null值可以重复。一般会指定一个列为unique,以确保该列 的所有值都不同
|
zerofill
|
zerofill属性可用于任何数值类型,用0填充所有剩余字段空间。例如,无符号int的默认宽度是10;因此,当“零填充” 的int值为4时,将表示它为0000000004
|
[考点] 数据类型
12. MySQL如何实现插入时,如果不存在则插入,如果存在则更新的操作?
在Oracle中由MERGE INTO来实现记录已存在就更新的操作,mysql没有MERGE INTO语法,但是有REPLACE INTO的写法,同样实现记录已存在就更新的操作。
SQL Server中的实现方法是
if not exists(select 1 from t where id=1)
insert into t(id, update_time) values(1,getdate())
else
update t set update_time=getdate() where id=1
MySQL的REPLACE INTO有3种形式:
1.REPLACE INTO TBL_NAUE (COL_NAME) VALUES(')
2.REPLACE INTO TBL_NAME (COL_NAME) SELECT'
3.REPLACE INTO TBL_NAME SET COL_NAME=VALUE'
其中,“INTO”关键字可以省略,不过最好加上“INTO”,这样意思更加直观。另外,对于那些没有给予值的列,MySQL将自动为这些列赋上默认值。
13. 用哪些命令可以查看MySQL数据库中的表结构?
查看MySQL表结构的命令有如下几种:
1)DESC表名。
2)SHOW COLUMNS FROM表名。
3)DESCRIBE表名。
4)SHOW CREATE TABLE表名。
5)USE INFORMATION_SCHEMA。
14. 如何创建TABB表,完整拷贝TABA表的结构和索引,而且不要数据?
CREATE TABLE TABB LIKE TABA;。
15. 如何查看某一用户的权限?
SHOW GRANTS FOR USERNAME;。
16. 如何得知当前BINARY LOG文件和POSITION值?
18. 用什么命令整理表数据文件的碎片?
OPTIMIZE TABLE TABLENAME;。
19. 如何得到TA_LHR表的建表语句?
SHOW CREATE TABLE TA_LHR;。
20. MySQL和Oracle如何修改命令提示符?
MySQL的默认提示符为“mysql”,可以使用prompt命令来修改,如下:
全局:export MYSQL_PS1="(\u@\h)[\d]>"
兰前会话:prompt (\u@\h)[\d]\R:\m:\s>\_
其中,“\u”代表用户名,“\h”代表服务器地址,“\d”代表当前数据库,“\R:\m:\s”代表时分秒,例如,23:10:10。
Oracle的默认命令提示符为“SQL”,可以使用“SET SQLPROMPT”命令来修改,如下:
SQL>SHOW SQLPROMPT
sqlprompt "SQL>"
SQL>SET SQLPROMPT "_USEW'@'_CONNECT_IDENTIFIER>"
SYS@lhrdb>
SYS@lhrdb>SHOW SQLPROMPT
sqlprompt "_user'@'_connect_identifier>"
在以上结果中,SYS表示用户,lhrdb表示数据库。注意,以上提示符的“>”后有一个空格。
如果想全局生效,那么可以修改文件:$ORACLE_HOME/sqlplus/admin/glogin.sql。在glogin.sql文件中添加如下的内容:
SET SQLPROMPT "_USER'@'_CONNECT_IDENTIFIER>"
这样,每次登录SQL*Plus的时候,SQL提示符就会变为设置的内容。