MySQL- - -第一天

一、第一天

1、sql、DB、DBMS分别是什么,它们之间的关系

DB:DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)

DBMS:DataBase Management system(数据库管理系统,常见的有:MySQL、oracle、DB2、sybase、sqlserver…)

SQL结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。
SQL属于高级语言。只要能看懂英语单词,写出sql语句,就可以读懂。
SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成)

三者的关系

DBMS -(执行)- > SQL - (操作)- > DB


2、什么是表

:(table)是数据库的基本组成单元,所有的数据都以表格的形式组成,目的是可读性强。

一个表包括行和列:

行: 被称为数据 / 记录(data)

列: 被称为字段(column)

学号(int) 姓名(varchar) 年龄(int)
  110               张三               20
  120              李四                21

每一个字段应该包含哪些属性
字段名、数据类型、相关的约束


3、学习MySQL主要是学习SQL语句,那么SQL语句包含增删改查,SQL语句怎么分类

DQL(数据查询语句):查询语句,凡是select语句都是DQL。
DML(数据操作语言):insert、delete、updata,对表当中的数据进行增删改。
DDL(数据定义语言):create、drop、alter,对表结构的增删改。
TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)
DCL(数据控制语言):grant授权、revoke撤销权限等。


4、导入数据

第 ① 步:登录mysql数据库管理系统
  dos命令窗口:
     mysql -uroot -p

第 ② 步:查看有哪些数据库
  show databases;(这个不是SQL语句,属于MySQL的命令)
±----------------------------  +
|     Database                |
±-----------------------------+
| information_schema   |
| mysql                          |
| performance_schema |
| sys                              |
±-----------------------------+

第 ③ 步:创建属于自己的数据库
  create database bjpowernode;(这个不是SQL语句,属于MySQL的命令)

第 ④ 步:使用属于自己的数据库
  use bjpowernode;(这个不是SQL语句,属于MySQL的命令)

第 ⑤ 步:查看当前使用的数据库中有哪些表?
  show tables;(这个不是SQL语句,属于MySQL的命令)

第 ⑥ 步:初始化数据
  mysql> source D:\MySQL\bjpowernode\bjpowernode.sql

注意:数据初始化完成之后,有三张表:
±--------------------------------+
| Tables_in_bjpowernode |
±--------------------------------+
| dept                                |
| emp                                |
| salgrade                         |
±--------------------------------+


5、导入数据

bjpowernode.sql,这个文件以sql结尾,这样的文件被称为”sql“脚本。什么时sql脚本呢?

当一个文件的扩展名时.sql,并且该文件中编写了大量的sql语句,我们称这样的文件为sql脚本。

注意直接使用source命令可以执行sql脚本。
sql脚本中的数据量太大的时候,无法打开,请使用source命令完成初始化。


6、删除数据库

drop database bjpowernode;


7、查看表结构

        desc 表名;

dept是部门表
emp是员工表
salgrade 是工资等级表

8、查看表中的数据

	**select * from 表名**; //统一执行这个SQL语句。

9、常用命令

select database(); 查看当前使用的是哪个数据库

select version(); 查看mysql的版本号

\c 结束一条语句

10、查看创建表的语句

show create table emp;


11、简单的查询语句(DQL)

① 语法格式:

select 字段名1,字段名2,字段名3,… from 表名;


查询全部字段

select * from 表名;


其中要注意

对于SQL语句来说,是通用的,
所有的SQL语句以;结尾
另外SQL语句不区分大小写,都行

计算员工年薪?sal * 12。

mysql> select ename,sal*12 from emp; // 结论:字段可以使用数学表达式!


给查询的列起别名?

mysql> select deptno,dname as deptname from dept;

