首页 > 代码库 > mysql操作

mysql操作

select查询:

首先我们建立一张带有逗号分隔的字符串。CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCHAR(20) NOT NULL,pnum VARCHAR(50) NOT NULL);

然后插入带有逗号分隔的测试数据
INSERT INTO test(pname,pnum) VALUES(‘产品1‘,‘1,2,4‘);
INSERT INTO test(pname,pnum) VALUES(‘产品2‘,‘2,4,7‘);
INSERT INTO test(pname,pnum) VALUES(‘产品3‘,‘3,4‘);
INSERT INTO test(pname,pnum) VALUES(‘产品4‘,‘1,7,8,9‘);
INSERT INTO test(pname,pnum) VALUES(‘产品5‘,‘33,4‘);


查找pnum字段中包含3或者9的记录
mysql> SELECT * FROM test WHERE find_in_set(‘3‘,pnum) OR find_in_set(‘9‘,pnum);
+----+-------+---------+
| id | pname | pnum    |
+----+-------+---------+
|  3 | 产品3 | 3,4     |
|  4 | 产品4 | 1,7,8,9 |
+----+-------+---------+
2 rows in set (0.03 sec)


使用正则
mysql> SELECT * FROM test WHERE pnum REGEXP ‘(3|9)‘;
+----+-------+---------+
| id | pname | pnum    |
+----+-------+---------+
|  3 | 产品3 | 3,4     |
|  4 | 产品4 | 1,7,8,9 |
|  5 | 产品5 | 33,4    |
+----+-------+---------+
3 rows in set (0.02 sec)
这样会产生多条记录,比如33也被查找出来了,不过MYSQL还可以使用正则,挺有意思的


find_in_set()函数返回的所在的位置,如果不存在就返回0
mysql> SELECT find_in_set(‘e‘,‘h,e,l,l,o‘);
+------------------------------+
| find_in_set(‘e‘,‘h,e,l,l,o‘) |
+------------------------------+
|                            2 |
+------------------------------+
1 row in set (0.00 sec)

还可以用来排序,如下;
mysql> SELECT * FROM TEST WHERE id in(4,2,3);
+----+-------+---------+
| id | pname | pnum    |
+----+-------+---------+
|  2 | 产品2 | 2,4,7   |
|  3 | 产品3 | 3,4     |
|  4 | 产品4 | 1,7,8,9 |
+----+-------+---------+
3 rows in set (0.03 sec)

如果想要按照ID为4,2,3这样排序呢?
mysql> SELECT * FROM TEST WHERE id in(4,2,3) ORDER BY find_in_set(id,‘4,2,3‘);
+----+-------+---------+
| id | pname | pnum    |
+----+-------+---------+
|  4 | 产品4 | 1,7,8,9 |
|  2 | 产品2 | 2,4,7   |
|  3 | 产品3 | 3,4     |
+----+-------+---------+
3 rows in set (0.03 sec) 

mysql新建用户本地无法登陆:

出此是用mysql,因为root权限过高,所以新建一用户appadmin,权限仅为要用到的数据库。创建语句如下:grant select,insert,update,delete on test.* to appadmin@"%" identified by "password";其中@“%”是可以在任何地址登录。 
创建后到mysql.user下查看,有该用户。但是使用mysql -u appadmin -ppassword 登录,提示无法登录:ERROR 1045 (28000): Access denied for user ‘appadmin‘@‘localhost‘ (using password: YES) 
百思不得其解,遂google,其中有人说到“mysql.user 表中有另外一些记录产生了作用,最有可能的就是已经有一条‘‘@localhost记录,就是用户名是空,主机字段是localhost的记录。” 影响了。查看该表果然有。 
mysql> select host,user,password from mysql.user; 
+-----------+------------------+-------------------------------------------+ 
| host      | user             | password                                  | 
+-----------+------------------+-------------------------------------------+ 
| localhost | root             | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | 
| mza       | root             | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | 
| 127.0.0.1 | root             | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | 
| localhost |                  |                                           | 
| mza       |                  |                                           | 
| localhost | debian-sys-maint | *19DF6BF8310D46D681AE072AB73ECEC99C018C19 | 
| %         | appadmin         | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | 
+-----------+------------------+-------------------------------------------+ 
7 rows in set (0.00 sec) 
但是删除那些为空(匿名)的用户后仍然无法登录。(可能是因为没有重启mysql)于是只好耐着性子看mysql参考手册。发现其中增加用户部分有这么一段话: 
其中两个账户有相同的用户名monty和密码some_pass。两个账户均为超级用户账户,具有完全的权限可以做任何事情。一个账户 (‘monty‘@‘localhost‘)只用于从本机连接时。另一个账户(‘monty‘@‘%‘)可用于从其它主机连接。请注意monty的两个账户必须能从任何主机以monty连接。没有localhost账户,当monty从本机连接时,mysql_install_db创建的localhost的匿名用户账户将占先。结果是,monty将被视为匿名用户。原因是匿名用户账户的Host列值比‘monty‘@‘%‘账户更具体,这样在user表排序顺序中排在前面。 
这段话说的很清楚,因此执行 grant select,insert,update,delete on test.* to appadmin@"localhost" identified by "password"; 
退出后用appadmin登录,成功。

