(办公)Mysql入门

数据库的操作:
1.用 SHOW 显示已有的数据库
show databases
2.创建数据库:create database 创建数据库
create database db_name
3.删除数据库:
drop databse db_name
4.use 选定数据库.
use db_name
数据表的操作:
1.show/describe 语句显示数据表的信息:
show tables
2.create table 创建表:
create table 表名
(
列名 类型,
列名 类型
)
2.1 利用select的结果创建表.
MySQL 将为在 select
2.1.1 create table 表名
(
select * from 表名
)
2.1.2 create table user_testC select * from user_t
2.2 利用alter table修改表
2.2.1 增加列: alter table 表名 add col_name 类型.
2.2.2 删除列: alter table 表名 drop col_name
2.2.3 改变列: alter table 表名 modify col_name 类型
alter table 表名 change old_col_name (新的列名)col_name 类型
2.3.4 给表更名: alter table 表名 rename 新表名.
3.drop table 删除表: drop table if exists 表名.
drop table if exists 数据库.表名

4.插入语句:insert
insert into 表(列名,列名,列名....) values(,,....)
4.1 插入其他表选择的行:
insert into tbl_name1(col1,col2) select col3,col4 from tbl_name2;
5.查询语句:select
SELECT 语句的语法如下:
SELECT selection_list 选择哪些列
FROM table_list 从何处选择行
WHERE primary_constraint 行必须满足什么条件
GROUP BY grouping_columns 怎样对结果分组
HAVING secondary_constraint 行必须满足的第二条件
ORDER BY sorting_columns 怎样对结果排序
LIMIT count 结果限定
5.1 普通查询: select * from t_user
5.1.1 查询特定的行: select * from t_user where nickname like '%朱晓明%'
5.2 条件查询: select * from t_user where nickname like '%朱晓明%'
5.2.1 算术运算符:+,-,*,/,<,<=,=,!=或者<>,>=,>
5.2.2 逻辑运算符:NOT或!,OR或||,AND或&&
5.3 查询排序: order by 子句的语法 order by column_name [ASC(升序)|DESC(降序)][,....]
5.4 查询分组与行计数: select age,count(2) from person group by age
5.4.1 COUNT()函数计数非NULL结果的数目.MAX(),MIN(),AVG(),SUM()
5.4.2 表连接,1.inner join,2.select * from tableA A,tableB B where A.bid = b.id
5.5 修改,删除数据记录. update 表名 set 列名 = xx where 列名 运算符 值
5.6 删除记录: delete from 表名 where 要删除的记录.
*********************************MySQL函数字符串,索引*********************************
1.集合函数:
1.1 行列计数:COUNT(*),计算查询语句返回记录数.
1.2 计算平均值:AVG().对数字使用,忽略空值.
1.3 计算字段值的总和:SUM()
1.4 计算字段的极值MAX()和MIN()
2.操作日期和时间.
2.1 返回当前的日期和时间CURDATE(),CURTIME()返回当前时间,以HH:MM:SS或HHMMSS格式返回当前的时间值,NOW()
返回当前时期和时间以 YYYY-MM-DD HH:MM:SS 的格式或者 YYYYMMDDHHMMSS 的格式.
2.2 使用关系运算符和逻辑运算符来限制时间范围:
select * from table where end_date >= '2001-02-08' and end_date < '2001-02-08'
2.3 另一种方法,你可以使用LIKE来返回正确的记录.通配符'%'
2.4 比较日期和时间:TO_DAYS(date) TO_DAYS函数 返回一个天数 (从年份0开始的天数 )
3.字符串模式的匹配.
3.1:"_"匹配任意单个字符,"%"匹配任意数字字符。
3.2:扩展正则表达式模式匹配 REGEXP,NOT REGEXP
3.2.1 .匹配任何单字符
3.2.2 [...]匹配方括号内的任何字符.例如"[abc]",如果是范围的话-,[a-z]匹配任何小写字母,[0-9]匹配任何数字.
3.2.3 * 匹配零个或者多个在它前面的东西.比如[0-9]*匹配任何数量的数字,".*"匹配任何数量的任何东西.
"[aA]"匹配小写或大写的"a"而"[a-zA-Z]"匹配两种写法的任何字母。
3.2.4 为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用"^"
或在模式的结尾用"$"。
4.深入select的查询功能.
4.1. 别名 select name as 别名 from table
在子句中使用列的别名:select count(1) total from table having total > 1