使用as关键字起别名
注意:只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname
记住:select语句是永远都不会进行修改操作的。(因为只负责查询


假设起别名的时候,别名里面有空格/中文,怎么办?

select deptno,dname ‘dept name’ from dept; //加单引号

select deptno,dname “dept name” from dept; //加双引号


注意:在所有的数据库当中,字符串统一使用单引号括起来,单引号是标准,双引号在oracle数据库中用不了。但是在mysql中可以使用。

as关键字可以省略(以空格代替)
mysql> select deptno,dname deptname from dept;


12、条件查询

语法格式:

     select
         字段,字段…
      from
          表名
      where
          条件;

执行顺序:先from,然后where,最后select


13、都有哪些条件

=(等于)

<>或!=(不等于)、<(小于)

<=(小于等于)、> (大于)、>=(大于等于)

between…and…(两个值之间)等同于 >= and <=

between…and…除了可以使用在数字方面之外,还可以使用在字符串方面。 左闭右开
例如:select ename from emp where ename between ‘A’ and ‘C’;

is null(为空)、is not null(不为空)

and(并且)、or(或者)
and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”

in(包含)相当于多个or注意:in不是一个区间。in后面跟的是具体的值。

not (取非),主要用在 is 或 in 中

like(模糊查询,支持%或下划线匹配)
%匹配任意多个字符
下划线:任意一个字符。
(%是一个特殊的符号,_ 也是一个特殊符号)

例如:

	找出名字以T结尾的?
		select ename from emp where ename like '%T';
		
	找出名字以K开始的?
		select ename from emp where ename like 'K%';

	找出第二个字每是A的?
		select ename from emp where ename like '_A%';
	
	找出第三个字母是R的?
		select ename from emp where ename like '__R%';

	找出名字中有“_”的?
		select name from t_student where name like '%_%'; //这样不行。

		mysql> select name from t_student where name like '%\_%'; // \转义字符。


14、排序(升序/降序)

按照工资升序,找出员工名和薪资?

order是排序,by是通过 - - - 默认是升序

指定排序- - - asc表示升序,desc表示降序

select ename,sal from emp order by sal asc;(升序)
select ename,sal from emp order by sal desc;(降序)

select 
	ename,sal
from
	emp
order by
	sal; // 默认是升序!!!

按照工资的降序排列,当工资相同的时候再按照名字的升序排列

在前的sal起主导,只有当sal相等的时候,才会考虑启用ename排序

select 
	ename,sal
from
	emp
order by
	sal asc, ename asc; // sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。

了解:根据字段的位置也可以排序
select ename,sal from emp order by 2; // 2表示第二列。第二列是sal

按照查询结果的第2列sal排序。

了解一下,不建议在开发中这样写,因为不健壮。
因为列的顺序很容易发生改变,列顺序修改之后,2就废了

④ 综合一点的案例:

找出工资在1250到3000之间的员工信息,要求按照薪资降序排列。
select 
	ename,sal
from
	emp
where
	sal between 1250 and 3000
order by
	sal desc;

关键字顺序和执行顺序

关键字顺序不能变:
select

from

where

order by

	以上语句的执行顺序必须掌握:
		第一步:from
		第二步:where
		第三步:select
		第四步:order by(排序总是在最后执行!)


15、数据处理函数(单行处理函数)

一个输入对应一个输出
多个输入对应多个输出


16、单行处理函数常见的有哪些

① lower 转小写

mysql> select lower(ename) as ename from emp;

② upper 转大写

mysql> select * from t_student;

mysql> select upper(name) as name from t_student;

③ substr 取子串

substr( 被截取的字符串, 起始下标,截取的长度)
注意:起始下标从1开始,没有0.

找出员工名字第一个字母是A的员工信息?
		第一种方式:模糊查询
			select ename from emp where ename like 'A%';
		第二种方式:substr函数
			select 
				ename 
			from 
				emp 
			where 
				substr(ename,1,1) = 'A';

④ concat 字符串拼接

select concat(empno,ename) from emp;

⑤ length 取长度

select length(ename) enamelength from emp;  // 重命名省略了as

⑥ trim 去空格

	select * from emp where ename = '  KING';
	
	select * from emp where ename = trim('   KING');

⑦ ifnull 可以将 null 转换成一个具体值 - -对null进行预处理

ifnull是空处理函数。专门处理空的。

在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL

计算每个员工的年薪?
	年薪 = (月薪 + 月补助) * 12
	// 下面计算有null参与的结果为null
	select ename, (sal + comm) * 12 as yearsal from emp;

注意:NULL只要参与运算,最终结果一定是NULL。为了避免这个现象,需要使用ifnull函数。

	fnull函数用法:ifnull(数据, 被当做哪个值)
	
	如果“数据”为NULL的时候,把这个数据结构当做哪个值

补助为NULL的时候,将补助当做0

	select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;

⑧ round 四舍五入

	select 字段 from 表名;
	select ename from emp;
	select 'abc' from emp; // select后面直接跟“字面量/字面值”

	select 'abc' as bieming from emp;
	
	mysql> select abc from emp;
	ERROR 1054 (42S22): Unknown column 'abc' in 'field list'
	这样肯定报错,因为会把abc当做一个字段的名字,去emp表中找abc字段去了。
	
	select 1000 as num from emp; // 1000 也是被当做一个字面量/字面值。

结论select后面可以跟某个表的字段名可以等同看做变量名),也可以跟字面量/字面值数据)。

	select round(1236.567, 0) as result from emp; //保留整数位。
	select round(1236.567, 1) as result from emp; //保留1个小数
	select round(1236.567, 2) as result from emp; //保留2个小数
	select round(1236.567, -1) as result from emp; // 保留到十位。

