mysql学习笔记

最近学习mysql数据库,收获不少,在此记录,以便日后查阅。

1.启动服务

windows:   net start/stop mysql
linux:             service mysqld start/stop

2.登录数据库

如果是windows系统,需要将mysql.exe的完整路径加入PATH环境变量里面,这个是要重启系统才能生效的。

mysql -u $user -p 回车输入密码即可

注:$user为你登录mysql的用户,-u和$user间可加空格也可不加,-p后面也可紧挨着输入密码,但此处为明文不安全,建议是回车后再输入。



3.添加用户

如果直接操作mysql.user表,一则字段比较多插入起来比较麻烦,二则有些字段数据类型特殊常常容易报错,采用下面的命令更方便

grant all privileges on $dbname.$tbname to $user@$host identified by '$password';

注: $dbname 数据库名 可为*表示所有数据库

     $tbname 表名    可为*表示所有表

     $user 新添加的用户名

      $host 登录数据库的主机,如果是本地则为localhost不用加引号,如果是远程则为‘%’,要加引号,这点要注意

     $password 新添加用户的密码

     all privileges 也可为其他权限如select,update,insert,delete等

通常会在执行完这个后加一个 flush privileges 命令,但是感觉没什么用


4.常用命令


常用查看命令
show variables like "%$keyword%";       查看环境变量,$keyword表示搜索的关键字,此处like用法同where语句
show databases;                                         查看有哪些数据库
show tables;                                                 (只有进入到某一个数据库中才能) 查看有哪些数据表
\s                                                                    查看最常用的环境变量



字符集相关

show variables like "%char%";      查看数据库的各种编码

show create database $db;           查看数据库$db编码格式

show create table $table;               查看数据表$table编码格式


set character_set_server='utf8';      设置服务器字符集

set NAMES utf8;                                 等价于同时修改client、connection、results这三个的字符集

alter database `db-name` default character set utf8 collate utf8-general-ci;    修改已经创建的数据库的字符集


帮助的使用

? contents                         查看有哪些内容可以得到帮助,这是一个树状结构,每个分支都可以用?来获得帮助

? keyword                         keyword就是你要获得帮助的内容,甚至可以包括命令的用法比如 :? show会告诉你show命令可以show哪些东西



5.安全模式

先关闭mysql的服务,然后

windows: mysqld-nt  --skip-grant-tables  运行这个命令,然后在新命令行里面就可以mysql -u root -p不用密码进入系统

linux:         mysqld_safe  --skip-grant-tables &  运行这个命令,然后就可以同上不用密码进入系统



6.Data definition language


create schema/database $dbname;                        创建数据库 

use $dbname;                                                                进入数据库

drop database $dbname;                                            删除数据库


drop table [ if exists ] $tbname;                                    删除表

desc/describe $tbname;                                              查看表结构


CREATE TABLE [ IF NOT EXISTS ] $tbname (

        field1 数据类型 [ 属性 ] [ 索引 ],

        field2 数据类型 [ 属性 ] [ 索引 ],

        field3 数据类型 [ 属性 ] [ 索引 ],

        ...

        fieldn 数据类型 [ 属性 ] [ 索引 ]

) [ 表类型 ] [ 表字符集 ];


创建表:.建议sql关键字用大写,表名和字段名等自定义名称用小写,要有意义,可以是英文组合或英文缩写


数据类型:

1.数值型

    整型(整数)

            非常小的整型           1个字节             TINYINT

            较小的整型               2个字节             SMALLINT

            中等大小的整型       3个字节             MEDIUMINT

            标准的整型               4个字节             INT

            大得整型                   8个字节             BIGINT

    浮点型(小数)

            FLOAT( M, D )                        4个字节

            DOUBLE( M, D )                    8个字节

            DEMICAL( M, D )                    M+2字节    (定点数以字符串来存储数据)

     注:  实际数据超过定义的精度时会四舍五入,比较浮点数时不要使用等号

