1:MySQL基本入门
1:语法规范
- 不区分大小写,但是关键字要大写。
- 每一条语句用分号“;”来结尾,当然如果一条sql语句太长,则可以分行。
- 注释:用--和#来注释一行,和/* */来注释多行。
2:基本操作
首先讲解以下基本的操作:
- 查询当前数据库的语句:show databases;
- 进入某一个数据库:use xxx;
- 读取当前数据库中数据表的数据;select * from datatables;
- 创建一个数据表:create table namexx( id int,name varchar(20) );
- 插入数据 :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 AS 姓 FROM employees; SELECT first_name AS 名 FROM 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;