⑨ rand() 生成随机数

select rand()*100 from emp;   // 100以内的随机数
select round(rand()*100,0) from emp; // 100以内的随机数进行保留整数

⑩ str_to_date 将字符串转换成日期

select str_to_date('2017-01-06 10:20:30','%Y-%m-%d %H:%i:%s') as result;

⑩+① date_format 格式化日期

%a	缩写星期名
%b	缩写月名
%c	月,数值
%D	带有英文前缀的月中的天
%d	月的天,数值(00-31)
%e	月的天,数值(0-31)
%f	微秒
%H	小时 (00-23)
%h	小时 (01-12)
%I	小时 (01-12)
%i	分钟,数值(00-59)
%j	年的天 (001-366)
%k	小时 (0-23)
%l	小时 (1-12)
%M	月名
%m	月,数值(00-12)
%p	AM 或 PM
%r	时间,12-小时(hh:mm:ss AM 或 PM)
%S	秒(00-59)
%s	秒(00-59)
%T	时间, 24-小时 (hh:mm:ss)
%U	周 (00-53) 星期日是一周的第一天
%u	周 (00-53) 星期一是一周的第一天
%V	周 (01-53) 星期日是一周的第一天,与 %X 使用
%v	周 (01-53) 星期一是一周的第一天,与 %x 使用
%W	星期名
%w	周的天 (0=星期日, 6=星期六)
%X	年,其中的星期日是周的第一天,4 位,与 %V 使用
%x	年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y	年,4 位
%y	年,2 位

例如
select date_format(now(),'%b %d %Y %h:%i %p')
select date_format(now(),'%d %b %Y %T %f ')

⑩+② format 格式化数字

format(n,d,locale); 

n是要格式化的数字。
d是要舍入的小数位数。
locale是一个可选参数,用于确定千个分隔符和分隔符之间的分组。如果省略locale操作符,MySQL将默认使用en_US。

format函数将数字N格式化为格式,如"#,###,###.##",舍入到d位小数。它返回一个值作为字符串

select format(14500.2021,2);


⑩+③case when 条件1 then 取值1 when 条件2 then 取值2 else 取值3 end

when后接条件语句,then后为字段取值(数值或字符串等都可以,但类型须一致)