mysql索引:

  1. 1.索引作用  
  2.    在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。  
  3.   
  4.    例如,有3个未索引的表t1、t2、t3,分别只包含列c1、c2、c3,每个表分别含有1000行数据组成,指为1~1000的数值,查找对应值相等行的查询如下所示。  
  5.   
  6. SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3  
  7.   
  8.    此查询结果应该为1000行,每行包含3个相等的值。在无索引的情况下处理此查询,必须寻找3个表所有的组合,以便得出与WHERE子句相配的那些行。而可能的组合数目为1000×1000×1000(十亿),显然查询将会非常慢。  
  9.   
  10.    如果对每个表进行索引,就能极大地加速查询进程。利用索引的查询处理如下。  
  11.   
  12. 1)从表t1中选择第一行,查看此行所包含的数据。  
  13.   
  14. 2)使用表t2上的索引,直接定位t2中与t1的值匹配的行。类似,利用表t3上的索引,直接定位t3中与来自t1的值匹配的行。  
  15.   
  16. 3)扫描表t1的下一行并重复前面的过程,直到遍历t1中所有的行。  
  17.   
  18.    在此情形下,仍然对表t1执行了一个完全扫描,但能够在表t2和t3上进行索引查找直接取出这些表中的行,比未用索引时要快一百万倍。  
  19.   
  20.    利用索引,MySQL加速了WHERE子句满足条件行的搜索,而在多表连接查询时,在执行连接时加快了与其他表中的行匹配的速度。  
  21.   
  22. 2.  创建索引  
  23. 在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。  
  24.   
  25. 1.ALTER TABLE  
  26. ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。  
  27.   
  28.    
  29.   
  30. ALTER TABLE table_name ADD INDEX index_name (column_list)  
  31.   
  32. ALTER TABLE table_name ADD UNIQUE (column_list)  
  33.   
  34. ALTER TABLE table_name ADD PRIMARY KEY (column_list)  
  35.   
  36.    
  37.   
  38. 其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。  
  39.   
  40. 2.CREATE INDEX  
  41. CREATE INDEX可对表增加普通索引或UNIQUE索引。  
  42.   
  43.    
  44.   
  45. CREATE INDEX index_name ON table_name (column_list)  
  46.   
  47. CREATE UNIQUE INDEX index_name ON table_name (column_list)  
  48.   
  49.    
  50.   
  51. table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。  
  52.   
  53. 3.索引类型  
  54. 在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。  
  55.   
  56. PRIMARY KEY索引和UNIQUE索引非常类似。事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引。  
  57.   
  58. 下面的SQL语句对students表在sid上添加PRIMARY KEY索引。  
  59.   
  60.    
  61.   
  62. ALTER TABLE students ADD PRIMARY KEY (sid)  
  63.   
  64. 4.  删除索引  
  65. 可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。  
  66.   
  67.    
  68.   
  69. DROP INDEX index_name ON talbe_name  
  70.   
  71. ALTER TABLE table_name DROP INDEX index_name  
  72.   
  73. ALTER TABLE table_name DROP PRIMARY KEY  
  74.   
  75.    
  76.   
  77. 其中,前两条语句是等价的,删除掉table_name中的索引index_name。  
  78.   
  79. 3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。  
  80.   
  81. 如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。  
  82.   
  83.   
  84. 5.查看索引  
  85.   
  86. mysql> show index from tblname;  
  87.   
  88. mysql> show keys from tblname;  
  89.   
  90.   · Table  
  91.   
  92.   表的名称。  
  93.   
  94.   · Non_unique  
  95.   
  96.   如果索引不能包括重复词,则为0。如果可以,则为1。  
  97.   
  98.   · Key_name  
  99.   
  100.   索引的名称。  
  101.   
  102.   · Seq_in_index  
  103.   
  104.   索引中的列序列号,从1开始。  
  105.   
  106.   · Column_name  
  107.   
  108.   列名称。  
  109.   
  110.   · Collation  
  111.   
  112.   列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。  
  113.   
  114.   · Cardinality  
  115.   
  116.   索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。  
  117.   
  118.   · Sub_part  
  119.   
  120.   如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。  
  121.   
  122.   · Packed  
  123.   
  124.   指示关键字如何被压缩。如果没有被压缩,则为NULL。  
  125.   
  126.   · Null  
  127.   
  128.   如果列含有NULL,则含有YES。如果没有,则该列含有NO。  
  129.   
  130.   · Index_type  
  131.   
  132.   用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。

MySql用户创建、授权以及删除:

The create user command:

<!---->mysql> CREATE USER yy IDENTIFIED BY ‘123‘;

yy表示你要建立的用户名,后面的123表示密码

上面建立的用户可以在任何地方登陆。

如果要限制在固定地址登陆,比如localhost 登陆:

<!---->mysql> CREATE USER yy@localhost IDENTIFIED BY ‘123‘;

grant:

<!---->mysql> GRANT ALL PRIVILEGES ON *.* TO user;@localhost
<!---->grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";

grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";

格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"

修改密码:

<!---->mysql> grant   all   privileges   on   pureftpd.*   to   koko@localhost   identified   by   ‘mimi‘;  

flush:

<!---->mysql> flush privileges;

查看用户信息:

<!---->mysql> select host,user from mysql.user; 

mysql操作