2.字符型

    CHAR( M )                M最大255,固定长度字符串      永远占M个字节                      会自动删除尾部空格        速度更快但占用空间大

    VARCHAR( M )           M最大255,可变长度字符串      占的字节数为字符个数+1    不会删除尾部的空格        速度慢点单可以节省空间

    TEXT                       保存大量文本数据(文章,日记)             2^16-1长度              

      MEDIUMTEXT

      LONGTEXT      2^32-1

    BLOB                     保存二进制数据(照片、电影、压缩包)  2^16-1长度              

       MEDIUMBLOB

       LONGBLOB     2^32-1

    ENUM   枚举   1-2个字节              最多65535个成员     eg:   ENUM( "Monday",  "Tuesday" )     一次只能用一个枚举中的值

    SET       集合   1,2,3,4,8个字节    最多64个成员           eg:   SET( 'a', 'b', 'c' )     一次可以用多个集合中的值,多个值之间用逗号隔开

3.日期型  

           DATE                  YYYY-MM-DD (-可以省略)

           TIME                    hh:ii:ss           (:可以省略)

           DATETIME          YYYY-MM-DD hh:ii:ss   

           TIMESTAMP       YYYYMMDDhhiiss

           YEAR                  YYYY

建议不要使用上面这些类型,用整数int来存时间戳


属性:

1.UNSIGNED   无符号。只能用于数值型,让空间增加一倍

2.ZEROFILL      前导零。只能用于数值型,自动成为无符号的

3.AUTO_INCREMENT 自动增长。每增加一条就会自动增加1,字段值不允许重复,当插入该字段为0、NULL、‘’或留空时也会执行自动加1

4.NULL/NOT NULL       默认可以为NULL。创建表时每个字段不要插入NULL,最好都设置为NOT NULL

5.DEFAULT ‘0’/‘’/‘0.0’     默认值。当不插入该字段值时的默认值



索引:

1.主键索引   PRIMARY KEY 确定一个表里一条特定数据记录的位置,一个表只有一列是主键,主键值唯一不为空。可以写在字段后面也可以写在,最下面。

2.唯一索引   UNIQUE           确保该字段不重复。每个表可以有多个

3.常规索引   KEY        最重要的技术,提升数据库的性能。提高查找的速度,减慢数据列上插入删除和修改的速度。和表一样是独立的数据对象,可以在创建表时建立(在最下面加一行 KEY/INDEX  field1(field1) ),也可以独立使用CREATE INDEX  ind1 on $tbname (field1, field2,...)。

4.全文索引   FULLTEXT  只能用于MyISAM类型的表,只能用于char varchar text这样的文本类型。也可以多个数据列上使用。



表类型:

show engines     查看数据库支持哪些类型

主要使用一下俩个

MyISAM(default)  快速读取 有些功能不支持 ,不支持事务、数据行锁定、外键约束         

InnoDB                占用空间大,不支持全文索引



7.Data Malipulation Language

ALTER:

ALTER TABLE $tbname {  

                                                ADD $field TYPE  |                 添加字段 

                                                DROP $field |                         删除字段

                                                MODIFY $field TYPE |            修改字段类型

                                                CHANGE $fieldold $fieldnew TYPE  修改字段名和类型

                                             }

[ AFTER $field | FIRST ];


ALTER TABLE $tbnameold RENAME AS $tbnamenew;        改表名


INSERT:

INSERT INTO $tbname [ ( field1, field2,..., fieldn  ) ]  VALUES ( 'value1', 'value2',..., 'valuen' )  [ ('vala1', 'vala2', ..., 'valan') ] ;

注:1.如果没有给出表的字段值,则值表必须全部给出且按默认顺序

        2.建议所以字段名不加引号,所以值加引号

        3.给出字段列表时,值要与字段列表对应即可,可不按表顺序来

        4.可一次插入多个值


UPDATE:

