列别名问题
- 可以在查询选择列表中使用别名为列提供 不同名称。可以使用 、 或子句中的别名来引用该列:
GROUP BY ORDER BY HAVING
SELECT SQRT(a*b) AS root FROM tbl_name GROUP BY root HAVING root > 0; SELECT id, COUNT(*) AS cnt FROM tbl_name GROUP BY id HAVING cnt > 0; SELECT id AS 'Customer identity' FROM tbl_name;
- 标准 SQL 不允许在子句中引用列别名。此限制是施加的 因为当评估子句时, 列值可能尚未确定。
例如,以下查询是非法的:WHERE
SELECT id, COUNT(*) AS cnt FROM tbl_name WHERE cnt > 0 GROUP BY id;
子句确定哪些行 应包含在条款中, 但它指的是未知的列值的别名 直到选择行并按 .WHERE GROUP BY GROUP BY
- 在查询的选择列表中,带引号的列别名可以是 使用标识符或字符串引号字符指定:
SELECT 1 AS `one`, 2 AS 'two';
- 在声明的其他地方,引用了对别名的引用 必须使用标识符引用,否则引用被视为 字符串文字。例如,此语句按 列中的值,使用 别名:id ‘a’
SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name GROUP BY `a`;
例如,以下查询是非法的
此语句按文本字符串分组,并且无法按预期工作:'a'
SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name GROUP BY 'a';
使用 DATE 列的问题
日期值的格式为
根据标准 SQL,不允许使用其他格式。你 应该在 UPDATE 表达式和 SELECT 语句的子句中使用此格式。
例如:‘YYYY-MM-DD’ ‘WHERE’
SELECT * FROM t1 WHERE date >= '2003-05-05';
为方便起见,MySQL会自动将日期转换为 数字(如果日期用于数字上下文),
MySQL还允许在以下情况下使用“宽松”字符串格式
INSERT INTO t1 (idate) VALUES (19970505); INSERT INTO t1 (idate) VALUES ('19970505'); INSERT INTO t1 (idate) VALUES ('97-05-05'); INSERT INTO t1 (idate) VALUES ('1997.05.05'); INSERT INTO t1 (idate) VALUES ('1997 05 05'); INSERT INTO t1 (idate) VALUES ('0000-00-00'); SELECT idate FROM t1 WHERE idate >= '1997-05-05'; SELECT idate FROM t1 WHERE idate >= 19970505; SELECT MOD(idate,100) FROM t1 WHERE idate >= 19970505; SELECT idate FROM t1 WHERE idate >= '19970505';
但是,以下语句不起作用:
SELECT idate FROM t1 WHERE STRCMP(idate,'20030505')=0;
STRCMP是一个字符串函数, 因此,它会转换为格式的字符串并执行字符串比较。它不会转换为日期并执行日期比较。所以报错
空值问题
NULL与空字符串不是一回事
例如, 以下陈述完全不同:NULL
INSERT INTO my_table (phone) VALUES (NULL); INSERT INTO my_table (phone) VALUES ('');
这两个语句都在列中插入一个值,但第一个语句插入一个值,第二个语句插入一个空值 字符串。
第一个的含义可以看作是“电话号码未知”和 第二种可以看作是“该人已知 没有电话,因此没有电话号码。phoneNULL
可以使用 IS NULL 和 IS NOT NULL 运算符和 IFNULL() 函数来查看
在 SQL 中,NULL 与任何其他值相比,该值永远不会为真除非另有说明
示例 返回值是NULL
SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
对于任何表达式都从不为 true:NULLexpr = NULLexpr = NULL
SELECT * FROM my_table WHERE phone = NULL;
若要查找值,必须使用 IS NULL测试。
以下语句显示如何查找电话NULL号码和’ '电话号码:
SELECT * FROM my_table WHERE phone IS NULL; SELECT * FROM my_table WHERE phone = ' ';
COUNT 它计算行和 不是单个列值。例如,以下 语句生成两个计数。第一个是计数 表中的行数,第二个是 列中的非值数:NULL NULLage
SELECT COUNT(*), COUNT(age) FROM person;
使用 MySQL 程序时的常见错误
1 拒绝访问
Access denied
一个错误可以有很多 原因。通常问题与MySQL帐户有关 服务器允许客户端程序在以下情况下使用 连接
2 无法连接到[本地] MySQL服务器
Can’t connect to [local] MySQL server
查看是否可以ping通 如果不可以检查防火墙是否放行 如果可以检查端口是否被占用 线程是否成功开启
3 与 MySQL 服务器的连接丢失
Lost connection to MySQL server
检查一下网络问题 如果是本机查看防火墙和端口
4 以交互方式输入密码失败
加一个-p
Password Fails When Entered Interactively
mysql -u user_name -p
5 连接过多
Out of memory
这意味着 MySQL 没有足够的内存来 存储整个查询结果:
mysql: Out of memory at line 42, 'malloc.c' mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k) ERROR 2008: MySQL client ran out of memory
要解决此问题,请首先检查查询是否 正确。
它应该返回这么多行是否合理? 如果没有,请更正查询,然后重试。
否则,可以 使用 -quick 选项调用 MySQL 主要,这会减少 客户端上的负载(但服务器上的负载更多)
7 MySQL 服务器已消失
MySQL server has gone away
这个需要可以去日志中去具体查看
细致分析错误
错误1
ERROR 1044 (42000):Access denied for user
错误解析
数据库拒绝
解决
常见于用户授权不足。可登陆root用户,变更当前用户的对应权限。
错误2
ERROR 1045 (28000): Access denied for user *** (using password: YES
错误解析
数据库拒绝,登录密码错误
解决
核实登录密码
错误3
ERROR 1054 (42S22): Unknown column *** in ‘where clause’
错误解析
根据限定条件无法找到指定的列内容
解决
检查输入的列内容及限制条件是否正确
错误4
ERROR 1064 (42000): You have an error in your SQL syntax;
错误解析
语法错误:在语句中出现错误
解决
- 检查语法是否符合规定的语法规则,如登录时@符号后是否有空格
- 查看是否使用了保留字,找到对应的保留字,不是必须的建议修改,尽量不和保留字冲突。如果确实得用 ,就用反引号(’ ‘)把内容引起来
错误5
ERROR 1072 (42000): Key column ‘***’ doesn’t exist in table
错误解析
引用的***字段,不存在
解决
检查是否拼写错误
错误6
ERROR 1130: Host 10.0.0.1 is not allowed to connect to this MySQL server
错误解析
不允许通过ip地址10.0.0.1访问指定数据库
解决
指定登录主机信息错误。登录root用户,修改用户登录主机信息
错误7
ERROR 1133 (42000): Can’t find any matching row in the user table
错误解析
在user表中未找到指定的用户
解决
可以用flush privileges;刷新一遍,再试。如果还不行的话,核实用户信息是否正确,存在。
错误8
ERROR 1142 (42000): CREATE command denied to user ‘guest04’
错误解析
数据库拒绝执行创建命令,‘guest04’无相关的授权
解决
可以用flush privileges;刷新一遍,再试。如果还不行的话,核实用户信息是否正确,存在。
错误9
ERROR 1144 (42000): Illegal GRANT/REVOKE command;
错误解析
授权内容不合法
解决
修改成合法的
错误10
ERROR 1227 (42000): Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation
错误解析
数据库拒绝执行,原因是没有取得相应动作的授权(此处为创建用户)
解决
查看确认授权情况。确实有需要,在root用户登陆后添加相应授权
错误11
ERROR 1241 (21000): Operand should contain 1 column(s)
错误解析
进行子查询的时候,选项需要1列但选择对象不唯一。
解决
选择唯一的或者变成唯一的
错误12
ERROR 1248 (42000): Every derived table must have its own alias
错误解析
在多级查询中,派生出来的表格需要加一个别名。
解决
这是为了保证每个派生出来的表都需要有一个自己的别名。
错误13
ERROR 1701 (42000): Cannot truncate a table referenced
错误解析
清空失败,还有外键关联的情况下,无法情况当前数据表
解决
解决外键就好了
错误14
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
错误解析
密码策略异常信息:格式不符合当前密码格式需求
解决
换一个
错误15
ERROR 2002 (HY000): Can’t connect to local MySQL server through [socket] ‘/tmp/mysql.sock’ (2)
错误解析
mysql的服务端,服务未启动,或者出现mysql进程异常 ,通过mysql.server status查看
解决
手动重启一下mysql服务,windows找到mysql服务,macbook中系统偏好中找到mysql服务重启 或者执行命令 sudo /usr/local/mysql/support-files/mysql.server stop sudo /usr/local/mysql/support-files/mysql.server start