mysql-常用操作记录

之前安装在mysql-hive里写过,这里记录下用到过的命令。


1.查看配置文件:依次查找多个需要查找的文件,结果是所有文件的交集,如果某个参数在多个文件中出现多次,后配置的最终生效


wKioL1OzmYrRVRksAAT73NlHGV0140.jpg

 

2.可以用以下命令查看当前数据库的全局变量和会话变量  

> show global variables;

> show session variables;

3.删除所有匿名用户

> drop user ''@'localhost';

4.给所有的root用户设定密码


第一种方法

mysql> set password for 'root'@'localhost' =password('dodowolf');

第二张方法

mysql> update user set password=password('dodowolf')where user='root' and host='127.0.0.1';

第三种方式

#mysqladmin -u UserName -h Host password 'new_password' -p

#mysqladmin -u UserName -h Host -p flush-privileges


5.服务器端命令:需要命令结束符,默认为分号(;)

mysql> help contents

mysql> help Keryword


mysql命令行选项:

  --compress

  --database=, -D 

  -H, --html:输出结果为html格式的文档

  -X, --xml: 输出格式为xml

  --sate-updates: 拒绝使用无where子句的update或delete命令;

6.mysql的快捷键:

  Ctrl + w: 删除光标之前的单词

  Ctrl + u: 删除光标之前至命令行首的所有内容

  Ctrl + y: 粘贴使用Ctrl+w或Ctrl+u删除的内容

  Ctrl + a: 移动光标至行首

  Ctrl + e: 移动光标至行尾

7. mysql>show warnings;

8.查看默认字符集

  1>要是我们通过采用UTF-8的PHP程序从数据库里读取数据,很有可能是一串“?????”或者是其他乱码。

解决办法是,在连接数据库之后,读取数据之前,先执行一项查询“SET NAMES UTF8”,即在PHP里为

mysql_query("SET NAMES UTF8"); 

 

  2>mysql>SHOW GLOBAL VARIABLES LIKE '%char%';

   wKiom1OztYrDk-LRAAJZR7worxE718.jpg

  3>查看当前数据库支持的字符集

    mysql>show character set;


  4>修改

   mysql> SET {GLOBAL|SESSION} VARIABLE_NAME='VALUE'; 

   wKiom1Ozt7aCKlDmAALHjjHuCNo522.jpg

OR

  mysql>SET NAMES UTF8; 

  wKiom1PXL_ug7J0cAAJ2IxWt8-M950.jpg


查阅手册,上面那句等于:

SET character_set_client = utf8;      

SET character_set_results = utf8;     

SET character_set_connection = utf8; 

看看这3个变量的作用:
信息输入路径:client→connection→server;
信息输出路径:server→connection→results。
换句话说,每个路径要经过3次改变字符集编码。以出现乱码的输出为例,server里utf8的数据,传入connection转为latin1,传入results转为latin1,utf-8页面又把results转过来。如果两种字符集不兼容,比如latin1和utf8,转化过程就为不可逆的,破坏性的。

但这里要声明一点,“SET NAMES UTF8”作用只是临时的,MySQL重启后就恢复默认了。

注意:无论是全局还是会话级别的动态变量修改,在重启mysqld后都会失效;想永久有效,可定义在配置文件中的相应段中[mysqld];

  

 5>修改配置文件,

   在[mysqld]字段添加:

    default-character_set=utf8

   

   #mysql -uroot -ppasswd                --进入mysql时会读取配置文件,所以要保证用户可读

   mysql>status;

   wKioL1PZ4Ney5ZwZAACy9zhIbow477.jpg

   wKioL1PZ4nixSO1YAAI45BDSxiQ700.jpg

    在[client]字段添加:

     default-character_set=utf8

    #mysql -uroot -ppasswd

    mysql>status;

    wKioL1PZ4XmCN0l9AACv6xGUBYw593.jpg

    wKiom1PZ4a3DJlYYAAI45BDSxiQ130.jpg



9.MySQL中字符大小写

  • SQL关键字及函数名不区分字符大小写;

  • 数据库、表及视图名称的大小区分与否取决于低层OS及FS

  • 存储过程、存储函数及事件调度器的名字不区分大小写,但触发器区分;

  • 表别名区分大不写;

  • 对字段中的数据,如果字段类型为Binary类型,则区分大小写;非Binary不区分大小写;


