MySQL进阶

创建表:
CREATE TABLE T_ABC (t_id INT PRIMARY KEY AUTO_INCREMENT UNIQUE,t_name VARCHAR(32)
NOT NULL DEFAULT'张三',t_salary INT)

创建用户并授权:
GRANT all PRIVILEGES on #所有的权限授权到数据库
xk_demo to admin@'%' #访问的用户名
IDENTIFIED by '0000'  #密码
WITH GRANT OPTION; #附带下发权限
#查看特定的用户权限
show GRANTS for admin@'%'
#删除用户
DROP USER admin@'%'
/*字符串要用单引号引起来
大小写不敏感
字符串敏感时需要加 binary关键字
*/
#DATE
#获取当前日期
SELECT CURRENT_DATE()
#获取当前时间
SELECT CURRENT_TIME()
SELECT CURTIME()
#获取当前时间和日期
SELECT NOW()
#投影查询  通过t_name查到t_id
SELECT t_id FROM T_ABC WHERE t_name = 'zhangsan'
/*
算数运算符
数字类型的数据可以使用算术运算符运算
DATE 类型可以使用+和- 不可以使用* /
操作单位是天
*/
#当前时间+1天
SELECT CURRENT_DATE(),CURRENT_DATE()+1;
/* NULL
1、空值是指不可用、未分配的值,代表没有值,也是一种特殊的值。
2、空值不等于零或空格
3、任意类型都可以支持空值,也就是说任何类型的字段都可以允许空值作为值的存在

 注意:
*  包括空值的任何算术表达式都等于空
*/
#DISTINCT去重 查询工资大于14的 将t_id和t_name打印
SELECT DISTINCT t_id,t_name FROM T_ABC WHERE T_SALARY>14;
/*常用比较运算符;
 1)BETWEEN AND:在两值之间 (包含开始和结尾);
 2)IN(list):匹配列出的值;
 3)LIKE :匹配字符串模式;
  1-通配符:1:`_`:一个字符
       2:`%`:0个或多个字符
  2-转义符:ESCAPE: 表示后面的字符是一个转义符
 4)IS [NOT] NULL:是否[不为]为空;
*/
#查询工资为134和137的员工
SELECT *FROM T_ABC WHERE T_SALARY IN(134,117)
#查询姓名以'n'结尾的员工
SELECT t_name FROM t_ABC WHERE t_name LIKE '%n'
#排序 默认为升序
SELECT *FROM t_ABC ORDER BY t_salary

函数分类
单行函数:接收参数,输出一个结果
多行函数:接收某列的所有的值,输出一个结
#字符串大小写
SELECT UPPER(t_name) FROM t_abc
SELECT LOWER(t_name) FROM t_abc
把每条记录的每个字段连接起来:

AS 后面跟的是新列名
SELECT CONCAT(t_name,'~~~~~~',t_salary) AS 新列名 FROM t_abc;
在指定位置(位置,长度)的字符串替换成目标字符串
SELECT INSERT(t_name,2,2,'新字段') FROM t_ABC
LENGTH 字符串长度
#计算字节数
SELECT t_name,LENGTH(t_name) FROM t_abc
#计算字符数
SELECT t_name ,CHAR_LENGTH(t_name) FROM t_abc
左右填补:
字符串的字符数如果大于给定的个数,少了就从函数指定的边补齐
多了就从字符串最后截掉
SELECT LPAD(t_name,4,'左填补') ,#左填补
    RPAD(t_name,5,'右填补'),t_name FROM t_abc

