MySQL的学习之旅
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的学习之旅相关的知识,希望对你有一定的参考价值。
mysql学习笔记
DB Basic
- DB:存储数据的仓库DBMS:
- 数据库管理系统(database Management System)
- SQL: 结构化查询语言
- MySQL服务的启动和停止: net start mysql55
- MySQL登录: mysql -u用户名 -p密码
- 登录远端服务器: mysql -hlocalhost -P3306 -uroot -proot
- 命令行命令:- exit : 退出mysql / ctrl + C
- show databases : 显示数据库
- use name :使用数据库
- show tables from database : 显示数据库中的表
- select database() : 展示当前使用的数据库
- desc 表名 : 查看表结构
- set names utf8 : 设置编码
- #注释
- – 空格 注释
- / * 多行注释 * /
- 候选码:某一属性组唯一的标识一个元组,而其子集不能。
- 除:得到的是被除数去掉公共属性列后剩余的列
概念模型
- 实体: 客观存在且相互区别的事物称为实体,如:人、事、物,也可以是抽象的概念
- 属性:实体所具有的某种特性
- **码:**唯一标识实体的属性集
- 实体型:实体名及其属性集合来抽象和刻画同类实体(学生(学号,姓名,性别…))
- 实体之间1对1,1对n,多对多
- 概念模型的表示方法
E-R图
实体型:矩形
属性:椭圆
联系:菱形(表上联系的类型写在无向边的一侧)
关系模型
- 关系:一个关系代表一张表
- 元组:表中一行
- 属性:表中一列
- 码:表中的某一个属性组,可以唯一确定一个元组
- 域:一组具有相同数据类型的值的集合
- 分量:元组中的一个属性值
关系完整性
实体完整性
参照完整性
定义完整性
数据库的三级模式
外模式-模式-内模式
模式
称为逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图,不涉及数据的物理存储和硬件环境,又与具体的应用层无关
外模式
称为子模式或用户模式,保证数据库完全性,用户只能看见和访问所对应的外模式中的数据
内模式
存储模式
外模式/模式映像: 保证数据的逻辑独立性
模式/内模式映像: 保证数据的物理独立性
SQL分类
- SQL语句可以单行或多行书写,以分号结尾;
- 可以用空格和缩进来来增强语句的可读性;
- 关键字不区别大小写,建议使用大写;
DML
(data manipulation language):它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
- DML
2-1、DML的概述
DML(Data Manipulation Language 数据操控语言)用于操作数据库对象中包含的数据,也就是说操作的单位是记录。
2-2、DML的主要语句(操作)
Insert语句:向数据表张插入一条记录。
Delete语句:删除数据表中的一条或多条记录,也可以删除数据表中的所有记录,但是,它的操作对象仍是记录。
Update语句:用于修改已存在表中的记录的内容。
2-3、DML的操作对象——记录
2-3-1、注意
当我们对记录进行Insert、Delete和Update操作的时候,一定要注意,一定要清楚DDL对其的一些操作。
DDL
- (data definition language):DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
- DDL(Data Definition Language 数据定义语言)用于操作对象和对象的属性,这种对象包括数据库本身,以及数据库对象,像:表、视图等等,DDL对这些对象和属性的管理和定义具体表现在Create、Drop和Alter上。特别注意:DDL操作的“对象”的概念,对象包括对象及对象的属性,而且对象最小也比记录大个层次。以表举例:Create创建数据表,Alter可以更改该表的字段,Drop可以删除这个表,从这里我们可以看到,DDL所站的高度,他不会对具体的数据进行操作。
- 1-2、DDL的主要语句(操作)
Create语句:可以创建数据库和数据库的一些对象。 Drop语句:可以删除数据表、索引、触发程序、条件约束以及数据表的权限等。
Alter语句:修改数据表定义及属性。 - 1-3、DDL的操作对象(表)
1-3-1、表的概念
表的创建就是用来存放数据用的,由于我们存放的数据的不通,所以我们需要定义些数据类型,以方便管理。
1-3-2、表的属性
主键属性:主键就是主键约束,只不过起的名字不同了,主键的起名偏向于虚的(就是描述描述这件事),主键约束起名偏向于实得(就是描述操作的实施),描述的都是同一件事,主键约束就是表中的一个属性;在一个表中最多可以有一个主键;一个主键可以定义在一个或多个字段;主键使一个或多个字段的值必须唯一且不为空,这样做可以通过该字段或该组字段中的值唯一的代表一条记录。
唯一属性:一个表中只能有一个主键属性,为了方表用户,提出唯一约束;唯一约束可以定义在一个或多个字段上;唯一约束使该字段或该组字段中的值唯一,可以为空,但是,不能重复。
**外键属性:**又叫外键,又叫外键约束,跟主键和主键约束的关系是一样的;外键约束针对的两个表,如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表,但要注意,必须要计算机要知道你是这种关系。
核查、Null和缺省属性:核查属性又叫核查约束,Null属性又叫Null约束,缺省属性又叫缺省约束;这些名称是描述一件事,描述一种情况,这件事或这张情况我们当然可以人为的那样特意做(输入数据是注意就行),但是,他们的本意是实现自动化,也就是让计算机做这件事。
(你知道为什么建立主键和唯一约束的时候,会自动的创建索引吗?而且是唯一索引,想一想索引大多在那些字段上用,以及索引的作用就会知道了。像主键约束、唯一约束、非空约束、外键约束、核查约束和缺省约束这些操作都是使表具有某些特性,所以在这里我认为他们都是表的属性。)
数据库更名
1. MySQL数据库更名的方法:
* RENAME database olddbname To newdbname -- 5.17-5.1.23可以使用,容易丢失数据,官方不推荐
* 创建需要改成新名的数据库。
* mysqldum 导出要改名的数据库
* 删除原来的旧库(确定是否真的需要)
* 当然这种方法虽然安全,但是如果数据量大,会比较耗时
* 使用脚本:
#!/bin/bash
# 假设将sakila数据库名改为new_sakila
# MyISAM直接更改数据库目录下的文件即可
mysql -uroot -p123456 -e 'create database if not exists new_sakila'list_table=$(mysql -uroot -p123456 -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='sakila'")
for table in $list_table
do mysql -uroot -p123456 -e "rename table sakila.$table to new_sakila.$table"done
数据库创建
CREATE DATABASE DBname;
CREATE DATABASE IF NOT EXISTS stuDB;
CREATE SCHEMA 模式名 AUTHORIZATION 用户名
数据库删除
-
drop 命令删除数据库
* drop 命令格式:drop database ; * drop DATABASE IF EXISTS stuDB; * 例如删除名为 RUNOOB 的数据库:mysql> drop database RUNOOB;
-
使用 mysqladmin 删除数据库
- 你也可以使用 mysql mysqladmin 命令在终端来执行删除命令。
- 以下实例删除数据库 RUNOOB(该数据库在前一章节已创建):[root@host]# mysqladmin -u root -p drop RUNOOB
- Enter password:******
- 执行以上删除数据库命令后,会出现一个提示框,来确认是否真的删除数据库:Dropping the database is potentially a very bad thing to do.
- Any data stored in the database will be destroyed.
- Do you really want to drop the ‘RUNOOB’ database [y/N] y
- Database “RUNOOB” dropped
-
DROP SCHEMA CASCADE|RESTRICT
CASCADE:将数据库对象的全部删除
RESTRICT:如果数据库定义了下属的数据库对象,则拒绝删除
创建表
create table 表名(
字段名 字段类型 字段约束
表级完整性约束
);
create table student(
sno int primary key auto_increment, -- 主键自增长的
sname varchar(30) not null,
gender char,
age int(2),
score float(3, 1) -- 浮点数,总共三位,保留一位小数
insertTime timestamp -- 时间戳) char : 一个字符如性别
修改表
语法:ALTER TABLE 表名 ADD | MODIFY|CHANGE|DROP COLUMN 字段名 字段类型 [字段约束]
修改表名
ALTER TABLE STUINFO RENAME TO STU;
添加字段
alter table 表名 add column email varchar(20)
alter table students ADD COLUMN borndate TIMESTAMP NOT NULL;
修改字段名
alter table students change COLUMN borndate birthday DATETIME NULL;
修改字段类型
ALTER TABLE students MODIFY COLUMN birthday TIMEStAMP;
删除字段
ALTER TABLE students DROP COLUMN birthday;
插入数据
insert into student(sname, age, score)
values(%s, %s, %s) DECIMAL(7,2),# 7位小数保留2位
hiredate Date, 插入时间
查询数据
select * from student where age=19
修改数据
update student set sname=%s where sno=%s
删除数据
delete from student where sname=%s
删除表
DROP TABLE IF EXISTS Student
一、SQL中的语法
1、drop table 表名称 eg: drop table dbo.Sys_Test
2、truncate table 表名称 eg: truncate table dbo.Sys_Test
3、delete from 表名称 where 列名称 = 值 eg: delete from dbo.Sys_Test where test='test'
二、drop,truncate,delete区别
1、drop (删除表):删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。 drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
2、truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构)。与drop不同的是,只是清空表数据而已。 注意:truncate 不能删除行数据,要删就要把表清空。
3、delete (删除表中的数据):delete 语句用于删除表中的行。delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。 truncate与不带where的delete :只删除数据,而不删除表的结构(定义)
4、truncate table 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用delete。如果要删除表定义及其数据,请使用 drop table 语句。
5、对于由foreign key约束引用的表,不能使用truncate table ,而应使用不带where子句的delete语句。由于truncate table 记录在日志中,所以它不能激活触发器。
6、执行速度,一般来说: drop> truncate > delete。
7、delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。
truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。
复制表
仅复制表结构
CREATE TABLE newTable2 LIKE major;
复制表结构+数据
CREATE TABLE newTable3 SELECT * FROM girls.beauty;
复制某一些字段
CREATE TABLE emp
SELECT lastname, department_id, salary
FROM employee
WHERE 1=2; -- 恒为假
DCL
(Data Control Language):是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
- 3、DCL
3-1、DCL的概述
DCL(Data Control Language 数据控制语句)的操作是数据库对象的权限,这些操作的确定使数据更加的安全。
3-2、DCL的主要语句(操作)
Grant语句:允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限。
Revoke语句:可以废除某用户或某组或所有用户访问权限
3-3、DCL的操作对象(用户)
此时的用户指的是数据库用户。
TCL
(Transaction Control Language)
DQL
(Data Query Language) : 数据查询语言DQL就是数据查询语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
语法
- SELECT
selection_list /要查询的列名称/ - FROM
table_list /要查询的表名称/ - WHERE
condition /行条件/ - GROUP BY
grouping_columns /对结果分组/ - HAVING
condition /分组后的行条件/ - ORDER BY
sorting_columns /对结果分组/ - LIMIT
offset_start, row_count /结果限定/
CREATE TABLE emp(
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm decimal(7,2),
deptno INT) ;
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
基础查询
select 查询列表 from 表名;
特点
1,查询的结果集 是一个虚拟表。
2,select 查询列表,可以有多个部分组成,中间用逗号隔开。
如:select 字段1,字段2 from 表;
3,执行顺序
1,from 字句 2,select字句
- 一,查询常量
select 100; – 打印 - 二、查询表达式
select 100%3; - 三、查询单个字段
select firstname fromemployee
; – 着重号 - 四、查询多个字段
select lastname,email, from 表名;
改变顺序手动写字段
F12:自动换行对齐格式 - 五、查询所有字段
select * from 表名; - 六、查询函数(调用函数获取返回值)
select Database(); 获取当前数据库
select VERSION(); 获取当前版本
select User(); 获取当前用户 - 七、起别名:
方式一:使用as
SELECT USER() as 用户名;
SELECT USER() as ‘用户名’;
方式二:使用空格
SELECT USER() 用户名;
SELECT USER() ‘用户名’; - 八、需求查询两列合并一列
Java中+号作用:
1,加法运算
100+1.5 ‘a’+2
2,拼接符
至少一个操作数是字符串
mysql中+号作用:
1,加法作用
两个操作数都是数值型
其中一个操作数是字符型
将字符型强制转化为数值型,无法转换则当做0处理
其中一个null 结果是null
2,使用 concat 拼接函数
select CONCAT(firstname, lastname)AS “姓名” from employee;
select CONCAT(employee_id, ',', firstname, ',', lastname)as "output" from employee
IFNULL(commission, '空'):如果不为空则正常显示,为空则显示表达式2
- 九、distinct的使用
去重
select department_id from employee;
- 十、查看表结构
desc 表名 : 查看表结构
show column from employee;
条件查询
select 查询列表
from 表名
where 筛选条件
执行顺序:
1,from子句
2,where子句
3,select子句
特点:
1,按关系表达式筛选 关系运算符: > < >= <= <>(不等于)
2,按逻辑表达式筛选 and or not
3,模糊查询
like
**功能:**一般和通配符搭配使用,对字符数据进行部分匹配查询
常见的通配符:
_ :任意单个字符
% :任意多个字符,支持 0-n个
案例一: 查询姓名中包含字符a的员工信息
select * from employee where lastname Like '%a%';
案例二:查询姓名中包含最后一个字符a的员工信息
select * from employee where lastname Like '%a';
案例三:查询姓名中包含第三个字符a的员工信息
select * from employee where lastname Like '___a%';
案例四:查询姓名中包含第二个字符a的员工信息
select * from employee where lastname Like ‘__%’; 设置任意字符为转义字符:
select * from employee where lastname Like '_$_a%' ESCAPE '$'
;
in
功能:查询某字段的值是否属于指定列表之内
a in (常量值1,常量值2,常量值3,…)
- 案例1:查询部门编号是30/50/90的员工名,部门编号
方式1:
select lastname, department_id from employee where department_id IN (30, 50, 90)
方式2:
select lastname, department from employee where department_id = 30 or department_id = 50 OR department_id = 90;
- 案例2:查询部门编号是30/50/90的员工名,部门编号
方式1:
select * from employee where job_id NOT IN(‘shad’, 'asda) 方式2:select * from employee where NOT (job_id=‘as’ OR job_id=‘adad’)
between and
功能:查询某个字段的值是否介于xx之间
如:select department_id, lastname from department where id BETWEEN 30 AND 90 = select department_id, lastname from department where id >=30 AND id <= 90
如:查询年薪不是10000-20000之间的员工的姓名、工资、年薪
select lastname, salary, salary * 12 * (1+ IFNULL(commission, 0) AS 年薪 from employee where salary * 12 * (1+ IFNULL(commission, 0)> 10000 or salary * 12 * (1+ IFNULL(commission, 0) < 20000
select lastname, salary, salary * 12 * (1+ IFNULL(commission, 0) AS 年薪 from employee where salary * 12 * (1+ IFNULL(commission, 0)BETWEEN 10000 AND 20000
is null
功能: 判断字段是否为空
如:select * from employee where commission IS NULL;
= :只判断内容
IS:判断null
<=>:安全等于,即判断内容又判断null
ORDER BY
排序列表
执行列表:
1,from 子句
2,where子句
3,select子句
4,order by子句
如:selcet last_name, salary from employee where salary > 20000 order by salary; select last_name, salary from employee where id >120 order by salary DESC;
对有奖金的员工按降序排:
selcet *, salary*12*(1+IF NULL (commission, 0) "年薪" from employee where commission IS NOT NULL ORDER BY 年薪 DESC;
按姓名长度进行升序:
selcet lastname from employee ORDER BY length(lastname)
查询员工的姓名。工资。部门编号,先按工资升序,部门编号降序
selcet lastname, salary, department_id from employee ORDER BY SALARY, department_id DESC;
按列数排序:
select * from employee ORDER BY 2 ; = select * from employee ORDER BY first_name ;
特点:
1,排序列表可以是单个字段,多个字段,表达式,函数,列数,以及以上的组合
2,升序:通过 asc 默认
3,降序:通过 desc
字符函数
1. CONCAT 拼接函数
select CONCAT(‘hello,', first, last)备注 FROM employee;
2. LENGTH 获取字节长度
select LENGTH('hello,朱帅');
3. CHAR_LENGTH 字符长度
selcet CHAR_LENGTH('hello,朱帅');
4. SUBSTR 截取字符串
起始索引从1开始
substr(str, 起始索引,截取的字符长度); substr(str, 起始索引); 获取所有的 select SUBSTR('朱帅爱杨柳', 1, 3);
5. INSTR获取字符第一次出现的索引
select INSTR('朱帅朱帅朱帅', '朱帅')
6. TRIM去前后空格 select TRIM(' zszs zs ') as 啊; select TRIM(' xxx','xxxx zs xxxx') as zs;
7. LPAD/RPAD 左填充,右填充
select LPAD('朱帅', 10, 'a'); 以a填充10个字符
select RPAD('朱帅', 10, 'a'); 以a填充10个字符
8. UPPER/LOWER 变大写 变小写
1. 查询员工表的姓名,要求格式:姓首字母大写, 其他字符小写, 名所有字符大写,且姓名和名用_分割
2. select UPPER(substr(first_name, 1, 1), firstname from employee;
3. select CONCAT(UPPER(SUBSTR(first_name, 1, 1), Lower(SUBSTR(first_name, 2), '_',UPPER(lastname)) "OUTPUT" from employee;
9. STRCMP() 比较两个字符大小
1. select STRCMP('aec', 'aec');
10. LEFT/RIGHT 截取子串
1. select LEFT('猪猪猪', 1) : 从左边截取子串
数学函数
1. ABS 绝对值 select ABS(-2.4);
2. CEIL 向上取整 select CEIL(1.09); 返回 >= 该参数的最小整数
3. FLOOR 向下取整
4. ROUND 四舍五入 select ROUND(1.843);
5. TRUNCATE 截断 select TRUNCATE(1.8231, 1);
6. MOD 取余 select MOD(-10, 3); a % b = a - a / b * b 绝对值的取模
日期函数
1. now() :select now();
2. CURDATE() : 当前年月日
3. CURTIME() : 获取当前时间
4. DATEDIFF:获取时间差 select DATADIFF('1998-1217')
5. DATE_FORMAT select DATE_FORMAT('1998-7-16','%Y年%m月%d日 %H小时%i分钟%s秒') 出生日期;
6. STR_TODATE 按指定格式解析字符串为日期类型 select * from employee WHERE hiredate < STR_TO_DATE('3/15 1998', '%m/%d %Y);
7. year(date)
8. month(date)
流程控制函数
1. IF函数 select IF(100 > 9: ‘好’,'坏')
需求:如果有奖金,则实现奖金,如果没有,则显示0 select IF(commission IS NULL ,0 , salary * 12 * commission) 奖金, commission;
2. CASE函数
情况一:类似于switch语句,可以实现等值判断
CASE:表达式
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2 ........
ELSE 结果n
END
案例:SELECT department _id, salary,
CASE department_id
WHEN 30 THEN salary* 2
WHEN 50 THEN salary* 3
WHEN 60 THEN salary * 4
ELSE salary
END newsalary
FROM employee;
情况二:类似于多重IF语句,实现区间判断
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
.......
ELSE 结果n
END
案例:SELECT salary,
CASE
WHEN salary > 2000 THEN 'A'
WHEN salary > 1000 THEN 'B'
WHEN salary > 1000 THEN 'C'
ELSE 'D'
END grade
FROM employee;
案例:
1. 显示系统时间:(日期+时间)
select NOW();
2. 查询员工号,姓名,工资,以及工资提高百分之20的结果
select name, salary, salary * 1.2 "new salary" from employee;
3. 将员工姓名按首字母排序,并写出姓名的长度(length)
select LENGHT(name) 长度 from employee ORDER BY SUBSTR(name, 1, 1) ASC;
4. 拼接输出
select CONCAT(name, ' earns ', salary, ' monthly but wants ', salary * 3 ) "Dream salary" from employee;
5. 使用case When
selcet name , job_id,
CASE jod_id
WHEN 'AD' THEN 'A'
WHEN 'ST' THEN 'B'
WHEN 'IT' THEN 'C'
WHEN 'ST' THEN 'D'
END Grade
from employee;
常见的数据类型
- int:整型
- TINYINT SMALLINT INT BIGINT
- double(m ,n) / float:浮点类型,例如 double(5, 2),其中必须2位小数,即最大值 999.99;
- decimal(m ,n):浮点数,在表示钱方面使用该类型,因为不会出现精度损失
- char(n):n可选,固定长度固定长度字符串类型:char(4):0~255
- varchar:可变字符串长度类型
- text:字符串类型,表示存储较长文本
- blob:字节类型,存取图片数据
- date:日期类型,格式yyyy-MM-dd
- time:时间类型,格式:hh-mm:ss
- timestamp / datetime:时间戳类型;日期+时间yyyyMMdd hhmmss
常见约束
用于限制表中的字段数据的,从而进一步保证数据是一直的、准确的,可靠的!
- NOT NULL:非空:用于限制该字段为必填项
- DEFAULT:默认:用于限制该字段没有显式插入值,则直接显式默认值
- PRIMARY KEY:主键:用于限制该字段不能重复,设置
为主键的字段默认不能为空,一个表只能有一个主键,当然可以是组合键 - UNIQUE:唯一:用于限制该字段不能重复
- CHECK:检查:用于限制该字段必须满足的指定条件
CHECK (age BETWEEN 1 AND 100)
- FOREIGN KEY:外键:用于限制两个表的关系,要求外键列的值必须来自主表的关联列
要求:
1,主表的关联列和从表的关联列必须一致,意思一样,名称无要求
2,主表的关联列要求必须是主键
案列:
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE IF NOT EXISTS stuinfo (
stuid INT PRIMARY KEY, # 添加主键约束
stuname VARCHAR(20) UNIQUE NOT NULL, # 添加了唯一约束+非空
stugender char(1) DEFAULT '男',
email VARCHAR(20) NOT NULL,
age INT CHECK(age BETWEEN 1 AND 100), # 添加检查约束,mysql不支持
major INT,
CONSTRAINT stuinfo_major FOREIGN KEY (majorid) REFERENCES major(id) # 添加外键约束
)
分组函数
分组函数往往用于实现将一组数据统计计算,最终得到一个值,又称为聚合函数或统计函数
- sum(字段名) : 求和
select sum(salary) from employee; - avg(字段名) : 求平均数
- max(字段名):求最大值
- min(字段名):求最小值
- count() :求非空字段的值
select COUNT (salary) FROM employee WHERE salary > 2500;
count(*) : 查询行数 count (1) :结果集的行数
搭配distinct实现去重:
select COUNT(DISTINCT department_id) FROM employee;
- 特点:
- 1,实参的字段的类似,sum和avg只支持数值型,其他三个可以支持任意类型
- 2,这5个函数都忽略null
- 3,count可以支持以下参数
- count(字段):查询该字段的非空的个数
- count(*):查询结果集的行数
- count(1):查询结果集的行数
分组查询
语法:
select 查询列表
from 表名
where 筛选条件
group by 分组条件
having 分组后筛选
order by 排序列表
执行顺序:
1. from子句
2. where 子句
3. group by 子句
4. having 子句
5. select子句
6. order by子句
特点:
1. 查询列表往往是 分组函数和被分组的字段
2. 分组查询筛选分为两类
分组前筛选 原始表 关键字where 位置 group by 的前面
分组后筛选 分组后的结果集 having group by 的后面 where---group by ----having
分组函数做条件只能放在having后面!!!
案列:
1. 查询每个工种的平均工资
select AVG(salary), job_id FROM employee GROUP BY job_id;
2. 查询每个领导的手下人数
select Count(*), manager_id from employee WHERE manager_id IS NOT NULL GROUP BY manager_id
3. 查询邮箱中包含a的每个部门的最高工资
selcet Max(salary) ‘最高工资’from employee WHERE email LIKE '%a%' GROUP BY departmeny_id;
4. 查询每个领导手下有奖金的员工的平均工资
SELECT AVG(salary) 平均工资 , manager_id FROM employee WHERE commisson IS NOT NULL GROUP BY manager_id;
5. 查询哪个部门的员工个数>5
select COUNT(*) 员工个数, department_id FROM employee GROUP BY department_id HAVING COUNT(*) > 5;
6. 每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT job_id, MAX(salary) FROM employee WHERE commissoin IS NOT NULL GROUP BY job_id HAVING MAX(salary) > 12000;
7. 查询没有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序
select MAX(salary) ,job_id WHERE commission IS NULL GROUP BY job_id HAVING MAX(salary) > 6000 ORDER BY MAX(salary) ASC; 8.按照多个字段分组 select MIN(salary) 最低工资,job_id,department_id FROM employee GROUP BY job_id,deparment_id;
内连接
一、内连接等值连接
语法:
select 查询列表 from 表名1 别名1,表名2 别名2,… where 等值连接的连接条件特点:
1. 为了解决多表中的字段重名问题,往往为表起别名,提高语义性
2. 表的顺序无要求
案例
1。 查询员工名和部门名
select e.lastname, d.department_name FROM employee e, department d where e.deparment_id = d.department_id; 先执行from语句,起完别名
2. 查询部门编号>100的部门名所在的城市名 select department_name, city FROM department d, location l WHERE d.location_id = l.location_id AND d.department_id > 100;
3. 查询有奖金的员工名。部门名
select lastname,department_id FROM deparment d, employee e WHERE d.department_id = e.department_id AND e.commission_pct IS NOT NULL;
4. 查询城市名中第二个字符为o的部门名和城市名
select department_name, city FROM department d, location l WHERE d.location = l.location AND city LIKE '_o%';
5. 添加分组+筛选
查询每个城市的部门个数
select COUNT(*)部门个数,city FROM department d, location l WHERE d.location_id = l.location_id GROUP BY l.city;
6. 查询哪个部门的员工个数>5,并按员工个数进行降序
select department_name, COUNT(*) 格式 FROM employee e, department_id d WHERE e.department_id = d.department_id GROUP BY e.department_id HAVING COUNT(*) > 5 ORDER BY COUNT(*) DESC;
SQL99语法
一、内连接
语法:
SELECT 查询列表
FROM 表名 别名1
INNER JOIN 表名2 别名
ON 连接条件
WHERE 筛选条件
GROUP BY 分组列表
HAVING 分组后筛选
ORDER BY 排序列表
SQL99与SQL92区别
SQL99使用JOIN关键字代替之前的逗号,并将连接条件和筛选条件进行分离
案例:
1. 查询部门编号>100的部门名和所在的城市名
select department_name, city FROM department d JOIN location l ON d.location = l.location WHERE d.department_id > 100;
2. 查询每个城市的部门个数
select city, COUNT(*) FROM department d JOIN location l ON d.location_id = l.location_id GROUP BY l.city;
3. 查询部门中员工个数>10的部门名,并按员工个数降序
SELECT COUNT(*) 员工人数,department_name FROM employee e JOIN departments d ON e.department_id = d.department_id GROUP BY d.department_id HAVING 员工人数 > 0 ORDER BY员工个数 DESC;
二、非等值连接
4. 查询部门编号在10-90之间的员工的工资级别,并按级别进行分组
select COUNT(*) 个数 ,grade FROM employee e JOIN salary g ON e.salary BETWEEN g.minsalary AND g.maxsalary WHERE e.department_id BETWEEN 10 AND 90 GROUP BY g.grade;
三、自连接 查询员工名和对应的领导名 select e.lastname, m.lastname FROM employee e JOIN employee m ON e.manager_id = m.employee_id;测试:
1. 将日期只显示年份 : date_format(hiredate, '%Y')
year(hiredate) month(hiredate) day(hiredate) hour(hiredate)
1. 将当前日期显示成 年月日
select date_format(now(), '%Y年%m月%d日');
1. 查询所有男生的姓名、专业名和成绩
select stuname, majorname, score from stuinfo s, major m, result r where s.majorid = m.id and r.stuid = s.stuid and s.gender = '男'; select sutname, majorname, score from stuindo s JOIN major m ON s.majorid = m.id JOIN resut r on r.stuid = s.stuid where s.gender = '男';
1. 查询每个性别的每个专业的平均成绩,并按平均成绩降序
select AVG(score) 平均成绩, gender, s.majorid from stuinfo s JOIN result r ON s.stuid = r.stuid group by gender , s.majorid order by 平均成绩 desc;外连接 说明: 查询结果为主表中所有的记录,如果从表有匹配项,则显示匹配项,如果从表没有匹配项,则显示null 应用场景:一般用于查询主表中有但从表没有记录 特点: 1,外连接分主从表,两表的顺序不能任意调换 2,左连接的话,left join 左边为主表 3,右连接的话,right join 右边为主表 语法: select 查询列表 from以上是关于MySQL的学习之旅的主要内容,如果未能解决你的问题,请参考以下文章
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段
我的OpenGL学习进阶之旅NDK开发中find_library查找的系统动态库在哪里?
我的OpenGL学习进阶之旅NDK开发中find_library查找的系统动态库在哪里?
Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情