代码改变世界

Mysql 的使用

2014-07-15 10:49  cmLighters  阅读(238)  评论(0)    收藏  举报

mysql的重启,ubuntu中用/etc/init.d/mysql restart (stop,then start) 或者 sudo service mysql restart

mysql中文乱码的解决

 

【检索表数据】

select ['tablename'.]'columnname' from 'tablename'  这里左边的tablename可以不指出,但是在有些情况下需要跨多表查询时需要指出所查列的表名。

select [distinct] 'columnname' from 'tablename'

  [where where_conditions]

  [group by {col_name | expr | position}

    [ASC | DESC], ... [WITH ROLLUP]]

  [HAVING where_condition]

  [order by 'columnname[s]' [desc] limit a[,b] 

    [ASC | DESC], ... ]

  [LIMIT {[offset,] row_count | row_count OFFSET offset}]

 

#distinct表示列值相同只显示一行,[,b]存在的话表是从第a+1行开始的b行,也可以用limit b offset a代替,a相对于0的offset。order by按列名columnnames进行升序,若有desc,则为降序排序,但是desc只对它前面的那一列有效,若多列都为降序排序,则在需要的多列后面制定desc。

  where_conditions 中可以使用 关系运算符如=、!=、>等或者判断是否为NULL的“IS NULL”运算符。 还可以组合使用and和or。and优先级高于OR,var = 'a' OR var = 'b' 可写成他 var IN ('a', 'b')。这样的好处一个是IN更快,另一个则是IN可以包含其他select语句,可以更动态建立where条件查询语句。AND和OR后还有NOT,支持IN、 BETWEEN、EXISTS。

    条件查询中还可以使用LIKE通配符操作。使用通配符可以检索不太确定值的数据。有两个'%' 和 '_', %表示任意多个任意字符,包括0个字符。_表示一个任意字符。使用原则:能不用通配符尽量不用;尽量不要把通配符放在首部,这种情况搜索最慢。

    条件查询中还可以使用REGEXP正则表达式查找。使用REGEXP也可以检索不太确定值的数据。后所跟的语句作为正则表达式处理。可以用BINARY关键字区分匹配大小写,默认不区分。匹配特殊字符,需在前加'\\',如匹配字符'.',则正则表达式为'\\.' 。匹配'\',则正则表达式为'\\\'。注意MySQL要求两个反斜扛来转移特殊字符。正则表达式中四个定位符:^ $ [[:<:]] [[:>:]],后两个分标表示词的开始和词的结尾。正则表达式简单测试:在不使用数据库的情况下用带文字串的REGEXP测试表达式,如select 'hello' REGEXP '[0-9]'。没有匹配返回0,匹配了就返回1。

    LIKE与REGEXP的区别是LIKE通配符匹配整列,而正则表达式查找列内容,有匹配的子串就返回整列。也可以用^和$来查找整列。

#创建计算字段,数据库中的数据未必是我们想要在程序中使用的数据,而需要经过计算整合。数据库区分计算字段和表列。在数据库中完成数据的计算比返回数据到客户端再进行计算快。计算字段支持+ - * /以及[LR]Trim()函数和其他函数。简单测试只需select 2*3; 或者select Now();即可。

#使用数据库函数会影响代码的可移植性。函数一般支持对字符串的修改、对数值的计算(代数、三角、几何)、对时间日期的计算和对当前数据库相关信息的获取等。使用日期推荐yyyy--mm-dd格式,这样能够统一日期而不出现歧义。