select * from table as tb
4.2. 取出互不相同的记录,一般的办法是使用DISTINCT关键字:
4.3. NULL,使用IS NULL和IS NOT NULL.
4.4. 大小写敏感性
4.5. 检索语句与多个表想连接.inner join,left join(左表为主,右表匹配,匹配不到的为NULL,显示)
*******************************************索引属性*******************************************
1.提示:(一个索引可以由最多 15 个列组成)
2.索引有如下的几种情况:
INDEX 索引:通常意义的索引,某些情况下 KEY 是它的一个同义词。索引的列
可以包括重复的值。
 UNIQUE 索引:唯一索引,保证了列不包含重复的值,对于多列唯一索引,它保
证值的组合不重复。
 PRIMARY KEY 索引:也 UNIQUE 索引非常类似。事实上,PRIMARY KEY 索
引仅是一个具有PRIMARY 名称的 UNIQUE 索引。这表示一个表只能包含一个
PRIMARY KEY。
3.用 Alter Table 语句创建与删除索引:(CREATE INDEX 可对表增加普通索引或 UNIQUE 索引,
不能用)
create index index_name on table_name (column_list)
create unique index index_name on table_name (column_list)

3.1 创建表的时候创建索引:
create table person
(
id float,
name varchar(200),
age float,
remark varchar(200),
email varchar(200),
PRIMARY key index_name (id),
index index_nameA(name),
unique index_nameunique (email)
)
4.删除索引:drop index index_name on table_name
**************************************数据的备份和恢复*********************************************
1.使用Navicat Premium 图形界面操作:
1.1 备份与还原.
1.1.1 选中数据库有个备份,新建,可以选择(视图,函数,事件),也可以将备份文件另存为到桌面.(点击备份的文件,右击菜单,
还原备份.)
1.1.2 直接保存sql文件,点击数据库,出现菜单,然后转储sql文件.(导入的话,需要新建一个和数据库名字和原来一样.)
2.使用Navicat Premium 查看日志,他的目录是 logs.
2.1 HttpDump.log:保存 HTTP 服务器答复的数据。
LogHistory.txt:记录在 Navicat 数据库及数据库对象上全部已运行的作业上的全部 SQL 语句。从主菜单选择工具->历史日志,或使用快捷键 CTRL+H,在历史日志查看器打开 LogHistory.txt 文件。
注意:当 Navicat 重新启动时,这个记录将会被覆盖。
2.2 LogImport.txt:记录在导入进程期间发生的每个错误的详细数据,显示成功或失败。
注意:这个记录将会在每次导入时被覆盖。
LogExport.txt:记录在导出进程期间发生的每个错误的详细数据,显示成功或失败。
注意:这个记录将会在每次导出时被覆盖。
2.3 LogSynchronize.txt:记录数据同步进程期间发生的每个错误的详细数据,显示成功或失败。
注意:这个记录将会在每次同步时被覆盖。
LogCmd.txt:保存 Navicat 命令列进程和运行计划时全部操作的信息。

3. MySQL内建复制.这个配置可以去百度查询.
首先,要确定得到了一个完整的数据快照。如果忘记拷贝一个表或数据库将导致从
机线程序停止。生成快照的时刻是很关健的。你应该确保在拷贝数据文件之前二进制日志
功能是无效的。如果在得到快照之前就允许了二进制日志功能,从机的线程可能会停止,
原因就是当线程试图导入重要的记录时,可能会由于主键重复而停止。最好就是接照第二
部分所讨论的处理办法来做:关闭-拷贝-允许二进制日志功能重启。
你可能想要按照最初的一种方式来配制复制处理,并且在合适的时间关注从机,确
保从机与主机保持同步。
****************************************数据库的维护与修复**********************************************
表的故障检测和修正的一般过程如下:
 检查出错的表。如果该表检查通过,则完成任务,否则必须修复出错的数据库
表。
 在开始修复之前对表文件进行拷贝,以保证数据的安全。
 开始修复数据库表。
 如果修复失败,从数据库的备份或更新日志中恢复数据。
在使用 myisamchk 或 isamchk 检查或修复表之前,应该首先注意:
 建立数据库备份和使用更新日志,以防修复失败,丢失数据。
 仔细阅读本章内容以后再进行操作,尤其是不应该在阅读“避免与 MySQL 服务