10.数据库操作

  

  • CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] [CHARACTER SET=''] [DEFAULT] [COLLATE='']

  • DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

  • ALTER {DATABASE|SCHEMA} db_name [DEFAULT] [CHARACTER SET=''] [DEFAULT] [COLLATE='']


11.表操作

   创建表

   

   1>第一种方式

      CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

      (create_definition,...)

      [table_options]


       (create_definition,...):

       字段的定义:字段名、类型和类型修饰符

       键、约束或索引:

       PRIMARY KEY, UNIQUE KEY, FOREIGN KEY, CHECK

       {INDEX|KEY} 


      [table_options]

      ENGINE [=] engine_name

          mysql> SHOW ENGINES;

      AUTO_INCREMENT [=] value

      [DEFAULT] CHARACTER SET [=] charset_name

      [DEFAULT] COLLATE [=] collation_name

      COMMENT [=] 'string'

      DELAY_KEY_WRITE [=] {0 | 1}

      ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}

      TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]

例如:

     create table userinfo

    (
       id int primary key identity,--identity每次自动加1
       name char(20),
       age int check(age>10),
       sex char(2)
     )

例如: mysql>create  tables  t3 (Name VARCHAR(50) NOT NULL,Age TINYINT UNSIGNED NOT NULL,PRIMARY KEY(Name,Age));

                        mysql>desc t3;

                        

                        mysql>show engines;

                        mysql>show table status like 't3'\G;

                        mysql>drop table t3;

                        mysql>create  tables  t3 (Name VARCHAR(50) NOT NULL,Age TINYINT UNSIGNED NOT NULL,PRIMARY KEY(Name,Age)) ENGINE='MyISAM';

                        mysql>show table status like 't3'\G;

     

    MyISAM表,每表有三个文件,都位于数据库目录中:

    tb_name.frm: 表结构定义

    tb_name.MYD: 数据文件

    tb_name.MYI: 索引文件


    InnoDB表,有两种存储方式

      默认:每表有一个独立文件和一个多表共享的文件

    tb_name.frm: 表结构的定义,位于数据库目录中;

    ibdata#: 共享的表空间文件,默认位于数据目录(datadir指向的目录)中;


      独立的表空间:

    tb_name.frm: 每表有一个表结构文件

    tb_name.ibd: 一个独有的表空间文件


   

     #cd /data/mydata/mydb

     #ls                  -- myisam tables

     #ls /data/mydata/  ibdata1   -- innodb   --管理不便,所以不用默认,使用第2,独立的表空间

     mysql>show  global variables like 'innodb%';

     mysql>set globle innodb_file_per_table=on;

     mysql>exit   --退出后,再进,上面设置才会生效

     mysql>show  global variables like 'innodb%';   查看是否生效

     mysql>show  session variables like 'innodb%'; 

     mysql>create table t4 (Name char(6));

     #ls /data/mydata/               ---可以看到新创建的t4为独立表空间了。

     为了使以上配置在mysql重启后还是有效的,须修改/etc/my.cnf

     #vi /etc/my.cnf

     在[mysqld]字段添加: innodb_file_per_table=on


 2>第二种方式(复制表数据)

   CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

          [(create_definition,...)]

          [table_options]

          select_statement

例如: 

    通过选择一个表的全部内容(无 WHERE 子句)来拷贝一个表

    mysql> CREATE TABLE test SELECT * from test2;  

    创建一个有3个列(a,b,c)的表,其中b,c列的数据来自表test2

    mysql>CREATE TABLE test  (a int not null auto_increment,primary key (a), key(b))  SELECT b,c from test2;

 

例如:mysql>create  table t5 select * from t1;

      mysql>desc  t1;

      mysql>desc  t5;         --通过比较会发现字段属性不一致,只是数据填充了;


 3>第三种方式(复制表结构)

   CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

    { LIKE old_tbl_name | (LIKE old_tbl_name) }

例如:

    mysql>CREATE TABLE t6 LIKE t1 ;

    mysql>select * from t6;              --只复制表结构 

   

   要想完整复制一张表,可以先复制表结构,再填充数据,即先执行like  再select.

 向表中插入数据