#汇总数据,5个聚集函数。对表中数据进行汇总,而不需返回数据本身。

  AVG()某列平均值,只用于单个列若想求多列平均值,用多个AVG,函数会忽略值为NULL的行;

  COUNT()某列行数,count(*)计算表中行数,count('columnname')忽略值为NULL的行;

  MAX某列最大值,可以用数值、日期和文本,忽略列值为NULL的行;

  MIN某列最小值,其他基本同MAX;

  SUM某列值之和,忽略列值为NULL的行

  distinct关键字放在列名前获取列中不同值的相应聚集函数结果。如count(distinct ’columnname')。但count(distinct *)会有语法错误。此外distinct对max和min没有作用。

#数据分组,

  group by子句(一下简称子句)对分组列进行排序后汇总。可包含任意数目的列。所以可对分组进行嵌套。若存在嵌套,数据会在最后分组上进行汇总。子句中列出每列必须是检索列或有效表达式,若select使用表达式,子句中指定相同表达式。不能用别名。除聚集计算函数外,select中每列应在子句中给出;若分组值中有NULL,则将NULL分成一组返回。

    [HAVING where_condition]对分组进行过滤。where对行进行过滤,having对分组进行过滤。因此where没有分组过滤功能,反过来having可以实现where的功能。where在数据分组前进行过滤,having在数据分组后进行过滤。where排出的行不包括在分组中。

 

#子查询

  由于关系型数据库中的表通过相互之间的关系来对应现实中的连接,我们可能会需要查找订单数超过两个的顾客的名字,这两个信息存在于不同表中,要实现这个功能,两种实现方法:子查询和联接表。子查询类似:select * from customers where cust_id in( select cust_id from orders group by cust_id having count(*)>=2);

  where 后的列须与后面select的列匹配,但可有多列。子查询一般用in操作符,但也可用=或!=等其他操作符。子查询还可以作为计算字段:select cust_name, cust_state, (select count(*) from orders where orders.cust_id = customers.cust_id) as orders from customers order by cust_name;

#联接表

  须有较好的关系表及关系数据库设计相关基础知识。联接——在一条select语句中关联表。确保引用完整性——在products表中保存的数据中的供货商id必须是vendors表中的数据。在MySQL用外键和主键来确保。  select vend_name, prod_name, prod_price from vendors, products where vendors.vend_id = products.vend_id order by vend_name, prod_name;  where子句在联接表中做过滤条件使用,若没有where子句,返回的结果为笛卡尔积。检索出的行数是第一个表中行数乘以第二个表中行数。联接表实际做的就是第一个表中的每一行与第二个表中的每一行配对。上述语句实际为内联接INNER JOIN,对应语句为select vend_name, prod_name, prod_price from vendors INNER JOIN products ON vendors.vend_id = products.vend_id order by vend_name, prod_name;联接的过滤条件where改为ON。建议用内联接方式,有时会有性能优势。

  联接还有自联接、自然联接和外联接。自联接是一个表与自己联接。自然联接指联接或返回的列只返回一次。外部联接查询包括没有关联行的那些行。如查询每个客户下了多少订单进行计数,包括至今尚未下单的客户。外部联接包括左外部联接LEFT OUTER JOIN和右外部联接RIGHT OUTER JOIN。举例:select customers.cust_id, count(orders.order_num) from customers left OUTER JOIN orders on customers.cust_id = orders.cust_id group by customers.cust_id;再看一个

可以看出第三行customers.cust_id = 10002 而 orders.cust_id = NULL。也就是说左外连接时的过滤条件中左边数据要求存在,而右边数据可以不存在。但是如果两者存在就必须符合过滤条件。即外部联接包括没有关联行的行。外联接必须说明left还是right。

 

  

  

 

【查看所创建的数据库、表、函数、视图、事务、过程等的语句源码】

SHOW CREATE DATABASE db_name
SHOW CREATE EVENT event_name
SHOW CREATE FUNCTION func_name
SHOW CREATE PROCEDURE proc_name
SHOW CREATE TABLE tbl_name
SHOW CREATE TRIGGER trigger_name
SHOW CREATE VIEW view_name

 

mysql查看表结构命令:
desc 表名;
show columns from 表名;
describe 表名;
show create table 表名;

use information_schema
select * from columns where table_name='表名';

数据库使用:
show databases;
use 数据库名;

表的使用:
show tables;  //查看当前数据库所有表

 查看列属性语句:  show columns from 'tablename';    或者     describe 'tablename'

表增加一列:  ALTER TABLE table_name  ADD column_name datatype

表删除一列:   ALTER TABLE table_name DROP COLUMN column_name

修改列属性语句:

用ALTER TABLE语句,表名是TableName,字段名是FieldName。
ALTER TABLE `TableName`
MODIFY COLUMN `FieldName`
VARCHAR(14)
CHARACTER SET gbk COLLATE gbk_chinese_ci NOT NULL;

设置字段的字符编码为gbk的一段可以不用,如下就可以
ALTER TABLE `TableName`
MODIFY COLUMN `FieldName`
VARCHAR(14)

而ALTER TABLE 'TableName' ALTER COLUMN 'FieldName' {SET DEFAULT literal | DROP DEFAULT}设置或删除列的默认值。

python操作MySQL: http://www.cnblogs.com/fnng/p/3565912.html , http://www.w3cschool.cc/python/python-mysql.html
Python数据库接口及API:查看python数据库详情。里面有所支持函数的具体介绍。

【权限管理】

查看所有可用权限:   show privileges;

查看当前用户权限:  show grants;             查看非root某用户权限:  show grants for 'username';          查看root用户权限:  root登陆后'show grants;'

授予用户权限或更新用户权限:  grants 'privileges' on 'databasename'.'tablename' to 'username'@'hostname'

  如授予用户创建、删除、更改表和对表的增删改查等操作:

    grants create, alter, drop, insert, delete, update, select on bzbh.* to cm;

撤销某权限:  revoke 'privileges' on 'databasename'.'tablename' from 'username'@'hostname'

  权限可以涉及如下层次:

    整个服务器, grants all   /   revoke all

    整个数据库, on 'databasename'.*

    特定表, on 'the databasename'.'the tablename'

    特定列,

    特定存储过程,

查看当前

【用户管理】

创建用户:  create user ‘username' identified by 'yourpassword';

删除用户:  drop user 'username';

重命名用户:  rename user 'username' to 'newname';

授予/取消用户权限:  查看上面权限管理

更改用户口令:  set password for 'username'=Password('your newpassword')     更改当前用户口令: set password = Password('your newpassword')

 

MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题 

Python解决插入数据库乱码问题

在python中存储图片 用MySQLdb,

import MySQLdb as mysql

cursor.execute('insert into images values(%s)', (mysql.Binary(img)))    #其中img是open图像后存入到img变量