Mysql基础(一)

数据库概述

SQL,一般发音为sequel,SQL的全称Structured Query Language),SQL用来和数据库打交道,完成和数据库的通信,SQL是一套标准。但是每一个数据库都有自己的特性别的数据库没有,当使用这个数据库特性相关的功能,这时SQL语句可能就不是标准了.(90%以上的SQL都是通用的)

数据库,通常是一个或一组文件,保存了一些符合特定规格的数据,数据库对应的英语单词是DataBase,简称:DB;
数据库软件称为数据库管理系统(DBMS),全称为DataBase Management System,如:Oracle、SQL Server、MySql、Sybase、informix、DB2、interbase、PostgreSql 。
总结:DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。

表(table)是一种结构化的文件,可以用来存储特定类型的数据,如:学生信息,课程信息,都可以放到表中。另外表都有特定的名称,而且不能重复。表中具有几个概念:列、行、主键。 列叫做字段(Column),行叫做表中的记录,每一个字段都有:字段名称/字段数据类型/字段约束/字段长度

数据查询语言(DQL-Data Query Language) 查询
代表关键字:select
数据操纵语言(DML-Data Manipulation Language) 对表数据增删改
代表关键字:insert,delete,update
数据定义语言(DDL-Data Definition Language) 对表结构的增删改
代表关键字:create ,drop,alter,
事务控制语言(TCL-Transactional Control Language)
代表关键字:commit ,rollback;
数据控制语言(DCL-Data Control Language)
代表关键字:grant,revoke.

常用命令

1 查看msyql版本
C:\Users\Administrator>mysql --version

2 创建数据库

  1. create database 数据库名称;
  2. use 数据库名称

3 查询当前使用的数据库
select database();

4 终止一条语句
如果想要终止一条正在编写的语句,可键入\c。

5 退出mysql
可使用\q、QUIT或EXIT;

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

7 初始化数据
mysql> source \文件路径

8 查看其他库中的表
show tables from ;

9 查看表的结构
desc

;

10 查看表的创建语句
show create table

;

简单的查询

1 查询员工姓名
select ename from emp;

2 查询多个字段
select empno, ename from emp;

3 查询全部字段
select * from emp;
在这里插入图片描述
4 将查询出来的字段显示为中文
select empno as ‘员工编号’, ename as ‘员工姓名’, sal*12 as ‘年薪’ from emp;
在这里插入图片描述

条件查询

等号操作符

1 查询薪水为5000的员工
select empno, ename, sal from emp where sal=5000;

2 查询job为MANAGER的员工
select empno, ename from emp where job=manager;

以上查询出现错误,因为job为字符串,所以出现了以上错误
select empno, ename from emp where job=‘MANAGER’;

注意:
MySQL在windows下是不区分大小写的,将script文件导入MySQL后表名也会自动转化为小写,结果再 想要将数据库导出放到linux服务器中使用时就出错了。因为在linux下表名区分大小写而找不到表,查了很多都是说在linux下更改MySQL的设置使其也不区分大小写,但是有没有办法反过来让windows 下大小写敏感呢。其实方法是一样的,相应的更改windows中MySQL的设置就行了。
具体操作:
在MySQL的配置文件my.ini中增加一行:
lower_case_table_names = 0
其中 0:区分大小写,1:不区分大小写
MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
   1、数据库名与表名是严格区分大小写的;
   2、表的别名是严格区分大小写的;
   3、列名与列的别名在所有的情况下均是忽略大小写的;
   4、变量名也是严格区分大小写的; MySQL在Windows下都不区分大小写

<>操作符

1 查询薪水不等于5000的员工
select empno, ename, sal from emp where sal <> 5000;

以下写法等同于以上写法,建议使用第一种写法
select empno, ename, sal from emp where sal != 5000;

2 查询工作岗位不等于MANAGER的员工
select empno, ename from emp where job <> ‘MANAGER’;

between … and …操作符