INSERT INTO:

mysql>help insert


 第一种:

    INSERT INTO tb_name [(col1, col2,...)] {VALUES|VALUE} (val1, val2,...)[,(val21,val22,...),...]

 第二种:

    INSERT INTO tb_name SET col1=val1, col2=val2, ...

 第三种:

    INSERT INTO tb_name SELECT clause

    REPLACE的工作机制:与INSERT相同,除了在新插入的数据与表中的主键或惟一索引定义的数据相同会替换老的行


 insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...); 

 其中 [] 内的内容是可选的, 

例如, 要给 samp_db 数据库中的 students 表插入一条记录, 执行语句:

      

     mysql>insert into students values(NULL, "王刚", "男", 20, "13811371377"); 

   

   有时我们只需要插入部分数据, 或者不按照列的顺序进行插入, 可以使用这样的形式进行插入:

      

     mysql>insert into students (name, sex, age) values("孙丽华", "女", 21);

 查询表中数据

 select 列名称 from 表名称 [查询条件];

例如:    mysql> select name, age from students;

     也可以使用通配符 * 查询表中所有的内容, 语句: select * from students;

  按条件查询:

    查询年龄在21岁以上的所有人信息: select * from students where age > 21;

    查询名字中带有 "王" 字的所有人信息: select * from students where name like "%王%";

    查询id小于5且年龄大于20的所有人信息: select * from students where id<5 and age>20;

~~~~~

单表查询:简单查询

多表查询:连续查询

联合查询:


选择和投影:

投影:挑选要显示的字段

选择:挑选符合条件的行


投影:SELECT 字段1, 字段2, ... FROM tb_name;

      SELECT * FROM tb_name;


选择:SELECT 字段1, ... FROM tb_name WHERE 子句;

      布尔条件表达式


布尔条件表达式操作符:

  • =

  • <=>

  • <>

  • <

  • <=

  • >

  • >=

  • IS NULL

  • IS NOT NULL

  • LIKE: 支持的通配符: %(任意长度的任意字符), _(任意单个字符)

  • RLIKE, REGEXP: 支持使用正则表达式

  • IN: 判断指定字段的值是否在给定在列表中;

  • BETWEEN ... AND ...: 位于指定的范围之间


例:

mysql>use  mydb;

mysql>create table students (SID INT UNSIGNED AUTO_INCREMENT NOT NULL UNIQUE KEY,Name CHAR(30) NOT NULL,Age TINYINT UNSIGNED NOT NULL,Gender ENUM('F','M') NOT NULL ,Tutor CHAR(30));

mysql>desc students;

mysql>insert into students values (1,'Guo Jing',27,'M','Song Jiang'),(2,'Yang Guo',28,'M','Hu Sanniang'),(3,'Guo Polu',21,'M','Jia Baoyu'),(4,'Xue Baochai',19,'F','Ke Jiang'),(5,'XiaYuhe',37,'F','Shi Qian'),(6,'Wu Yong',51,'M','LinDaiyu');

mysql>select * from students;

mysql>select  Name from  students where Age between 25 and 40;

mysql>select  Name from  students where Age in (25,26,27,28,29);

mysql>select  Name from  students where Name like 'X%';

mysql>select  Name from  students where Name rlike '^X.*';

mysql>insert into students values (7,'tom',11,'M','jerry');

mysql>insert into students values (8,'tomy',13,'M',NULL);

mysql>select Name,Tutor from students where Tutor is null;

mysql>select Name,Tutor from students where Tutor is not null;


组合条件测试:

  • NOT, !

  • AND, &&

  • OR, ||

例:


mysql>select Name,Age,Gender from students where Age >25 and Gender = 'M';

mysql>select Name,Age,Gender from students where Age >25 and Gender = 'M'order by Name desc;


聚合函数:

  SUM(), AVG(), MAX(), MIN(), COUNT()

分组

    group by

对分组的条件进行过滤

    having

 只返回指定的行

   limit([m],n)

    m表示为偏移的行数

    n表示为显示的行数

 select语句的执行流程

   from clause --> where clause -->group by -->having clause -->order by -->select -->limit

