1:MySQL基本入门

1:语法规范

  1. 不区分大小写,但是关键字要大写。
  2. 每一条语句用分号“;”来结尾,当然如果一条sql语句太长,则可以分行。
  3. 注释:用--和#来注释一行,和/*    */来注释多行。

2:基本操作

首先讲解以下基本的操作:

  1. 查询当前数据库的语句:show databases;
  2. 进入某一个数据库:use xxx;
  3. 读取当前数据库中数据表的数据;select * from datatables;
  4. 创建一个数据表:create table namexx( id int,name varchar(20) );
  5. 插入数据 :insert into table_name (列1, 列2,...) VALUES (值1, 值2,....);

2.1:基础查询语句

/*
select 字段名 from 表名
特点:
1:查询列表可以是,表中的字段,常量值,表达式以及函数
2:查询结果是一个虚拟的表格,不是真的表格
*/

#1;查询表中单个字段
USE myemployees;
SELECT last_name FROM employees;

#2;查询表中多个字段
SELECT last_name,email,job_id FROM employees;

#3;查询表中所有字段
SELECT * FROM employees;

#4:查询常量
SELECT 100;
SELECT 'john';

#5:查询表达在
SELECT 100*98;

#6:查询函数
SELECT VERSION();

#7:为目标字段别名,使用别名区分开来
SELECT 100*98 AS 结果
SELECT last_name ASFROM employees;
SELECT first_name ASFROM employees ;
SELECT job_title AS 职位 FROM jobs;
SELECT salary AS 工资 FROM employees;

#8:去重
#案例,查询员工中涉及到所有的部门编号
SELECT DISTINCT department_id FROM employees;

#9:加号作用
/*
java中+的用法:运算符时,两个都为数字型,作为运算符,或者其中为字符串则是字符拼接
但是再sql中
两个都为数字时,作为加法运算。
假如其中一个为字符型,‘123’+100,则会试图将字符型转化成数字型,进行加法运算。
如果转换不成功,如‘john’+90,则将字符型转成0,和后面一个数字相加。
只要其中一方为null,则结果一定是null。

*/
#案例;查询员工名和姓连接成一个字段
SELECT CONCAT('a','b','c') AS 别名 ;
SELECT CONCAT(last_name,' ',first_name) AS 姓名 FROM employees;

DESC departments;
SELECT * FROM departments;
SELECT DISTINCT job_id FROM jobs;
SELECT CONCAT(first_name,',',last_name) AS out_put FROM employees;
SELECT IFNULL(commission_pct,0) AS 奖金率 FROM employees;
SELECT commission_pct AS 奖金率 FROM employees;

2.2:条件查询语句

#进阶
/*

语法:
SELECT 查询列表 FROM 表名 WHERE 筛选条件
上面语句的指向顺序是先判读是不是当前表名,然后再判断筛选条件满不满足,然后再select出来。

分类:
1:条件运算符:> < = != >= <=
2:按逻辑表达式筛选(不是按位的):&& || !(and or not)
3:模糊查询 
like,一般后通配符结合起来%abd%任意多个字符,还可以__来指定特定的位置%
between and,
in ,
is null,
*/

#1:按条件表达式筛选
#案例1:查询员工工资大于1万2的员工信息
SELECT * FROM employees WHERE salary>=12000;

#案例2:查询部门编号不等于90号的员工名和部门编号
SELECT last_name,first_name,department_id FROM employees WHERE department_id!=90; 

#2:按逻辑表达式来筛选条件
#案例1:查询工资在10000到20000之间的员工名,工资以及奖金
SELECT first_name,email,phone_number,salary FROM employees WHERE salary>=10000&&salary<=20000;
#案例2:查询工资在15000或者部门编号在90到100之间的员工信息
SELECT * 
FROM employees 
WHERE salary>=15000||department_id<=100&&department_id>=90;

#3:模糊查询 like ,between and, in,is NULL,is not NULL
#案例1:查询员工名字包含字符a的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '%a';

