一、基础层
登录:mysql -h主机名 -P端口号 -u用户名 -p密码(默认端口3306,用户root)
退出:exit或ctrl+c
1. 操作文件夹(库,database(s)) 增:create database db1; 查:show databases; 改:alter database db1 charset latin1; 只能更改数据库的字符集、校对规则名这种全局特性。 删: drop database db1; 2. 操作文件(表,table) 先切换到文件夹下:use db1 增:create table 表名t1(列名id 列类型int,name char); 查:show tables; 改:alter table t1 modify name char(3); alter table t1 change name name1 char(2); 删:drop table t1; 3. 操作文件中的内容(记录) 增:insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3'); 查:select * from t1; 改:update t1 set name='sb' where id=2; 删:delete from t1 where id=1;
4. 客户端查询:SELECT VERSION();#查看当前版本号 SELECT DATABASE();#查看当前库 SELECT USER();#查看当前用户
例库结构:employees表, `department_id`,`department_name`,`manager_id`,`location_id`等列名(字段)
二、基础查询
1.查询表中的单个字段: SELECT (DISTINCT)last_name FROM employees; DISTINCT是去重
2.查询表中的多个字段: SELECT last_name,salary,email FROM employees;
3.查询表中所有字段: SELECT * FROM employees ;
4.查询常量值: SELECT 100; SELECT 'john'; 5.查询表达式: SELECT 100%98; 6.查询函数:SELECT f(); 7.起别名: 用“AS”或空格
8.“+”只能是运算符,无连接字符功能,连接功能用concat(),执行+运算时,字符型强制转换为数值,尤其注意:只要“+”其中一方为null,则结果为null
9.判断是否为空用IFNULL(表达式,表达式为“null”时的返回值),若表达式值非"null",返回表达式本身;如IFNULL("H","R")返回"H",IFNULL(NULL,"R")返回"R"
三、条件查询 select *** from 表名 where 查询条件
1.按条件表达式筛: > < = != <>(不等于) >= <=
2.按逻辑表达式筛: && || ! and or not
3.模糊查询:like 常搭配的通配符:(1)% 0到任意多个字符(2) _ 任意单个字符 select * from T1 where id like "%a%"
between and 注意包含临界值 select * from T1 where id between 80 and 100
in (列表) 用于判断某字段的值是否属于in列表中的某一项,使语句简洁 select * from T1 where job_id IN ('101','103','105');
is (not) null 判断某字段的值是否为null,注意不能用"="或"<>"来判断null,但可用安全等于符号"<=>"
4.排序: order by 排序列表 [asc|desc] 按名字长度升序、编号降序查询 SELECT * FROM T1 ORDER BY LENGTH(last_name) ASC,id DESC;
四、常见函数 关键:(a)叫什么(函数名);(b)干什么(功能) 调用:select 函数名(实参列表) [from 表(根据需要)];
1.字符函数: (1)lenth(),concat(),upper(),lower()
(2)substr或substring(str, pos, len)由 <str> 中的第 <pos> 位置开始,选出接下去的 <len> 个字元。若无<len>,则选到结尾。
例:将姓名首字符大写,其他字符小写,用_拼接:来SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) output(别名) FROM employees;
(3)instr(str,SUBstr) 返回子串的起始索引数,找不到返回0 例:SELECT INSTR('杨不悔爱上了殷六侠','殷六侠') AS out_put
(4)trim(str) 去除字符 例:(a)默认去除首尾空格SELECT LENGTH(TRIM(' 张翠山 ')) (b)去除首尾的指定字符SELECT TRIM('a' FROM 'aa张aa翠山aaa')
(c)LTRIM(str) 去除左空格 (d)RLTRIM(str) 去除右空格
(5)lpad或Rpad(str1,length,str2) 若str1的长度没有length那么长,则使用str2(左、右)填充;若str1的长度大于length,则截断。
(6)replace(str1, a, b) 把str1中出现a的全部替换为b 例:select replace('aaa.163.com','a','w')—>www.163.com
2.数学函数: (1)ROUND(1.567,2);#1.57,小数点后保留2位; (2)CEIL(-1.02);#-1 向上取整(返回>=该参数的最小整数) FLOOR(-9.99);#-10 向下取整,返回<=该参数的最大整数
(3)truncate 截断 TRUNCATE(1.65,1);#1.6; (4)mod 取余 MOD(10,-3);#1
3.日期函数: (1)now():返回当前系统日期 + 时间 (2)curdate() 返回当前系统日期,不包含时间 (3)curtime() 返回当前时间,不包含日期
(4)获取指定的部分,年,月,日,小时,分,秒: YEAR('1998-1-1')年,MONTH(NOW())月,hour,minute,second
(5)格式转换:STR_TO_DATE(str,format)将时间格式的字符串(str),按format格式转换为DATETIME类型的值。
DATE_FORMAT(date,format)函数则是把数据库的日期转换为对应的字符串格式 与上面函数互为逆操作
4.流程控制函数: (1)if函数: SELECT IF(10>5,'大','小'); (2)case函数 使用一: switch case的效果 适用于等值类判断 使用二: 类似于多重if 适用于区间类判断
SELECT salary,department_id, CASE department_id #case 要判断的字段或表达式 WHEN 30 THEN salary*1.1 WHEN 40 THEN salary*1.2 WHEN 50 THEN salary*1.3 ELSE salary END (AS 新工资) FROM employees |
SELECT salary, CASE WHEN salary>20000 THEN 'A' WHEN salary>15000 THEN 'B' WHEN salary>10000 THEN 'C' ELSE 'D' END (AS 工资级别) FROM employees; |
5.分组函数: (1)数值型: sum 求和、avg平均值 (2)任何类型:max、min、count计算个数 如:SELECT COUNT(*) FROM 表employees;#统计表的行数;某行只要有一列不为空,则算上
共性:(1)都忽略null值 (2)可以和distinct搭配实现去重
6.分组查询: select 分组函数(max等),列(需出现在group by后) from 表 【分组前筛选:where 筛选条件】【分组后筛选:having 筛选条件】 group by 分组的列表 【order by】子句
group by子句支持(1)单个字段分组(2)多个字段分组(多个字段之间用逗号隔开无顺序要求)(3)表达式或函数(用的较少)
7.连接(多表)查询: 关键:添加有效的连接条件,以避免多表连接时的笛卡儿积现象
特别注意:
where是从数据表中的字段直接进行的筛选,而having是从已筛选的字段再筛选,即:
where 是针对数据库文件(数据库已有字段)的发挥作用,而having是针对结果集发挥作用。
因此,通常而言,WHERE 子句作用于表和视图,HAVING 子句常作用于组group by之后。