1 查询薪水为1600到3000的员工(第一种方式,采用>=和<=)
select empno, ename, sal from emp where sal >= 1600 and sal <= 3000;

2 查询薪水为1600到3000的员工(第一种方式,采用between … and …)
select empno, ename, sal from emp where sal between 1600 and 3000;

关于between … and …,它是包含最大值和最小值的

is null

Null为空,但不是空串,为null可以设置这个字段不填值,如果查询为null的字段,采用is null
1 查询津贴为空的员工
因为null类型比较特殊,必须使用 is来比较
select * from emp where comm is null;

and

and表示并且的含义,表示所有的条件必须满足
工作岗位为MANAGER,薪水大于2500的员工
select * from emp where job=‘MANAGER’ and sal > 2500;

or

or,只要满足条件即可,相当于包含
查询出job为manager或者job为salesman的员工
select * from emp where job=‘MANAGER’ or job=‘SALESMAN’;

表达式的优先级

查询薪水大于1800,并且部门代码为20或30的员工(错误的写法)
select * from emp where sal > 1800 and deptno = 20 or deptno = 30;

以上输出不是预期结果,薪水小于1800的数据也被查询上来了,原因是表达式的优先级导致的,首先过滤sal > 1800 and deptno = 20,然后再将deptno = 30员工合并过来,所以是不对的
询薪水大于1800,并且部门代码为20或30的(正确的写法)
select * from emp where sal > 1800 and (deptno = 20 or deptno = 30);

关于运算符的问题:不用记,没有把握尽量采用括号

in

in表示包含的意思,完全可以采用or来表示,采用in会更简洁一些
查询出job为manager或者job为salesman的员工
select * from emp where job in (‘manager’,‘salesman’);

查询出薪水包含1600和薪水包含3000的员工 in不表示区间
select * from emp where sal in(1600, 3000);

not

查询出薪水不包含1600和薪水不包含3000的员工(第一种写法)
select * from emp where sal <> 1600 and sal <> 3000;

