Mysql基础学习
2018-01-05 14:07
77 查看
MySql
1 概述
数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。(文件系统)。数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。
SQL:Structure Query Language。(结构化查询语言)
数据库的表名列名不能是关键字
2 SQL分类(4种)
2.1DDL**(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
CREATE、 ALTER、DROP
2.2
DML***(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
INSERT、 UPDATE、 DELETE
2.3
DQL***(Data Query Language):数据查询语言,用来查询记录(数据)。
SELECT
2.4
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
2.1 DDL
使用的关键字:CREATE、 ALTER、 DROP2.1.1操作库
创建库mydb1
create database mydb1;
展示所有数据库*
show databases;
查看服务器中的数据库,并把mydb2的字符集修改为utf8;
alter database mydb2
character set utf8;
删除mydb3库
drop database mydb3;
查看当前使用的数据库
select database();
2.1.2 操作表
创建表
create table 表名(
字段1 字段类型,
字段2 字段类型,
...
字段n 字段类型
);
常用数据类型:
int:整型
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
char:固定长度字符串类型; char(10) 'abc ' 256
varchar:可变长度字符串类型;varchar(10) 'abc' 65535
text:字符串类型;
blob:字节类型;
date:日期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值
datetime:日期时间类型 yyyy-MM-dd hh:mm:ss
当前数据库中的所有表*
SHOW TABLES;
表employee增加一个image列。
ALTER TABLE employee
ADD image
blob;
修改job列,使其长度为60。
ALTER TABLE employee
MODIFY job
varchar(60);
删除image列,一次只能删一列。
ALTER TABLE employee
DROP image;
表名改为user。
RENAME TABLE employee
TO user;
列名name修改为username
ALTER TABLE user
CHANGE name username
varchar(100);
删除表
DROP TABLE user ;
2.2 DML(重要)
使用关键字:INSERT 、UPDATE、 DELETE
在mysql中,字符串类型和日期类型都要用单引号括起来。'tom' '2015-09-04'
空值:null
2.2.1插入操作
INSERT INTO
语法: INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);
INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');
(2,'lisi','male','1995-5-10',10000,'2015-5-5','good boy');
2.2.2 修改操作 UPDATE
语法:UPDATE 表名SET 列名1=列值1,列名2=列值2 。。。
WHERE 列名=值
2.2.3 删除操作 DELETE
语法 :DELETE FROM 表名 【WHERE 列名=值】
删除表中名称为’zs’的记录。
DELETE FROM emp WHERE name=‘zs’;
删除表中所有记录。
DELETE FROM emp;
DELETE 删除表中的数据,表结构还在;删除后的数据可以找回
2.3 DQL操作(重要)
查询关键字:SELECT
DQL数据查询语言 (重要)
数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
查询返回的结果集是一张虚拟表。
语法:
SELECT 列名
FROM表名 【WHERE --> GROUP BY -->HAVING--> ORDER BY】
SELECT selection_list /要查询的列名称/
FROM table_list /要查询的表名称/
WHERE condition /行条件/
GROUP BY grouping_columns /对结果分组/
HAVING condition /分组后的行条件/
ORDER BY sorting_columns /对结果分组/
LIMIT offset_start, sizet /结果限定/
2.3.1基础查询
查询所有列
SELECT * FROM
stu;
查询指定列
SELECT sid, sname, age FROM stu;
2.3.2 条件查询
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
=、(!=、<>)<、<=、>、>=;
BETWEEN…AND;
IN(set);
IS NULL; IS NOT NULL
AND;
OR;
NOT;
1 查询性别为女,并且年龄小于50的记录
SELECT
* FROM stu WHERE gender='female'
AND age<50;
2 查询学号为S_1001,或者姓名为liSi的记录
SELECT * FROM stu
WHERE id ='S_1001'
OR name='liSi';
3 查询学号为S1001,S1002,S_1003的记录
SELECT
* FROM stu
WHERE id
IN ('S1001','S1002','S_1003');
4 查询年龄在20到40之间的学生记录
SELECT FROM stu
WHERE age>=20
AND age<=40;或者
SELECT FROM stu WHERE age
BETWEEN 20
AND 40;
2.3.3 模糊查询
使用关键字LIKE。
通配符: _ :任意一个字符 %:任意0~n个字符
1 查询姓名中第2个字母为“i”的学生记录
SELECT FROM stu WHERE sname LIKE '_i%' ;
2.3.4 字段控制查询(去重复)*****
1 查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用DISTINCT: SELECT
DISTINCT sal FROM emp
2 查看雇员的月薪与佣金之和
SELECT *,sal+comm FROM
emp
3 comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现 NULL。下面使用了把NULL转换成数值0的函数IFNULL"
SELECT
*,sal+IFNULL(comm,0)
FROM emp;
4 给列名添加别名
在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total:
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
给列起别名时,是可以省略AS关键字的:
SELECT *,sal+IFNULL(comm,0) total
FROM emp
2.3.5 排序(重要)
order by 列名 asc(默认升序) desc(降序) 查询所有学生记录,按年龄升序排序
SELECT FROM stu
ORDER BY sage
ASC;
或者
SELECT FROM stu
ORDER BY sage;
2.3.6 聚合函数
聚合函数 sum avg max min count 聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
COUNT
1 查询emp表中记录数:
SELECT COUNT(*)
AS cnt
FROM emp;
2 查询emp表中有佣金的人数:
SELECT
COUNT(comm) cnt
FROM emp;
3 查询emp表中月薪大于2500的人数:
SELECT COUNT(*)
FROM emp
WHERE sal > 2500;
SUM()
当需要纵向求和时使用sum()函数。
1 查询所有雇员月薪和:
SELECT SUM(sal)
FROM emp;
2 查询所有雇员月薪和,以及所有雇员佣金和:
SELECT SUM(sal),
SUM(comm)
FROM emp;
3 统计所有员工平均工资:
SELECT AVG(sal)
FROM emp;
4 查询最高工资和最低工资:
SELECT MAX(sal),
MIN(sal)
FROM emp;
2.3.7 分组查询
GROUP BY xx
根据xx分组
1 查询每个部门的部门编号和每个部门的工资和:
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno
2 查询每个部门的部门编号以及每个部门的人数:
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
3 查询每个部门的部门编号以及每个部门工资大于1500的人数:
SELECT deptno , COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;
HAVING子句
4 查询工资总和大于9000的部门编号以及工资和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;
having与where的区别:
1.having是在分组后对数据进行过滤.
where是在分组前对数据进行过滤
2.having后面可以使用聚合函数(统计函数)
where后面不可以使用聚合函数
select --- from--- where ---group by---having--- order by
sql语句的书写顺序: select * from 表名 where 条件 group by 列名 having 条件 order by 列名 asc/desc limit start,size 1.having和where比较 where 在分组前过滤, having在分组后过滤,可以加聚合函数(max,min,sum.count.avg),不能独立出现,必须分组后调用 2.sql执行顺序: from 表名 where 条件 group by 列名 having 条件 order by 列名 asc/desc limit start,size select 3.模糊查询 like %代表任意字符 _代表一个字符 ,如果like后的值是字符串一定要用单引号
2.3.8 LIMIT 方言
1 查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0, 5;
注意,起始行从0开始,即第一行开始
2 查询10行记录,起始行从3开始
SELECT * FROM emp LIMIT 3, 10;
2.4 分页操作(MySql方言)
分页公式 limit (当前第几页—1)*每页显示的行数 ,每页显示的行数
3 数据完整性
完整性的分类
> 实体完整性
> 域完整性
> 引用完整性
1 实体完整性
实体:即表中的一行(一条记录)代表一个实体(entity) 实体完整性的作用:标识每一行数据不重复。
约束类型: 主键约束(primary key)
唯一约束(unique)
自动增长列(auto_increment)
1.1 主键约束(primary key)
第一种添加方式: CREATE TABLE student(
Id int
primary key,
Name varchar(50)
);
第二种添加方式:此种方式优势在于,可以创建联合主键
CREATE TABLE student(
id int,
Name varchar(50),
Primary key(id)
);
CREATE TABLE student(
id int,
Name varchar(50),
Primary key(id,name)
//两个都是主键
);
第三种添加方式:
CREATE TABLE student(
Id int,
Name varchar(50)
);
ALTER TABLE student
ADD PRIMARY KEY (id);
1.2 唯一约束 (unique)
CREATE TABLE student( Id int primary key,
Name varchar(50)
unique
);
1.3 自动增长 (auto_increment)
给主键添加自动增长的数值,列只能是整数类型,但是如果删除之前增长的序号,后面再添加的时候序号不会重新开始,而是会接着被删除的那一列的序号
CREATE TABLE student(
Id int
primary key auto_increment,
Name varchar(50)
);
2 域完整性
域完整性约束:数据类型 非空约束(not null) 默认值约束(default)2.1 not null
CREATE TABLE student( Id int
pirmary key,
Name varchar(50)
not null,
Sex varchar(10)
);
2.2 default
CREATE TABLE student( Id int
pirmary key,
Name varchar(50)
not null,
Sex varchar(10)
default ‘男’
);
3 引用完整性
3.1主外键关联
要有外键必须先有主键,主键和外键的类型必须一致
子表的某一字段去参照主表的主键!
子表的字段叫做外键!
主外键关联!
CONSTRAINT 关系的名字(不能重复)
foreign key (外键)
references 主表名(主键)
ALTER TABLE 子表
ADD CONSTRAINT 约束名称 FOREIGN KEY(外键) REFERENCES 主表名(主键);
例如:主外键约束
两表的sid为参照
//1.创建主表
CREATE TABLE newstu(
sid BIGINT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL
);
//创建一个字表 sroce
CREATE TABLE score( cid BIGINT PRIMARY KEY AUTO_INCREMENT,
sre INT,
sid BIGINT
);
CONSTRAINT 关系的名字(不能重复)
foreign key (外键)
references 主表名 (主键)
CONSTRAINT n_c_f FOREIGN KEY (sid)
REFERENCES newstu (sid) );
ALTER TABLE 子表
ADD CONSTRAINT 约束名称 FOREIGN KEY(外键) REFERENCES 主表名(主键);
ALTER TABLE score ADD CONSTRAINT xxxxxxx FOREIGN KEY(sid) REFERENCES newstu (sid)
3.2 表关系
1一 对 多 (多 对 一)
例子: 图书 和 图书类别 学生 和 成绩
子表的外键 关联 主表主键 (主外键关联)
2
多 对 多
需要建立第三张关系表! 关联两个表! 而且 关系表中肯定会包含两个字段!这两个字段
分别是两张主表的外键!
例子:
学生表(学号,姓名,…………)主键:学号
课程表(课程号,课程名,…………)主键:课程号
一个学生能选多门课,一个课可以由多个学生选,即是多对多关系
那么成绩表就是它们之间关系的体,即引用成绩表(学号,课程号,成绩)。
这里学号和课程号,分别是学生表和课程表中学号和课程号的外键
例子:
CREATE TABLE student(
sid BIGINT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20) NOT NULL
);
CREATE TABLE teacher(
tid BIGINT PRIMARY KEY AUTO_INCREMENT, tname VARCHAR(20) NOT NULL
);
//多对多关系没有主子表之分 //多对多关系需要创建一个中间表 使两个表创建关系
CREATE TABLE s_t(
sid BIGINT,
tid BIGINT, CONSTRAINT s_t_s FOREIGN KEY (sid) REFERENCES student(sid),
CONSTRAINT s_t_t FOREIGN KEY (tid) REFERENCES teacher(tid)
);
多表查询 纵向和横向
纵向 :select * from a union select * from b (去重复) select * from a union all select * from b (不去重复)
横向:
3.3 99查询法 内连接 外连接
-- 学生表 CREATE TABLE student(
stuid VARCHAR(10)PRIMARY KEY, stuname VARCHAR(50)
);
-- 分数表 CREATE TABLE score(
stuid VARCHAR(10), score INT,
courseid INT, CONSTRAINT fk_stu_sco FOREIGN KEY(stuid) REFERENCES student(stuid)
);
1 练习: 查询出每名学生的分数
SELECT s.stuid,s.stuname,c.score,c.courseid
FROM student s,score c
WHERE s.stuid = c.stuid;
2 使用内连接的方式进行多表查询 SELECT * FROM student s
INNER JOIN score c
ON s.stuid = c.stuid; SELECT * FROM student s
JOIN score c
ON s.stuid = c.stuid;
3 使用外连接
左右指向的是主键
SELECT *
FROM score c
RIGHT OUTER JOIN student s
ON s.stuid = c.stuid;
-- 学科表 CREATE TABLE course(
courseid INT PRIMARY KEY, cname VARCHAR(20) NOT NULL,
tid INT
);
-- 教师表teacher CREATE TABLE teacher(
tid INT PRIMARY KEY, tname VARCHAR(20) NOT NULL, lid INT
);
三张表引申n张表
99查询法
SELECT * FROM student s ,score c ,course cc WHERE s.stuid = c.stuid
AND c.courseid = cc.courseid;
内连接
SELECT * FROM student s
INNER JOIN score c ON s.stuid = c.stuid;
INNER JOIN course cc ON c.courseid = cc.courseid;
外连接 :建议使用
SELECT * FROM student s
LEFT OUTER JOIN score c
ON s.stuid = c.stuid
LEFT OUTER JOIN course cc
ON cc.courseid = c.courseid;
查询练习
行转列相关文章推荐
- 基础查询和数据库的调用
- 基础查询和数据库的调用
- MySQL中MyISAM和InnoDB的区别
- MySQL LIKE 子句
- 多表查询 left/right join
- mysql07---主从复制
- 采用Servlet+JDBC+MySQL+Jsp完成一个登陆注册界面
- MySQL系列之七:主从复制(转)
- Mysql 如何设置字段自动获取当前时间
- mysql 子查询
- mysql基本操作
- MySql 创建/删除数据库
- Mysql海量数据存储和解决方案之一—分布式DB方案
- ubuntu mysql数据库迁移
- 功能总结--mysql、String字符串函数的应用及mybatis的批量更新不同字段
- 安装Mysql
- 创建MySQL用户 赋予某指定库表的权限
- Mysql基础
- mysql全库导出与导入
- mysql查看修改