sql、DB、DBMS分别是什么,他们之间的关系?
DB:
DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)
DBMS:
DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer...)
SQL:
结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。
SQL属于高级语言。只要能看懂英语单词的,写出来的sql语句,可以读懂什么意思。
SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)
DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
DBMS -(执行)-> SQL -(操作)-> DB
DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
DDL(数据定义语言):create drop alter,对表结构的增删改。主要有create、delete、update和select。
TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)
DCL(数据控制语言): grant授权、revoke撤销权限等。
查询所有数据库
show databases;
创建数据库
create database dbname;
使用数据库
use dbname;
查询所有数据表
show tables;
删除数据库
drop database dbname;
初始化数据
source D:\course\MySQL\resources\xx.sql
创建表
create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));
删除表
drop table tablename;
desc emp;
desc命令可以查看表定义,但是信息还是不够全面。
show create table emp;
可以看到SQL语句中,这样处理可以看到表定义意外,还可以看到表的engine(存储引擎)
以上部分语句可在数据库可视化编程软件上实现,以下部分才是重点!!!
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
条件查询:均以上表为例
语法格式:
select
字段,字段...
from
表名
where
条件;
e.g.
找出每个人的薪资
select ename,sal * 12 as '年薪' from emp;
找出哪些人津贴不为NULL?
select ename,sal,comm from emp where comm is not null;
注:between.. and.. 是闭区间
and和or联合起来用(and可以理解为并且;or可以理解成或):找出薪资大于1000的并且部门编号是20或30部门的员工。
select ename,sal,deptno from emp where sal > 1000 and deptno = 20 or deptno = 30; // 错误的
select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30); // 正确的。
注意:当运算符的优先级不确定的时候加小括号。
in等同于or:找出工作岗位是MANAGER和SALESMAN的员工?
select ename,job from emp where job = 'SALESMAN' or job = 'MANAGER';
select ename,job from emp where job in('SALESMAN', 'MANAGER');
select ename,job from emp where sal in(800, 5000); // in后面的值不是区间,是具体的值。
not in: 不在这几个值当中。
select ename,job from emp where sal not in(800, 5000);
查询结果集去重:
mysql> select distinct job from emp; // distinct关键字去除重复记录
注意:distinct只能出现在所有字段的最前面!
错误语句:mysql> select ename,distinct job from emp;
模糊查询:%代表任意多个字符,_代表任意1个字符。
一个字母是T的?
select ename from emp where ename like '%T';
找出名字中含有O的:
select ename from emp where ename like '%O%';
找出名字中第二个字母是A的:
select ename from emp where ename like '_A%';
找出名字中有下划线的:
select name from t_user where name like '%_%';
排序:
语法(注意顺序不能变):
按照工资升序,找出员工名和薪资?
select
ename,sal
from
emp
order by
sal;
注意:默认是升序。怎么指定升序或者降序呢?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,ename asc;
分组函数:
分组函数顾名思义,就是对某一组数据进行操作,也叫多行处理函数。分组函数特征是输入多行,输出一行,并且自动忽略NULL。
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
select ename,sal from emp where sal > avg(sal); //ERROR 1111 (HY000): Invalid use of group function
注意:报错!因为分组函数不可以直接使用在where语句当中,group by在where之后执行
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
count(*)和count(具体的某个字段),他们有什么区别?
count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(comm): 表示统计comm字段中不为NULL的数据总数量。
单行处理函数:
ifnull() 空处理函数?
ifnull(可能为NULL的数据,被当做什么处理) : 属于单行处理函数。
计算每个员工的年薪?
select ename,(sal+comm)*12 as yearsal from emp;
重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。
使用ifnull函数:
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
注意:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。
group by和having:
group by : 按照某个字段或者某些字段进行分组。
having : having是对分组之后的数据进行再次过滤。
注意:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。
连接查询:在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果。
连接查询分类:
根据表的连接方式来划分,包括:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接(左连接)
右外连接(右连接)
笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。
表的别名:
select e.ename,d.dname from emp e,dept d;
表的别名有什么好处?
第一:执行效率高。
第二:可读性好。
SQL99:(常用的)
select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
倘若后续还需要添加条件再写where
外连接:(右外连接/右连接)左连接与右连接可以互换,左连接左边为主表,右连接反之。
select
a.ename '员工', b.ename '领导'
from
emp b
right join
emp a
on
a.mgr = b.empno;