#案例2:查询员工名字包含第三个字符为e和第五个字符为a的员工信息和工资
SELECT last_name,salary
FROM employees
WHERE last_name LIKE '__n_l%';

#案例3:查询员工名字第二个字符为下划线的信息
SELECT last_name
FROM employees
WHERE last_name LIKE '_$_%' ESCAPE'$';

#使用between and 语句
#选择工号在100和120之间的员工信息
SELECT    *
FROM        employees
WHERE        employee_id BETWEEN 100 AND 120; 

#使用in关键字
#查询工种名的编号是AC_ACCOUNTAC_MGR,AD_ASST,AD_PRES和AD_VP的员工工资
SELECT first_name, salary
From employees
WHERE job_id IN('AC_ACCOUNT','AC_MGR','AD_ASST','AD_PRES');

 在SQL语句中like的用法?

2.3:排序查询语句

#排序查询,需要输出有序的内容,提交该运行程序端有序的内容。
/*
语法:
SELECT 列表
FROM 表
WHERE 筛选条件
ORDER BY ASC|DESC升序或者降序,如果不写关键字,则默认是降序。

特点:
1:asc代表升序,desc代表降序,默认是升序。
2:order by子句后面支持多个字段,表达式,函数以及别名。
3:该语句一般放在语句的最后,再select from where 之后。
*/
#案例1:查询员工信息,供求工资从高到低的排序
SELECT * 
FROM employees
ORDER BY salary ASC;

#案例2:查询部门编号大于等90的员工信息,按照入职时间先后排序
SELECT *
FROM employees
WHERE department_id>=90
ORDER BY hiredate ASC;

#案例3,按照年薪的高低,显示员工的信息和年薪(按照表达式排序)
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM employees
ORDER BY 年薪 DESC;

#案例5:查询姓名的长度来显示员工的姓名和工资。
SELECT LENGTH(last_name) 字节长度,last_name ,salary
FROM employees
ORDER BY LENGTH(last_name);


#案例6:员工信息按照工资排序,再按照员工编号排序

SELECT *
FROM employees
ORDER BY salary ASC,employee_id DESC;


#测试题1:查询员工姓名和部门号和年薪,按照年薪降序,姓名升序的方式
SELECT last_name,department_id,salary*12*(1+ IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 DESC,LENGTH(last_name) ASC

#测试题2:选择工资不在8000到17000的员工的姓名和工资,按工资降序
SELECT last_name,salary
FROM employees
WHERE salary not BETWEEN 8000 AND 17000
ORDER BY salary DESC;

#测试题3:查询邮箱包含e的员工信息,并按照邮箱的字节数降序,再按照部门号升序
SELECT *,LENGTH(email) 邮箱长度
FROM employees
WHERE email LIKE '%e%'
ORDER BY LENGTH(email) DESC ,department_id ASC;

2.4:常见函数的操作

2.4.1:字符函数

/*
常见函数
功能:类是于java的方法,将一组逻辑功能的语句封装到一个方法里面。
1:隐藏实现细节。2:提高代码的重用性。

调用:select 函数名(实参列表) FROM 表(如果实参列表用到了表中数据,就要);

特点:
    1:函数名
    2:功能
*/

#1:字符函数length 获取参数值的字节个数
SELECT LENGTH('john');
SELECT LENGTH('张三丰哈哈');
show VARIABLES LIKE '%char%';

#2:concat 拼接字符串
SELECT CONCAT(last_name,' ',first_name) 姓名 FROM employees;

#3.UPPER(str),LOWER(str)
SELECT UPPER('john');
#将姓变大写,名小写,然后拼接
SELECT CONCAT(LOWER(first_name),' ',UPPER(last_name)) FROM employees;

#4, SUBSTR(str FROM pos FOR len),SUBSTRING(str FROM pos FOR len).
#索引从1开始
SELECT SUBSTR('李莫愁爱上了陆展源',7) out_put;
#索引从指定长度开始
SELECT SUBSTR('李莫愁爱上了陆展源',1,3) out_put;

#5:姓名中首字符大写,其他字符小写,拼接显示出来
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),' ',LOWER(first_name)) FROM employees; 