当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%,其它正常。
  注意:不修改数据库,只是将查询结果显示为工资上调)
	select 
		ename,
		job, 
		sal as oldsal,
		(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal 
	from 
		emp;


17、分组函数(多行处理函数) - 共5个

输入多行、输出一行

① count 计数、sum 求和、avg 平均值、max 最大值、min最小值

注意所有分组函数都是对“某一组”数据进行操作的。

找出最高工资?
	mysql> select max(sal) from emp;
找出最低工资?
	mysql> select min(sal) from emp;
计算工资和:
	mysql> select sum(sal) from emp;
计算平均工资:
	mysql> select avg(sal) from emp;
计算员工数量?
	mysql> select count(ename) from emp;

② 分组函数在使用的时候需要注意哪些?

第一点分组函数自动忽略NULL,你不需要提前对NULL进行处理。

	mysql> select sum(comm) from emp;

第二点分组函数中count(*)和count(具体字段)有什么区别?

		mysql> select count(*) from emp;
		
		mysql> select count(comm) from emp;

count(具体字段):表示统计该字段下所有不为NULL的元素的总数

count(*)统计表当中的总行数。(只要有一行数据count则++
因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的。

第三点分组函数不能够直接使用在where子句中。

因为,分组函数是在group by分组之后才能执行,group by又是在where执行之后才会执行

分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。当一条sql语句没有group by语句时,整个表为一个组

	找出比平均工资高的员工信息。
	select ename,sal from emp where sal > avg(sal);
	
	ERROR 1111 (HY000): Invalid use of group function

正确操作

法1) ① select avg(sal) from emp; // 得到平均工2073.214286

② select ename,sal from emp where sal > 2073.214286;

法2)select ename,sal from emp where sal > (select avg(sal) from emp);

第四点所有的分组函数可以组合起来一起用。

	select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;


18、分组查询(group by) - 非常重要

对于group by分组操作,如果在select中的列,没有在group by中出现,那么这个SQL是不合法的,因为列不在group by从句中,也就是说查出来的列必须在group by后面出现否则就会报错,或者这个字段出现在分组函数里面

什么是分组查询?

在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。

② 计算每个工作岗位的最高工资?

		select
			...
		from
			...
		group by
			...
		
	select max(sal) from emp group by job;  把emp中按工作岗位分组,取每个工作岗位的最高薪资

select ename, max(sal),job from emp group by job; 是错误的

sql语句有group by时只允许select后出现参加分组的字段分组函数,其他字段出现是错误的。


③ 找出“每个部门,不同工作岗位”的最高薪资?多个字段联合起来分组

技巧:两个字段联合成1个字段看。(两个字段联合分组)

	select 
		deptno, job, max(sal)
	from
		emp
	group by
		deptno, job;    //  ,分割


where后不能用分组函数

因为,分组函数是在group by分组之后才能执行,group by又是在where执行之后才会执行

分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。当一条sql语句没有group by语句时,整个表为一个组


④ 找出每个部分的最高薪资,要求显示薪资大于2500的数据

第一步:找出每个部门最高薪资

	按照部门编号分组,求每一组最大值。
	select deptno,max(sal) from emp group by deptno;

第二步:要求显示最高薪资大于3000

		select 
			deptno,max(sal) 
		from 
			emp 
		group by 
			deptno
		having
			max(sal) > 3000;

比较低,实际上可以这样考虑:先将大于3000的都找出来,然后再分组

		select 
			deptno,max(sal)
		from
			emp
		where
			sal > 3000
		group by
			deptno;

优化策略:

where和having,优先选择where,where实在完成不了了,再选择having。


④ 将之前的关键字全部组合在一起,来看一下他们的执行顺序?

	select
		...
	from
		...
	where
		...
	group by
		...
	having
		...
	order by
		...
	
	以上关键字的顺序不能颠倒,需要记忆。
	执行顺序是什么?
		1. from				从哪个表
		2. where			条件过滤  where后不能加分组函数(下面5个)
		3. group by		再分组    分组后分组函数才能执行(count、sum、avg、max、min)
		4. having			不满意再过滤
		5. select			查出来
		6. order by		排序输出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值