条件运算符: > < = != >= 12000的员工信息 SELECT * FROM employees WHERE salary>120000;#案例2:查询部分编号不等于90的员工名和部门编号 SELECT last_name, department_id FROM employees; WHERE department_id90;[/code]
按逻辑表达式筛选
#案例1:查询工资>12000的员工信息
SELECT
*
FROM
employees
WHERE
salary>120000;
#案例2:查询部分编号不等于90的员工名和部门编号
SELECT
last_name,
department_id
FROM
employees;
WHERE
department_id<>90;
复制代码
常见函数
#案例一:查询工资在10000到20000之间的员工名、工资以及奖金
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
salary >= 10000
AND
salary <= 20000
复制代码
单行函数
操作数据对象
接受参数返回一个结果
只对一行进行变换
每行返回一个结果
可以嵌套
参数可以是一列或一个值
字符函数
注意:MySQL中,字符串的位置是从1开始的。
函数作用ASCII(S)返回字符串 S 中的第一个字符的 ASCII 码值CHAR_LENGTH(s)返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同LENGTH(s)返回字符串s的个数,和字符集有关CONCAT(s1,s2,...,sn)连接s1,s2,......sn 为一个字符串CONACT_WS(x,s1,s2,......,sn)同CONCAT(s1,s2,...)函数,但是每个字符串之间要加上xINSERT(str,idx,len,replacestr)将字符串str从第idx位置开始,len个字符长的子串替换为字符串replacestrREPLACE(str,a,b)用字符串b替换字符串str中所有出现的字符串aUPPER(s) 或 UCASE(s)将字符串s的所有字母都转换成大写字母LOWER(s) 或 LCASE(s)将字符串s的所有字母都转成小写字母LEFT(str,n)返回字符串str最左边的n个字符RIGHT(str,n)返回字符串str最右边的n个字符LPAD(str,len,pad)用字符串pad对str最左边进行填充,直到str的长度为len个字符RPAD(str,len,pad)用字符串pad对str最右边进行填充,直到str的长度为len个字符LTRIM(s)去掉字符串s左侧的空格RTRIM(s)去掉字符串s右侧的空格TRIM(s)去掉字符串s开始与结尾的空格TRIM(s1 FROM s)去掉字符串s开始与结尾的s1TRIM(LEADING s1 FROM s)去掉字符串s开始处的s1TRIM(TRAILING s1 FROM s)去掉字符串s结尾处的s1REPEAT(str,n)返回str重复n次的结果SPACE(n)返回n个空格STRCMP(s1,s2)比较字符串s1,s2的ASCII码值的大小SUBSTR(s,index,len)返回从字符串s的index位置其len个字符,作用与SUBSTING(s,n,len)相同LOCATE(substr,str)返回字符串 substr 在字符串 str 中首次出现的位置,作用与 POSITION(substr IN str)、INSTR(str,substr) 相同。未找到,返回0ELT(m,s1,s2,......,sn)返回指定位置的字符串,如果m=1,则返回s1,如果m=2,则返回s2,如果m=n,则返回snFIELD(s,s1,s2,...,sn)返回字符串s在字符串列表中第一次出现的位置FIND_IN_SET(s1,s2)返回字符串s1在字符串s2中出现的位置。其中,字符串s2是一个以逗号分隔的字符串REVERSE(s)返回s反转后的字符串NULLIF(value1,value2)比较两个字符串,如果value1与value2相等,则返回NULL,否则返回value
length():获取参数值的字节个数
#案例1:查询员工名中包含符a的员工信息
SELECT
*
FROM
employees
WHERE
last_name LIKE '%a%';
#案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
SELECT
last_name,
salary,
FROM
employees
WHERE
last_name LIKE '__e_a%';
#案例3:查询员工名中第二个字符为_的员工名
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_\_%'; 或者 last_name LIKE '_$_%' ESCAPE '$';
函数用法FORMAT(value,n)返回对数字value进行格式化后的结果数据。n表示 四舍五入 后保留到小数点后n位CONV(value,from,to)将value的值进行不同进制之间的转换INET_ATON(ipvalue)将以点分隔的IP地址转化为一个数字INET_NTOA(value)将数字形式的IP地址转化为以点分隔的IP地址BENCHMARK(n,expr)将表达式expr重复执行n次。用于测试MySQL处理expr表达式所耗费的时间CONVERT(value USING char_code)将value所使用的字符编码修改为char_code分组函数
功能:用作统计使用,又称为聚合函数或统计函数或组函数。输入的是一组数据的集合,输出的是单个值。
分类:sum 求和、 avg 平均值、 max 最大值、 min 最小值、 count 计算个数;
特点:
sum、avg一般用于处理数值型;max、min、count 可以处理任何类型;
以上分组函数都忽略 null 值;
可以和 distinct 搭配实现去重的运算;
select 函数名(实参列表) [from 表]
(1) 单行函数
concat、length、ifnull等
(2) 分组函数
做统计使用,又称为统计函数、聚合函数、组函数
复制代码
count函数的详细介绍,一般使用 COUNT(*) 统计行数;
SELECT LENGTH('张三丰hahaha');
SHOW VARIVALE LIKE '%char%'; 查看字符集
复制代码
和分组函数一同查询的字段要求是 group by 后面的字段;
SELECTV CONCAT(last_name,'_',first_name) 姓名 FROM employees;
列子查询(多行子查询)(结果集是一列:一列多行):一般搭配着多行操作符使用 in、any/some、 all
行子查询(结果集是一行:一行多列)
表子查询(结果集一般为多行多列)
where 或 haing 后面
标量子查询
列子查询
行子查询
特点:
<ul>子查询放在小括号内
子查询一般放在条件的右侧
标量子查询,一般搭配着单行操作符使用 > < >= (1)结果 SELECT * FROM employees WHERE salary>( SELECT salary FROM employees WHERE last_name = 'Abel' );#案例2:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资#(1)查询141号员工的job_id SELECT job_id FROM employees WHERE employee_id = 141#(2)查询143号员工的salary SELECT salary FROM employees WHERE employee_id = 143#(3)查询员工的姓名、job_id和工资,要求job_id=(1)并且salary>(2) SELECT last_name,job_id,salary FROM employees WHERE job_id = ( SELECT job_id FROM employees WHERE employee_id = 141 ) AND salary > ( SELECT salary FROM employees WHERE employee_id = 143 );#案例3:返回公司工资最少的员工的last_name,job_id和salary#(1)查询公司的最低工资 SELECT MIN(salary) FROM employees;#(2)查询last_name,job_id和salary,要求salary=(1) SELECT last_name,job_id,salary FROM employees WHERE salary = ( SELECT MIN(salary) FROM employees; );#案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资#(1)查询50号部门的最低工资 SELECT MIN(salary) FROM employees WHERE department_id =50#(2)查询每个部门的最低工资 SELECT MIN(salary),department_id FROM employees GROUP BY department_id#(3)在(2)的基础上,满足min(salary)>(1) SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary)>( SELECT MIN(salary) FROM employees WHERE department_id =50 );[/code]非法使用标量子查询:
#案例1:查询每个工种的最高工资
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;
#案例2:查询每个位置上的部门个数
SELECT COUNT(*),location_id
FROM employees
GROUP BY location_id;
#案例3:查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary),department_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id;
#案例4:查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
#案例5:查询哪个部门的员工个数>2
(1) 查询每个部门员工个数
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;
(2) 根据(1)的结果进行筛选,查询哪个部门的员工个数>2
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;
复制代码
列子查询(多行子查询)
返回多行
使用多行比较操作符
操作符含义IN / NOT IN等于列表中的任意一个ANY | SOME和子查询返回的某一个值比较ALL和子查询返回的所有值比较
#案例:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
(1)查询每个工种有奖金的员工的最高工资
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id;
(2)根据(1)结果继续筛选,最高工资>12000
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
#案例:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资;
(1)查询每个领导手下的员工最低工资
SELECT MIN(salary),manager_id
FROM employees
GROUP BY manager_id;
(2)添加筛选条件:编号>102
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id > 102
GROUP BY manager_id;
(3)添加筛选条件:最低工资>5000
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id > 102
GROUP BY manager_id
HAVING MIN(salary)>5000;
> 按表达式或函数分组
> 案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的的有哪些
(1)查询每个长度的员工个数
SELECT COUNT(*),LENGTH(last_name)
FROM employees
GROUP BY LENGTH(last_name);
(2)添加筛选条件
SELECT COUNT(*),LENGTH(last_name)
FROM employees
GROUP BY LENGTH(last_name)
HAVING COUNT(*)>5;
> 按多个字段分组
#案例:查询每个部门每个工种的员工的平均工资
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY job_id,department_id;
#添加排序
#案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
SELECT AVG(salary),department_id,job_id
FROM employees
WHERE department_id IS NOT NULL
GROUP BY job_id,department_id
ORDER BY AVG(salary) DESC;
复制代码
exists后面(相关子查询)
SELECT 查询列表
FROM 表1 别名, 表2 别名
WHERE 表1.key = 表2.key
[AND 筛选条件]
[GROUP BY 分组字段]
[HAVING 分组后的筛选]
[ORDER BY 排序字段]
复制代码
#案列1:查询女生名和对应的男生名
SELECT NAME,boyName
FROM boys,beauty
WHERE beauty.boyfriend_id = boys.id;
#案例2:查询员工名和对应的部门名
SELECT last_name,department_name
FROM employees,departments
WHERE employees.`department_id` = departments.`department_id`;
2. select、having 或 order by 后面存在的非聚合列必须全部在 group by 中存在。
复制代码
2. 表的修改
#要显示的页数page 每页的条目数size
SELECT 查询列表
FROM 表
LIMIET (page-1)*size,size;
复制代码
3. 表的删除
#案例1:查询前五条员工信息
SELECT * FROM employees LIMIT 0,5;
或
SELECT * FROM employees LIMIT 5;
#案例2:查询第11条——第25条
SELECT * FROM employees LIMIT 10,15;
复制代码
4. 表的复制
查询语句1
union [all]
查询语句2
union [all]
......
#案例:查询部门编号>90或邮箱包含a的员工信息
SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id >90;
复制代码
常见数据类型介绍
数值型:
整型
小数:
定点数
浮点数
字符型:
较短的文本:char、varchar
较长的文本:text、blob(较长的二进制数据)
日期型
类型类型举例整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT浮点类型FLOAT、DOUBLE定点数类型DECIMAL位类型BIT日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP文本字符串类型CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT枚举类型ENUM集合类型SET二进制字符串类型BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOBJSON类型JSON对象、JSON数组空间数据类型单值:GEOMETRY、POINT、LINESTRING、POLYGON;集合:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、 GEOMETRYCOLLECTION其中,常用的几类类型介绍如下:
[table][tr]数据类型描述[/tr][tr][td]INT[/td][td]从-231到231-1的整型数据。存储大小为 4个字节[/td][/tr][tr][td]CHAR(size)[/td][td]定长字符数据。若未指定,默认为1个字符,最大长度255[/td][/tr][tr][td]VARCHAR(size)[/td][td]可变长字符数据,根据字符串实际长度保存,必须指定长度[/td][/tr][tr][td]FLOAT(M,D)[/td][td]单精度,占用4个字节,M=整数位+小数位,D=小数位。 D