select语句

  •   distinct 重复的只显示一次

  •   sql_cache 缓存查询结果

  •   sql_no_cache 不缓存查询结果


例:

mysql>select  SUM(Age) from students;

mysql>select  AVG(Age) from students;

mysql>select  MAX(Age) from students;

mysql>select  MIN(Age) from students;

mysql>select  COUNT(Age) from students;

mysql>select  COUNT(*) from students;

mysql>select  COUNT(*) from students where Age > 25;

mysql>select  SUM(Age) from students where Age > 25;

mysql>select  Gender,SUM(Age) from students GROUP BY Gender;

mysql>alter table students add ClassID TINYINT UNSIGNED;

mysql>select * from students;

mysql>update students set ClassID = 2 where SID = 1;

mysql>update students set ClassID = 3 where SID = 2;

mysql>update students set ClassID = 3 where SID = 3;

mysql>update students set ClassID = 1 where SID = 4;

mysql>update students set ClassID = 3 where SID = 5;

mysql>update students set ClassID = 2 where SID = 6;

mysql>select ClassID,count(Name) from students group by ClassID;

mysql>select ClassID,count(Name),sum(Age) from students group by ClassID;

mysql>select ClassID,count(Name) from students group by ClassID HAVING count(Name) >=2;

mysql>select ClassID,count(*) from students group by ClassID HAVING sum(Age) <= 50;


mysql>select * from students  limit 2;

mysql>select * from students  limit 2,3;   --第一个2 为偏移量,3 显示3行


mysql>select  ClassID,count(Name) from students where ClassID is NOT NULL group by ClassID;

mysql>select  ClassID,count(Name) from students where ClassID is NOT NULL group by ClassID HAVING count(Name) >=2;

mysql>select distinct Age from students where Age >19 order by Age;


MySQL多表查询和子查询:


    联结查询:事先将两张或多张表join,根据join的结果进行查询;

        cross join: 交叉联结

              (a+b)(c+d+e)=

mysql>select * from students,class;----会把所有查询到的加载到内在当中,相当消耗资源,很少用。

        自然联结:

        等值联结

mysql>select * from students,class WHERE students,ClassID = class.ClassID;

mysql>select students.Name,class.Class  from students,class WHERE students,ClassID = class.ClassID;


别名:

表别名

mysql>select s.Name,c.Class  from students AS s,class AS c WHERE s.ClassID = c.ClassID;

字段别名

mysql>select  Name  AS StuName from students;

---如果某个字段在两表中只出现过一次,则不用加表名


        外联结:

             左外联结:只保留出现在左外连接运算之前(左边)的关系中的元组;

                  left_tb LEFT JOIN right_tb ON 连接条件

mysql>select s.Name,c.Class  from students AS s LEFT JOIN class AS c ON s.ClassID = c.ClassID;

        右外联结:只保留出现在右外连接运算之后(右边)的关系中的元组;

                  left_tb RIGHT JOIN right_tb ON 连接条件

mysql>select s.Name,c.Class  from students AS s RIGHT JOIN class AS c ON s.ClassID = c.ClassID;

        全外联结

mysql>select  Name,Course from students AS s,courses AS c,coc WHERE s.ClassID = coc.ClassID AND coc.CourseID = c.CourseID AND s.StuID <=5;


        自联结:

mysql>select  s.Name,t.Name from  students As s,students AS t where  s.StuID = t.TeacherID;

 

子查询:在查询中嵌套的查询

      用于WHERE中的子查询

         1、用于比较表达式中的子查询

               子查询的返回值只能有一个;

         2、用于EXISTS中的子查询

               判断存在与否

         3、用于IN中的子查询;

               判断存在于指定列表中

      用于FROM中子查询:

           SELECT alias.col,... FROM (SELECT clause) AS alias WHERE condition


       MySQL不擅长于子查询:应该避免使用子查询;

例:

mysql> select  Name,Age from students WHERE Age > (select AVG(Age) from students);    ---子查询

mysql>select s.Name,s.Age,s.Gender from (select * from students where Gender='M') AS s where s.Age >25;


MySQL的联合查询:SELECT clauase UNION SELECT clause UNION ...

把两个或多个查询语句的结果合并成一个结果进行输出;