TRIM截去字符串两端的指定子字符串'an' '商都'
SELECT TRIM('an' FROM t_name) FROM t_abc
SELECT TRIM(BOTH '商都' FROM t_name)FROM t_abc
#去尾
SELECT TRIM(TRAILING '三' FROM t_name)
FROM t_abc;
替换
当某一条记录中的字段值和第二个参数的值相等的时候
把这个字段替换成第三个参数 将zhangsan换成主流
SELECT REPLACE(t_name,'zhangsan','主流') FROM t_abc
从指定位置截取到最后
SELECT SUBSTR(t_name ,2) FROM t_abc
从指定位置截取指定长度的子字符串
SELECT SUBSTR(t_name ,2,3) FROM t_abc
函数:
取绝对值
SELECT ABS(-12)
取模
SELECT MOD(12,5)
SELECT CEILING(2.22)
SELECT FLOOR(2.22)
四舍五入(保留位数)
SELECT ROUND(3.33,1)
日期
当前日期加一
SELECT DATE_ADD(CURDATE(),INTERVAL 1 DAY)
日期相减 天数
SELECT DATEDIFF('2017-01-21','1995-01-21')
获取模块的年月日是分秒
SELECT DAY(NOW()) #当月的第x天
SELECT DAYOFWEEK(NOW())#当前星期第几天
时间戳格式化
SELECT UNIX_TIMESTAMP(NOW()) #从1970年到现在的秒数
数字格式化 保留一位小数
SELECT FORMAT(123456.12345,1)
#123,456.1
生成UUID
SELECT UUID();
/*
COALESCE(value,...)
返回值为列表当中第一个非null值,如果没有非null值,则返回值为null
*/
SELECT COALESCE(null,'jerry','tom');
相当于三目运算符
SELECT IF(1>1,'TRUE','false')
SELECT CASE
WHEN t_name LIKE '%n' THEN '以n结尾'
WHEN t_name = '张三' THEN '张三'
ELSE '不知道'
END
FROM t_abc;

分组语句(两张有联系的表)GROUP BY:将表 分成小组
ORDER BY:排序
SELECT COUNT(t_name) FROM t_abc;
#按性别分类,在t_abc中 当t_salary>3000,
对 组 的过滤语句必须放在HAVING中
如果没有GROUP BY 子句SELECT列表 中的任何列或表达式不能使用合计函数
SELECT t_sex,AVG(t_salary) FROM t_abc WHERE t_salary >3000 GROUP BY t_sex;
把工资小于2000的人过滤后按工资分组并按升序排序
SELECT t_salary,t_name,AVG(t_salary)
FROM t_abc
WHERE t_salary > 2000
GROUP BY t_salary

多表查询
SELECT ABC.t_id, ABC.t_name,emp.dp_name #列名
FROM t_abc AS ABC ,employee AS emp #给表起别名
WHERE ABC.dp_id=emp.dp_id; #两张表相同的信息

SELECT ABC.t_id, ABC.t_name,emp.dp_name #列名
FROM t_abc AS ABC JOIN employee AS emp #给表起别名
WHERE ABC.dp_id=emp.dp_id; #两张表相同的信息

#外连接
/*
JOIN table1 ON table2 默认是内连接。
格式:
SELECT table1.column, table2.column [, table3.column...]
FROM table1 JOIN table2  ON (table1.column_name = table2.column_name)
[JOIN table3  table2.column = table3.column...]

ON子句:指明多表连接的条件, 能够把表连接的条件和其他的条件区分
*/
左连接,把join关键字左边的表信息全部显示出来
右连接,把join关键字右边的表信息全部显示出来
SELECT * #列名
FROM t_abc AS ABC LEFT JOIN employee AS emp #给表起别名
ON ABC.dp_id=emp.dp_id; #两张表相同的信息
自连接:SELECT xxxx FROM 表1 name1 JOIN 表1 name2 ON 过滤条件
子查询:
SELECT AVG(t_salary) '平均工资' FROM t_abc
子查询
SELECT t_id,t_salary,t_name FROM t_abc
WHERE t_salary < (SELECT AVG(t_salary)FROM t_abc) ;

SELECT t_name,t_id ,t_salary FROM t_abc
where t_salary = 134 OR t_salary= 9444;

SELECT t_name,t_id ,t_salary FROM t_abc
where t_salary in (134,9444)

SELECT * FROM t_abc
WHERE t_salary IN (SELECT t_salary FROM t_abc
WHERE t_salary = 134 OR  t_salary = 117 OR t_salary = 9444);

原文地址:https://www.cnblogs.com/huike/p/6598482.html