UPDATE $tbname SET field1='val1', field2='val2' [ WHERE 条件 ];


DELETE:

DELETE FROM $tbname [ WHERE 条件 ];


TRUNCATE:

TRUNCATE TABLES $tbname;   清空一个表


8.Data Query Language

SELECT [ ALL | DISTINCT ]
{ * | table.* | [ table. ] field1 [ AS alias1], ... }
FROM  $tbname1 [ AS alias1 ], $tbname2 [ AS alias2 ]
WHERE 条件

ORDER BY field [ DESC | ASC ]

LIMIT $begin, $length

GROUP BY field

HAVING [ 分组的条件 ]


1.字段field列出要查询得字段,可以为每个字段或表起别名

2.DISTINCT作用整个表,取消重复的数据

3.列也可以使用表达式和函数 count(), avg(), sum(), max(), min()

4.WHERE条件可以保护逻辑运算符( && AND , || OR, ! NOT ),比较运算符(>, >=, <, <=, =, !=, <>, <=> 可判断是否为NULL)

 LIKE / NOT LIKE / IS NULL / IS NOT NULL / BETWEEN...AND/ IN / REGEXP ( like可以用通配符_单个字符  %0个或任意多个字符 )

5.LIMIT用于部分显示,$begin表示开始的行(第一行为0行),$length表示显示的行数

6.ORDER为按列排序,DESC降序,ASC升序




9.MYSQL内置函数

1.字符串函数

concat ( str1, str2, ...)    字符串连接函数

insert ( str, x, y, insert )  将str从x位置开始y个字符串长度替换为insert(默认从1开始)

LOWER(str) / UPPER(str)   将字符串全部转成小写/大写

LEFT (str, x) / RIGHT (str, x)  分别返回最左和最右的x个字符,如果x为空则返回空

LPAD (str, n, pad) / RPAD ( str, n, pad )  用字符串PAD对str最左和最右进行填充直到长度为n个字符

trim (str) / ltrim (str) / rtrim (str)   去掉字符串空格

replace ( str, a, b ) 将str中所有字符串a替换为b

strcmp ( str1, str2 )  s1s2返回1, s1=s2返回0 

substring ( str, x, y ) 返回str中从x开始y个长度字符串


2.数值函数

ABS(x)  返回绝对值

ceil(x)    向上取整

floor(x)   向下取整

mod(x, y)  返回x/y的模(余数)

rand()    返回0~1之间的随机数

round(x, y)   返回参数x的有y位小数的四舍五入的值

truncate(x, y)   返回参数x的截断的y位小数的结果


3.时间函数

curdate()   日期

curtime()   时间

now()         日期+时间

unix_timestamp(now())  返回时间戳

from_unixtime()     根据时间戳返回时间

week(now())/ year()/ hour()/ minute()/ monthname(now())   

date_format(now(), "%Y-%M-%D %h-%i-%s")


4.其他函数

database()    PASSWORD()  md5()

version()   user()    

inet_aton('192.168.1.100')   将网络转成数字

inet_ntoa(3232235)  将数字转成网络


10.视图

1.什么是视图
视图是存放数据的一个接口,也可以说是虚拟表,这些数据可以是从一个或几个基表(视图)的数据,也可是用户自己定义的数据,其实视图里面不存放数据,数据据还是存在基表里面,基表数据发生变化,视图里的数据也随之变量,视图里数据变化,基表也会变化。


2.视图的作用
1. 视图可以让查询变得很清楚(复杂的SQL语句变得很简单)
2. 保护数据库的重要数据, 给不同的人看不同的数据