mysql>show indexes  from students;

mysql> explain select Name,Age from students where Age > 25;   能显示 查询执行的细节


mysql>alter  table students add index (Age);

mysql>show indexes  from students;

mysql> explain select Name,Age from students where Age > 25\G     ---表太小,索引没用到。

                     


MySQL视图:

存储下来的SELECT语句;

mysql>select * from students;

mysql>help create view

mysql>create view  stu AS select StuID,Name,Age,Gender from students;

mysql>show tables;

mysql>show table status;    --查看所有表的状态信息

mysql>show create view stu;       

mysql>drop view stu;

 更新表中的数据

UPDATE:


UPDATE [LOW_PRIORITY] [IGNORE] table_reference

   SET col_name1=val1 [, col_name2=val2] ...

   [WHERE where_condition]

   [ORDER BY ...]

   [LIMIT row_count

UPDATE通常情况下,必须要使用WHERE子句,或者使用LIMIT限制要修改的行数;

--safe-updates

   update 表名称 set 列名称=新值 where 更新条件;

  示例:

    将id为5的手机号改为默认的"-": update students set tel=default where id=5;

    将所有人的年龄增加1: update students set age=age+1;

    将手机号为 13288097888 的姓名改为 "张伟鹏", 年龄改为 19: update students set name="张伟鹏", age=19 where tel="13288097888";

 删除表中的数据

DELETE:

     DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name

   [WHERE where_condition]

   [ORDER BY ...]

   [LIMIT row_count]

               --safe-updates


TRUNCATE tb_name    清空表的话,就用这个吧,

在nosql中 称增删改查为 crud ---r为read  相当于,select

   

 delete from 表名称 where 删除条件;

 示例:

    删除id为2的行: delete from students where id=2;

    删除所有年龄小于21岁的数据: delete from students where age<20;

    删除表中的所有数据: delete from students;

 表修改: 

  

 ALTER TABLE tbl_name

    [alter_specification [, alter_specification] ...]

  

 添加列:alter table 表名 add 列名 列数据类型 [after 插入位置];

   示例: 在表的最后追加列 address: 

         mysql>alter table students add address char(60);

       在名为 age 的列后插入列 birthday: 

         mysql>alter table students add birthday date after age;


 修改列:alter table 表名 change 列名称 列新名称 新数据类型;

   示例:将表 tel 列改名为 telphone: 

         mysql>alter table students change tel telphone char(13) default "-";

         将 name 列的数据类型改为 char(16): 

         mysql>alter table students change name name char(16) not null;


 删除列:alter table 表名 drop 列名;

   示例:删除 birthday 列: 

         mysql>alter table students drop birthday;

 重命名表:alter table 表名 rename 新表名;

   示例:重命名 students 表为 workmates: 

         mysql>alter table students rename workmates;


查看连接数与状态


mysql>show processlist; 


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

 

mysql>show status;

mysql>show status like '%XXXX%';


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 服务器工作了多少秒。

 

设置max_connections

mysql>show variables like '%max_connections%'


设置办法是在my.cnf文件中,添加下面一行:

max_connections=200    ---实际MySQL服务器允许的最大连接数16384

#service mysqld restart

MySQL 4个timeout参数说明

mysql> show variables like '%timeout%';


4个timeout都是为了防止某一个链接长时间占用一数据库的描述符,又不干事情,或者网络有问题没有释放

这个描述符,线程阻塞种种资源浪费的情况.我们要主动的"卡"掉对端!

首先看看这4个timeout在mysql5.1手册里的英文解释:

connect_timeout 
The number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake. 
interactive_timeout 
The number of seconds the server waits for activity on an interactive connection before closing it. 
wait_timeout 
The number of seconds the server waits for activity on a noninteractive connection before closing it. 
net_read_timeout 
The number of seconds to wait for more data from a connection before aborting the read. 
net_write_timeout 
The number of seconds to wait for a block to be written to a connection before aborting the write.

从意思上可以理解为

connect_timeout在获取连接阶段(authenticate)起作用,

interactive_timeout和wait_timeout在连接空闲阶段(sleep)起作用,

net_read_timeout和net_write_timeout在连接繁忙阶段(query)起作用


你可能感兴趣的:(mysql)