#6 INSTR(str,substr)
SELECT INSTR('杨不悔爱上殷六瞎','殷六瞎') out_put;

#7:TRIM([remstr FROM] str)可以除去字符的空格
SELECT TRIM('a' FROM 'aaaa张翠山aaaa') AS out_put;

#8:ipad 填充成指定长度的
SELECT LPAD('殷素素',10,'*') AS out_put;
SELECT RPAD('殷素素',10,'ab') AS out_put;

#9 REPLACE
SELECT REPLACE('张无忌爱上周自然','周自然','赵敏') as output;

2.4.2:数学函数

# round 四舍五入
SELECT ROUND(-1.88);
#代表小数点后,保留1位。
SELECT ROUND(-1.88,1);
# ceil向上去整,返回等于该参数的最小数
SELECT CEIL(-1.02);
#FLOOR(X)向下取整,返回小于等于该参数的最大数
SELECT FLOOR(9.99);
#TRUNCATE  截断
SELECT TRUNCATE(1.65231,1);
#MOD 取模 结果符号是与前面数字的符号一直
SELECT mod(10,-3);

2.4.3:日期函数和if case函数

#日期函数

#now 得到现在日期
SELECT NOW();

#curdata 返回当前系统日期,不包含时间
SELECT CURDATE();

#curtime 返回当前系统时间,不包含日期
SELECT CURTIME();

#也可以获取指定部分,年,月,日,小时等等
SELECT YEAR(NOW()) 年;
SELECT YEAR('1988-1-1') 年;
SELECT YEAR(hiredate) FROM employees;
SELECT MONTH(hiredate) FROM employees;

SELECT MONTHNAME('1988-1-1') 月;

#STR_TO_DATE(str,format)将日期格式的字符转化成指定格式的日期
SELECT STR_TO_DATE('1999-3-3','%Y-%c-%d') out_put;

#查询员工表中,hiredate中,入职日期为1992--4--3的员工日期
SELECT * 
FROM employees
WHERE hiredate = STR_TO_DATE('4-3-1992','%c-%d-%Y');

# date_format 将日期转换成string
SELECT date_format(NOW(),'%y年%m月%d日')AS out_put;

#查询有奖金员工名的入职日期(xx月/xx日 xx年)
SELECT last_name,DATE_FORMAT(hiredate,'%m月/%d日 %y年') 
FROM employees
where commission_pct is not NULL;

#流程控制函数

#1:if函数,if else效果
SELECT IF(10>5,'','');

SELECT last_name,commission_pct,IF(commission_pct is null,'没奖金,呵呵','有奖金,嘻嘻') 备注
FROM employees;

#2case函数 使用1:switch case的效果
/*
Java中
    switch(变量)
        case 常量1:    break;
        case 常量2:    break;
        case 常量3:    break;
        default: break;

MySQL中
    case要判断的字段或者表达式
    WHEN 常量1 then 要显示的值1
    WHEN 常量2 then 要显示的值2
    WHEN 常量3 then 要显示的值3

*/

#案例:查询员工的工资,要求
/*
部门号 = 30,显示的工资为1.1倍
部门号 = 40,显示的工资为1.2倍
部门号 = 50,显示的工资为1.3倍
其他部门,显示为原工资
*/
SELECT salary 原始工资, department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;

#3;case函数的使用二,多重if
/*
MySQL中,
CASE 
WHEN 条件1 than 要显示的值1或者语句1
WHEN 条件2 than 要显示的值2或者语句2
WHEN 条件3 than 要显示的值3或者语句3
...
ELSE 要显示的值或者语句
END
*/

#案例:查询员工工资情况
/*
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示C级别
否则显示D级别
*/

SELECT salary,
case 
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END as 工资级别
from employees;

 

  • 添加到短语集
     
    • 没有此单词集:中文(简体) -> 中文(简体)...
       
    • 创建新的单词集...
  • 拷贝
posted @ 2020-03-23 15:29  大朱123  阅读(178)  评论(0编辑  收藏  举报