3.创建视图
CREATE [or REPLACE] [algorithm={merge|temptable|undefined}]
VIEW view_name [(column_list)] 
AS select_statement 
[with [cascaded|local] check option]

        注:1.加上or replace可以替换已经存在的视图

                2.column_list类似于别名,这里的列名要用数组1左边的那个引号括起来

                3.视图有三种类型
            Merge: 会将引用视图的语句的文本与视图定义结合起来,使用得视图定义的某一部分取代语句的对应部分
                    Temptable:临时表,比较少用。
                    undefined : 没定义的时候倾向于Megre 
                4.with local check option     [local]只要满足本视图的条件就可以更新
           with cascaded check option  [cascaded]则是必须满足所有针对视图的条件,才可以更新    

4.视图的操作

    和基本表一样,查询、插入、更新、删除。

    查看 show tables;

   show table status like ‘stu2’  \G; 通过状态来分别基本表和视图

   show  create view stu2 \G; 查看创建视图时的语句

   select * from information_schema.views \G;  查看系统的全部视图


5.更改视图
ALTER [or replace] [algorithm={merge|temptable|undefined}]
VIEW view_name [(column_list)] 
AS select_statement 
[with [cascaded|local] check option]





11.数据库的备份与恢复

1.使用phpmyadmin或者workbench等图形化工具
2.拷贝数据库安装目录下的data文件夹中的内容,其中每一个文件夹对应一个数据库。此方法可能会因为数据库的不同版本等原因不兼容
3.使用命令行:

备份: mysqldump -u $user -p --default-character-set=gbk -d $dbname > $path
  $user登录mysql的用户,要有足够的权限; -p后面输入密码可以回车后再输入; 其后的参数表示导出的字符集;
  $dbname表示要备份的数据库名; $path为你生成的备份文件的绝对路径,包含文件名的
  也可用-E -R等参数导出事件过程等,具体可以参考mysqldump命令

恢复: mysql -u $user -p $dbname < $path
   或者 source $path
  
导入数据到一个表: LOAD DATA INFILE '$filename' INTO TABLE $tbname 

                                    FIELDS TERMINATED BY ','

                                    ENCLOSED BY '"'

                                    LINES TERMINATED BY '\r\n';

$filename 数据所在文件名,$tbname数据表名, 第二行表示每个字段的分隔符,第三行表示每个字段被双引号括起来,第四行表示每行以什么结束


12.更改数据库存放路径

Linux:

1、home目录下建立data目录
cd /home
mkdir data


2、把MySQL服务进程停掉:
service mysqld stop

3、把/var/lib/mysql整个目录移到/home/data
mv /var/lib/mysql /home/data/
或者 cp -R /var/lib/mysql /home/data/
这样就把MySQL的数据文档移动到了/home/data/mysql下

4、找到my.cnf配置文档
假如/etc/目录下没有my.cnf配置文档,请到/usr/share/mysql/下找到*.cnf文档,拷贝其中一个到/etc/并改名为my.cnf)中。命令如下:
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

5、编辑MySQL的配置文档/etc/my.cnf
为确保MySQL能够正常工作,需要指明mysql.sock文档的产生位置。修改socket=/var/lib/mysql/mysql.sock一行中等号右边的值为:/home/mysql/mysql.sock 。操作如下:
vi  my.cnf    (用vi工具编辑my.cnf文档,找到下列数据修改之)
# The MySQL server
[mysqld]
port=3306
#socket  = /var/lib/mysql/mysql.sock(原内容,为了更稳妥用“#”注释此行)
socket  = /home/data/mysql/mysql.sock   (加上此行)
datadir = /home/data/mysql
  

6、修改MySQL启动脚本/etc/init.d/mysql
最后,需要修改MySQL启动脚本/etc/init.d/mysql,把其中datadir=/var/lib/mysql一行中,等号右边的路径改成您现在的实际存放路径:home/data/mysql。
vi /etc/init.d/mysql
#datadir=/var/lib/mysql    (注释此行)
datadir=/home/data/mysql   (加上此行)
如果是CentOS还要改 /usr/bin/mysqld_safe 相关文件位置;

7.最后 做一个mysql.sock 链接:
ln -s /home/data/mysql/mysql.sock /var/lib/mysql/mysql.sock