查询出薪水不包含1600和薪水不包含3000的员工(第二种写法
select * from emp where not (sal = 1600 or sal = 3000);

查询出薪水不包含1600和薪水不包含3000的员工(第三种写法)
select * from emp where sal not in (1600, 3000);

查询出津贴不为null的所有员工
select * from emp where comm is not null;

like

Like可以实现模糊查询,like支持%和下划线匹配
查询姓名以M开头所有的员工
select * from emp where ename like ‘M%’;

查询姓名以N结尾的所有的员工
select * from emp where ename like ‘%N’;

查询姓名中包含O的所有的员工
select * from emp where ename like ‘%O%’;

查询姓名中第二个字符为A的所有员工
select * from emp where ename like ‘_A%’;
Like中%和下划线的差别?
%匹配任意字符出现的个数
下划线只匹配一个字符
Like 中的表达式必须放到单引号中|双引号中,以下写法是错误的:
select * from emp where ename like _A%

(在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_)
%代表任意多个字符,_代表任意1个字符。
特殊:查询名字里带_的
select name from t_user where name like ‘%_%’; \是转义字符

排序

排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序,如果存在where子句那么order by必须放到where语句的后面

注意:默认是升序。怎么指定升序或者降序呢?asc表示升序,desc表示降序。
select ename , sal from emp order by sal; // 升序
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 desc;
select ename,sal from emp order by sal desc , ename asc;
注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。

找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列。
select
ename,job,sal
from
emp
where
job = ‘SALESMAN’
order by
sal desc;

分组函数

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

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

找出工资总和?
select sum(sal) from emp;
找出最高工资?
select max(sal) from emp;
找出最低工资?
select min(sal) from emp;
找出平均工资?
select avg(sal) from emp;
找出总人数?
select count(*) from emp;
select count(ename) from emp;

分组函数一共5个。
分组函数还有另一个名字:多行处理函数。
多行处理函数的特点:输入多行,最终输出的结果是1行。

分组函数自动忽略NULL。
	select count(comm) from emp;
	+-------------+
	| count(comm) |
	+-------------+
	|           4 |
	+-------------+

	select sum(comm) from emp;
	+-----------+
	| sum(comm) |
	+-----------+
	|   2200.00 |
	+-----------+

	select sum(comm) from emp where comm is not null; // 不需要额外添加这个过滤条件。sum函数自动忽略NULL。

	找出工资高于平均工资的员工?
		select avg(sal) from emp; // 平均工资
		+-------------+
		| avg(sal)    |
		+-------------+
		| 2073.214286 |
		+-------------+

		select ename,sal from emp where sal > avg(sal); //ERROR 1111 (HY000): Invalid use of group function
		思考以上的错误信息:无效的使用了分组函数?
			原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中。why????
			怎么解释?
				因为group by是在where执行之后才会执行的。
			
			select		5
				..			
			from			1
				..
			where			2
				..
			group by		3
				..
			having		4
				..
			order by		6
				..

count(*)和count(具体的某个字段),他们有什么区别?
count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(comm): 表示统计comm字段中不为NULL的数据总数量。

分组函数也能组合起来用:
	select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;

	+----------+----------+-------------+----------+----------+
	| count(*) | sum(sal) | avg(sal)    | max(sal) | min(sal) |
	+----------+----------+-------------+----------+----------+
	|       14 | 29025.00 | 2073.214286 |  5000.00 |   800.00 |
	+----------+----------+-------------+----------+----------+

找出工资高于平均工资的员工?
	第一步:找出平均工资
		select avg(sal) from emp;
		+-------------+
		| avg(sal)    |
		+-------------+
		| 2073.214286 |
		+-------------+
	第二步:找出高于平均工资的员工
		select ename,sal from emp where sal > 2073.214286;
		+-------+---------+
		| ename | sal     |
		+-------+---------+
		| JONES | 2975.00 |
		| BLAKE | 2850.00 |
		| CLARK | 2450.00 |
		| SCOTT | 3000.00 |
		| KING  | 5000.00 |
		| FORD  | 3000.00 |
		+-------+---------+

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

单行处理函数

什么是单行处理函数?
输入一行,输出一行。

计算每个员工的年薪?
select ename,(sal+comm)*12 as yearsal from emp;
重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。
使用ifnull函数:
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;

ifnull() 空处理函数?
ifnull(可能为NULL的数据,被当做0处理) : 属于单行处理函数。
select ename,ifnull(comm,0) as comm from emp;
在这里插入图片描述

分组查询

group by 和 having
group by : 按照某个字段或者某些字段进行分组。
having : having是对分组之后的数据进行再次过滤。

案例:找出每个工作岗位的最高薪资。
select max(sal),job from emp group by job;

+----------+-----------+
| max(sal) | job       |
+----------+-----------+
|  3000.00 | ANALYST   |
|  1300.00 | CLERK     |
|  2975.00 | MANAGER   |
|  5000.00 | PRESIDENT |
|  1600.00 | SALESMAN  |
+----------+-----------+



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

select ename,max(sal),job from emp group by job;
以上在mysql当中,查询结果是有的,但是结果没有意义,在Oracle数据库当中会报错。语法错误。
Oracle的语法规则比MySQL语法规则严谨。
记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。

每个工作岗位的平均薪资?
	select job,avg(sal) from emp group by job;
	+-----------+-------------+
	| job       | avg(sal)    |
	+-----------+-------------+
	| ANALYST   | 3000.000000 |
	| CLERK     | 1037.500000 |
	| MANAGER   | 2758.333333 |
	| PRESIDENT | 5000.000000 |
	| SALESMAN  | 1400.000000 |
	+-----------+-------------+

多个字段能不能联合起来一块分组?
案例:找出每个部门不同工作岗位的最高薪资。
	select 
		deptno,job,max(sal)
	from
		emp
	group by
		deptno,job;

找出每个部门的最高薪资,要求显示薪资大于2900的数据。

	第一步:找出每个部门的最高薪资
	select max(sal),deptno from emp group by deptno;
	+----------+--------+
	| max(sal) | deptno |
	+----------+--------+
	|  5000.00 |     10 |
	|  3000.00 |     20 |
	|  2850.00 |     30 |
	+----------+--------+

	第二步:找出薪资大于2900
	select max(sal),deptno from emp group by deptno having max(sal) > 2900; // 这种方式效率低。
	+----------+--------+
	| max(sal) | deptno |
	+----------+--------+
	|  5000.00 |     10 |
	|  3000.00 |     20 |
	+----------+--------+

	select max(sal),deptno from emp where sal > 2900 group by deptno;  // 效率较高,建议能够使用where过滤的尽量使用where。
	+----------+--------+
	| max(sal) | deptno |
	+----------+--------+
	|  5000.00 |     10 |
	|  3000.00 |     20 |
	+----------+--------+

找出每个部门的平均薪资,要求显示薪资大于2000的数据。

第一步:找出每个部门的平均薪资
select deptno,avg(sal) from emp group by deptno;
+--------+-------------+
| deptno | avg(sal)    |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
|     30 | 1566.666667 |
+--------+-------------+

第二步:要求显示薪资大于2000的数据
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;	
+--------+-------------+
| deptno | avg(sal)    |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
+--------+-------------+

where后面不能使用分组函数:
	select deptno,avg(sal) from emp where avg(sal) > 2000 group by deptno;	// 错误了。
	这种情况只能使用having过滤。

select语句总结

select 5

from 1

where 2

group by 3

having 4

order by 6

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 是一种开源的关系型数据库管理系统,用于存储和管理大量数据。下面是一个简单的 MySQL 基础教程: 1. 安装 MySQL:首先,你需要下载和安装 MySQL。你可以从 MySQL 官方网站(https://www.mysql.com/)上下载适合你操作系统的安装程序,并按照安装向导进行安装。 2. 启动和连接 MySQL:安装完成后,你可以启动 MySQL 服务器。在命令行输入 `mysql -u 用户名 -p`,然后输入密码以连接到 MySQL。 3. 创建数据库:使用 `CREATE DATABASE 数据库名;` 语句创建一个新的数据库。例如,`CREATE DATABASE mydatabase;` 将创建一个名为 "mydatabase" 的数据库。 4. 使用数据库:使用 `USE 数据库名;` 语句选择要使用的数据库。例如,`USE mydatabase;` 将选择名为 "mydatabase" 的数据库作为当前数据库。 5. 创建表:在选定的数据库使用 `CREATE TABLE 表名 (列1 数据类型, 列2 数据类型, ...);` 语句创建一个新的表。例如,`CREATE TABLE customers (id INT, name VARCHAR(50), email VARCHAR(50));` 将创建一个名为 "customers" 的表,包含 id、name 和 email 列。 6. 插入数据:使用 `INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);` 语句向表插入数据。例如,`INSERT INTO customers (id, name, email) VALUES (1, 'John Doe', 'john@example.com');` 将向 "customers" 表插入一条数据。 7. 查询数据:使用 `SELECT 列1, 列2, ... FROM 表名;` 语句从表查询数据。例如,`SELECT id, name, email FROM customers;` 将返回 "customers" 表的所有数据。 8. 更新数据:使用 `UPDATE 表名 SET 列 = 值 WHERE 条件;` 语句更新表的数据。例如,`UPDATE customers SET email = 'newemail@example.com' WHERE id = 1;` 将更新 "customers" 表 id 为 1 的数据的 email 列。 9. 删除数据:使用 `DELETE FROM 表名 WHERE 条件;` 语句删除表的数据。例如,`DELETE FROM customers WHERE id = 1;` 将删除 "customers" 表 id 为 1 的数据。 这只是 MySQL基础教程,还有很多其他功能和语法可以学习。你可以参考官方文档或其他教程来深入学***

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值