器交互作用”之前进行操作。因为,在你没有足够的知识之前贸然操作,可能会
引起严重的后果。
 如果你在 Unix 平台上对表进行维护时,应该首先注册到专用的帐户 mysql,以
避免对表读写访问产生所有权的问题,以及破坏数据库目录的所有权限。
****************************************数据库优化**********************************************
1.建立索引,相对来说查询会快一些.
2.索引用于以下方面:
 快速找出匹配一个 WHERE 子句的行。
 在多个表的查询时,执行连接时加快了与其他表中的行匹配的行的搜索。
 对特定的索引列找出 MAX()或 MIN()值。
 如果排序或分组在一个可用索引的最左面前缀上进行(例如,ORDER BY
key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随 DESC,键
以倒序被读取。
 在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表
的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从
索引树被检索出来。
3.索引文件要占磁盘空间。如果有大量的索引,索引文件可能会比数据文件更
快地达到最大的文件尺寸。其次,索引文件加快了检索,但增加了插入和删除,以及更新
索引列中的值的时间(即,降低了大多数涉及写入的操作的时间),因为写操作不仅涉及
数据行,而且还常常涉及索引。一个表拥有的索引越多,则写操作的平均性能下降就越
大。
3.1 选择索引的准则
3.1.1 搜索的索引列,不一定是所要选择的列
3.1.2 使用惟一索引
3.1.3 使用短索引
3.1.4 利用最左前缀
3.1.5 不要过度索引
3.1.6 考虑在列上进行的比较类型

4.数据类型的一些问题:
4.1 使你的数据尽可能小
4.2 使用定长列,不使用可变长列
4.3 将列定义为 NOT NULL
4.4 考虑使用 ENUM 列
4.5 有关 BLOB 和 TEXT 类型
4.5.1 使用 BLOB 和 TEXT 类型的优点
4.5.2 使用 BLOB 和 TEXT 类型的可能弊端
4.6 必要的准则:1.对容易产生碎片的表使用 OPTIMIZE TABLE
2.使用多列索引
3.将 BLOB 值隔离在一个独立的表中
5.使用 ANALYSE 过程检查表列
6.查询的优化:
6.1 使用 EXPLAIN 语句检查 SQL 语句
例子:EXPLAIN select * from book
6.2 想使得查询变快,你可以加个索引.
6.2.1 优化where
6.2.1.1 删除不必要的括号:
6.2.1.2 常数调入:
6.2.1.3 删除常数条件(因常数调入所需):
6.2.1.4 索引使用的常数表达式仅计算一次.
6.2.1.5 在一个单个表上的没有一个 WHERE 的 COUNT(*)直接从表中检索信息。当仅使
用一个表时,对任何 NOT NULL 表达式也这样做。
6.2.1.6 无效常数表达式的早期检测。MySQL 快速检测某些 SELECT 语句是不可能的并
且不返回行。
6.2.1.7、如果你不使用 GROUP BY 或分组函数(COUNT()、MIN()……),HAVING 与
WHERE 合并。
6.2.1.8、为每个子联结(sub join),构造一个更简单的 WHERE 以得到一个更快的 WHERE
计算并且也尽快跳过记录
6.2.1.9、所有常数的表在查询中的任何其他表前被首先读出。一个常数的表是:
一个空表或一个有 1 行的表。
 与在一个 UNIQUE 索引、或一个 PRIMARY KEY 的 WHERE 子句一起使用的
表,这里所有的索引部分使用一个常数表达式并且索引部分被定义为 NOT
NULL。
6.2.1.10、对联结表的最好联结组合是通过尝试所有可能性来找到:(。如果所有在 ORDER
BY 和 GROUP BY 的列来自同一个表,那么当廉洁时,该表首先被选中。
6.2.1.11、如果有一个 ORDER BY 子句和一个不同的 GROUP BY 子句,或如果 ORDER
BY 或 GROUP BY 包含不是来自联结队列中的第一个表的其他表的列,创建一个临时
表。
6.2.1.12、如果你使用 SQL_SMALL_RESULT,MySQL 将使用一个在内存中的表。
6.2.1.13、因为 DISTINCT 被变换到在所有的列上的一个 GROUP BY,DISTINCT 与
ORDER BY 结合也将在许多情况下需要一张临时表。
6.2.1.14、每个表的索引被查询并且使用跨越少于 30% 的行的索引。如果这样的索引没能
找到,使用一个快速的表扫描。
6.2.1.15、在一些情况下,MySQL 能从索引中读出行,甚至不咨询数据文件。如果索引使
用的所有列是数字的,那么只有索引树被用来解答查询。
6.2.1.16、在每个记录被输出前,那些不匹配 HAVING 子句的行被跳过。
6.3 MySQL 怎样优化 LEFT JOIN
6.3.1 表 B 被设置为依赖于表 A。
6.3.2 表 A 被设置为依赖于所有用在 LEFT JOIN 条件的表(除 B 外)。
6.3.3 所有 LEFT JOIN 条件被移到 WHERE 子句中。
6.3.4 进行所有标准的联结优化,除了一个表总是在所有它依赖的表之后被读取。如果
有一个循环依赖,MySQL 将发出一个错误。
6.3.5 进行所有标准的 WHERE 优化。
6.3.6 如果在 A 中有一行匹配 WHERE 子句,但是在 B 中没有任何行匹配 LEFT JOIN
条件,那么在 B 中生成所有列设置为 NULL 的一行。
6.3.7 如果你使用 LEFT JOIN 来找出在某些表中不存在的行并且在 WHERE 部分你有下
列测试:column_name IS NULL,这里 column_name 被声明为 NOT NULL 的列,那么
MySQL 在它已经找到了匹配 LEFT JOIN 条件的一行后,将停止在更多的行后寻找(对一
特定的键组合)。
6.4 MySQL 怎样优化 LIMIT
6.4.1 如果你用 LIMIT 只选择一些行,当 MySQL 一般比较喜欢做完整的表扫描时,它
将在一些情况下使用索引。
6.4.2 如果你使用 LIMIT #与 ORDER BY,MySQL 一旦找到了第一个 # 行,将结束排
序而不是排序整个表。
6.4.3 当结合 LIMIT #和 DISTINCT 时,MySQL 一旦找到#个唯一的行,它将停止。
6.4.4 在一些情况下,一个 GROUP BY 能通过顺序读取键(或在键上做排序)来解决,并
然后计算摘要直到键值改变。在这种情况下,LIMIT #将不计算任何不必要的 GROUP。
6.4.5 只要 MySQL 已经发送了第一个#行到客户,它将放弃查询。
6.4.6 LIMIT 0 将总是快速返回一个空集合。这对检查查询并且得到结果列的列类型是
有用的。
6.4.7 临时表的大小使用 LIMIT #计算需要多少空间来解决查询。
以下是了解内容:
***************************************服务器级优化**************************************************

如何在服务器级优化数据库的性能,以及提高数据库性能涉及到的
硬件问题。选择一个尽量快的系统,使用 RAID 磁盘阵列是非常容易想到的方法。
对于数据库守护程序,既可以在编译时就提供合适的参数,也可以在选项文件中提供
需要优化的参数。
***************************************避免与 MySQL 服务器交互作用******************************************
1.锁定表的的方法:
1.1 内部锁定:
锁定表:LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…]
解锁表:UNLOCK TABLES
如果一个线程获得在一个表上的一个 READ 锁,该线程(和所有其他线程)只能从表中
读。如果一个线程获得一个表上的一个 WRITE 锁,那么只有持锁的线程 READ 或
WRITE 表,其他线程被阻止。
每个线程等待(没有超时)直到它获得它请求的所有锁。
WRITE 锁通常比 READ 锁有更高的优先级,以确保更改尽快被处理。这意味着,如
果一个线程获得 READ 锁,并且然后另外一个线程请求一个 WRITE 锁, 随后的 READ 锁
请求将等待直到 WRITE 线程得到了锁并且释放了它。
显然对于检查,你只需要获得读锁。再者钟情跨下,只能读取表,但不能修改它,
因此他也允许其它客户机读取表。对于修复,你必须获得些所以防止任何客户机在你对表
进行操作时修改它。
1.2 外部锁定
服务器还可以使用外部锁定(文件级锁)来防止其它程序在服务器使用表时修改文
件。通常,在表的检查操作中服务器将外部锁定与 myisamchk 或 isamchk 作合使用。但
是,外部锁定在某些系统中是禁用的,因为他不能可靠的进行工作。对运行 myisamchk
或 isamchk 所选择的过程取决于服务器是否能使用外部锁定。如果不使用,则必修使用内
部锁定协议。
****************************************************************************************************************

上一篇:喵哈哈村的魔法考试 Round #10 (Div.2) 题解


下一篇:[PHP] 算法-数组重复数字统计的PHP实现