8、重新启动MySQL服务
/etc/init.d/mysql start

9.假如工作正常移动就成功了,否则对照前面的7步再检查一下。

如果登录报错,很有可能是目录的属主和权限不对。
chown -R mysql:mysql /home/data/mysql/  ← 改变数据库的归属为mysql
chmod 700 /home/data/mysql/test/  ← 改变数据库目录属性为700
chmod 660 /home/data/mysql/test/*  ← 改变数据库中数据的属性为660


Windows:

如果是windows系统就要注意下面这些

a.假设你的mysql安装在c:\mysql,数据目录就是c:\mysql\data,现在你想在D 盘建立一个名为foo的数据库,路径为d:\data\foo. 
b.首先:保证d:\data\foo目录存在,如果没有就创建或 者你c:\mysql\data下面有,就把它剪切过来,当然在停止mysql的情况下作移动,否则是不起任何作用的。 
c.再次: 在c:\mysql\data目录下建立一个文本文件命名为foo.sym,文件名与数据库名相同,后缀名为sym,里面的内容为:D:\data \foo\,就是foo数据库的绝对路径。


13.查看数据库的状态以及日志

命令: show processlist;  
如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。  
show processlist; 只列出前100条,如果想全列出请使用 show full processlist;  


命令: show status;

命令:show status like '%下面变量%';

Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。 
Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。 
Connections 试图连接MySQL服务器的次数。 
Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。 
Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。 
Delayed_writes 用INSERT DELAYED写入的行数。 
Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。 
Flush_commands 执行FLUSH命令的次数。 
Handler_delete 请求从一张表中删除行的次数。 
Handler_read_first 请求读入表中第一行的次数。 
Handler_read_key 请求数字基于键读行。 
Handler_read_next 请求读入基于一个键的一行的次数。 
Handler_read_rnd 请求读入基于一个固定位置的一行的次数。 
Handler_update 请求更新表中一行的次数。 
Handler_write 请求向表中插入一行的次数。 
Key_blocks_used 用于关键字缓存的块的数量。 
Key_read_requests 请求从缓存读入一个键值的次数。 
Key_reads 从磁盘物理读入一个键值的次数。 
Key_write_requests 请求将一个关键字块写入缓存次数。 
Key_writes 将一个键值块物理写入磁盘的次数。 
Max_used_connections 同时使用的连接的最大数目。 
Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。 
Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。 
Open_tables 打开表的数量。 
Open_files 打开文件的数量。 
Open_streams 打开流的数量(主要用于日志记载) 
Opened_tables 已经打开的表的数量。 
Questions 发往服务器的查询的数量。 
Slow_queries 要花超过long_query_time时间的查询数量。 
Threads_connected 当前打开的连接的数量。 
Threads_running 不在睡眠的线程数量。 
Uptime 服务器工作了多少秒。


查看MySQL是否启用了查看慢SQL的日志文件

(1) 查看慢SQL日志是否启用

mysql> show variables like 'log_slow_queries'; 
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| log_slow_queries | ON    |
+------------------+-------+
1 row in set (0.00 sec)

(2) 查看执行慢于多少秒的SQL会记录到日志文件中
mysql> show variables like 'long_query_time';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| long_query_time | 1     |   
+-----------------+-------+
1 row in set (0.00 sec)

这里value=1, 表示1秒

 

2. 配置my.ini文件(inux下文件名为my.cnf), 查找到[mysqld]区段,增加日志的配置,如下示例:
[mysqld]
log="C:/temp/mysql.log"
log_slow_queries="C:/temp/mysql_slow.log"
long_query_time=1
 
log指示日志文件存放目录;
log_slow_queries指示记录执行时间长的sql日志目录;
long_query_time指示多长时间算是执行时间长,单位s。
 
Linux下这些配置项应该已经存在,只是被注释掉了,可以去掉注释。但直接添加配置项也OK啦。



你可能感兴趣的:(mysql,mysql,数据库)