create database 库名 default character set 字符;(utf8,gbk)
1) 显示库中所有表:show tables;
2) 创建表:
create table 表名(
列名1 数据类型(长度) [约束],
列名2 数据类型(长度) [约束],
)
3) 显示建表语句:show create table 表名;
4) 查看表结构:desc 表名;
5) 删除表:drop table 表名;
全表插入--要求字段一一对应,数量也要匹配
insert into 表名 values(值1,值2...);
insert into emp values(1,'lucy','cook',1,'2017-12-13',8000,1000,1);
全字段插入数据
insert into 表名(列1,列2...) values (值1,值2....);
insert into emp(empno,ename,sal) values (2,'hanmeimei',1200);
批量插入insert into t_item (id,title,price,num)values(8,'mac',12888,12),(189, '小pad',3888,188);
1) 查询: select * from 表名;
2) 查询当前时间:select now() from dual;
update 表名 set 字段名 = 值 where 条件(empno=1);
例子:
修改所有18888为28888
update hero set money=28888 where money=18888;
修改30岁的人名为呵呵
update person set name='呵呵' where age=30;
1).delete from 表名 where 条件;
DELETE FROM book WHERE bname IS NULL;(删除是null的不用“=”号,用“is”)
2).truncate table 表名 清空整张表(删除后恢复不了,效率高)
运行机制:把整张表删除,创建一张一模一样的空表。
3).delete from 表名 (可以回滚取消删除)
alter table 表名 engine=xxx,charset=xxx; (engine=myisam/innodb)
3.添加表字段:
alter table 表名 add 字段名 数据类型 位置(first,after);
(添加字段不写位置就是添加到末尾)
最后面格式:alter table 表名 add 字段名 字段类型;
最前面格式:alter table 表名 add 字段名 字段类型 first;
某字段后面:alter table 表名 add 字段名 字段类型 after 字段名;
alter table person add gender varchar(5);
alter table person add id int first;
alter table person add salary int after name;
4.给字段改名:
alter table 表名 change 原列名 新列名 数据类型;
alter table person change id pid int;
5.给字段加数据结构:
alter table 表名 modify 列名 数据类型;
6.修改字段顺序:
alter table 表名 modify 字段1 数据类型 after 字段2;
7.删除表字段(字段==列):
alter table 表名 drop 字段名;
alter table person drop salary;
1.整数:
2.浮点数:
float(m,d)
double(m,d)
decimal(m,d)
m为这个数的总长度,d为小数点后面几位
decimal不会精度偏移
3.字符串:
char(m) m为固定长度,m为最大长度255
varchar(m) 可变长度,一般不超过255字节
text 2^16-1字节 65535字节
blob 大数据对象,以二进制方式存储数据
**char和varchar区别:
char(20)--->’abc’--->abc+17个空格
varchar(20)--->abc--->abc
char的长度不可变,如果数据不足长度,那么使用空格站位,同时char没办法处理末尾带空格的数据;
同样长度,char的效率比varchar高。
4.日期:
date 存日期 ‘1986-11-15’
time 存时间 ’14:54:24’
datetime 存储日期和时间 年月日时分秒
9999年上限 必须手动输入时间,默认null
timestamp 到2038年 如果没有手动输入,默认当前时间
bigint(long 毫秒)
5.其他的数据类型 set:
int(m),这里m跟长度无关,查询显示的位数.
CREATE TABLE int_demo2(
num INT(4) ZEROFILL
);
INSERT INTO int_demo2 VALUES(1);
显示:0001
**int(m) 不写m行不行,语法上可以,但是语义不行**
**int(m),业务需要这个字段多长**
操作步骤:
别名:
SELECT comm AS '奖金' FROM emp WHERE comm IS NOT NULL;
SELECT ename '员工姓名',sal '工资',mgr '上级领导编号' FROM emp WHERE mgr IS NOT NULL;
like:(像……一样)
模糊查询
使用通配符
between … and …;在…之间
in() 在…里边
not in()/not between…and…/not like…
distinct去掉重复的列值
SELECT DISTINCT job FROM emp;
默认排序为升序
在where语句之后
asc为升序,desc为降序;
两个以上排序以“,”隔开
多重排序,按照参照字段顺序,先按照第一位字段顺序,如果排序中有重复的字段
limit begin,size
begin:代表本页数据起始行,从0开始
size:代表本页有多少条数据
limit子句要写在order by 之后
concat(str1,str2);
返回结果是一个字符串
如果拼接过程中,有一个字段是null,结果就是null;
将两个数据拼接到一起
SELECT CONCAT(title,price) FROM t_item;
SELECT CONCAT('今天中午','跟炒饼有仇') '心情' FROM DUAL;
+ - * / % 都可以计算 mod()
Mysql是弱数据类型,数字可以和字符串进行计算10+’10’
%--->mod()是同一个意思:取余 7%2==mod(7,2)
1.now() 返回当前的日期和时间
select now() from dual;
2.curdate() 返回的是当前的日期
select curdate() from dual;
3.curtime()返回当前时间
select curtime() from dual;
4.date()提取日期表达式的日期部分
select date(now()) from dual;
5.time()提取日期表达式的时间部分
select time(now()) from dual;
6.extract()提取日期表达式中单独的字段 年,月,日,时,分,秒
select extract(year from now()) ‘年’ from dual;
select extract(month from now()) ‘月’from dual;
select extract(day from now()) ‘日’from dual;
select extract(week from now()) ‘周’from dual;
select extract(hour from now()) ‘时’from dual;
DATE_FORMAT()函数
用于不同的格式显示/日期数据
把时间格式--->字符串
语法:date_format(时间数据,格式)
Date_format(date,format)
format:
%c 月 1 2 3 4 5 6 7 8 9 10 11 12
%d 月的日 (00-31)
%H 小时 (00-23)
%h 小时 (01-12)
%i 分钟 (00-59)
%m 月 01 02 03 04 05 06 07 08 09 10 11 12
%S 秒 (00-59)
%Y 年
str_to_date
把字符串转换成mysql认识的时间格式
SELECT STR_TO_DATE('08/12/16','%y/%c/%d') FROM DUAL;
IFNULL()函数
空值处理函数
语法:ifnull(e1,e2)如果e1不是null,那么返回e1,如果e1是null,返回e2.
ifnull返回值的类型,根据上下文逻辑,返回整数或字符串
对多行数据进行合并并统计
sum() 求和 select sum(sal) from emp;
avg() 平均值 如果值为null不参与计算。
count() 求总数 不包括null的列
max() 最大值
min() 最小值
聚合函数不可以放到where之后,where执行的时候聚合函数还没有计算出结果
1.其他字符串函数(知道):
select locate('abc','--abc--abc--abc--') from dual;
2.数学函数:
select floor(3.5);--3 select floor(-3.5);-- -4
select truncate(236.96,-1);
select 列名,……,聚合函数(一个或多个)
from 表名
where 过滤条件
group by 分组条件
order by 排序
group by 作用:根据一个或多个列对结果进行分组
group by 必须在where和order之间
分组是为了聚合函数的更好应用
如果语句出现分组,那么所有的聚合函数都自动按照所属组别去统计数据
分组查询一般和聚合函数捆绑出现
一条select语句分组查询,select后面跟随的字段会存在普通的字段和聚合函数,
那么,分组条件一定包括普通字段。
所有的聚合函数必须使用别名
Group by可以根据多个字段分组
select执行过程:
having过滤分组条件
语法:
select 字段名,聚合函数
from 表名
where 过滤条件
group by 分组条件
having 过滤分组条件
order by 排序
如果having没有聚合函数可以使用where过滤
子查询是嵌套在另一个dml,dql语句中的
子查询称为内部查询,包含子查询的查询语句,称为外部查询
子查询可以再使用表达式的任何地方使用,并且必须在括号中关闭
表达式中使用子查询:
当两张表关联时,若没有关联条件,则返回总条数为两张表的条目数乘积
这个乘积的结果叫做笛卡尔积
笛卡尔积通常是一个无意义的结果
要避免出现笛卡尔积,数据量大时会出现内存溢出。
1.等值连接/内连接语法:
select *
from A (inner可省略) join B
on A.某字段 = B.某字段
where 筛选条件
N张表之间,做关联条件,至少存在n-1条件
内连接:
不满足关联条件的记录不会再内连接查询中被查询出来。
2.左外连接:
以left join 左侧的表作为驱动表(左侧的所有数据都会被查出来,哪怕不符合关联查询条件),那么当该表中某条记录不满足关联查询时,来自右侧表中的字段全部填写null.
语法:
select *
from 驱动表 left (outer可省略) join 普通表
on 关联查询
select d.deptno ‘dept左’,e.deptno ‘emp右’
from dept d left join emp e
on d.deptno=e.deptno;
3.右外连接:
语法:
select *
from 普通表right (outer可省略) join 驱动表
on 关联条件
select d.deptno ‘dept左’,e.deptno ‘emp右’
from emp e right join dept d
on d.deptno=e.deptno;
4.在数据库 全外连接 full join,mysql不支持全外连接,oracle支持;
使用在表达式中 = > <,不需要有别名
子查询可以代替表放在from后面,充当数据源,必须有别名
select ename,job,sal from emp where sal > 1250;
select ename from (select ename,job,sal from emp where sal >1250) t;
create table e1 as(select ename,job,sal from emp where sal >1250);
自连接:
在逻辑上,把一张表当成两张来操作。
当前表的一条记录可以对应这张表的多条记录
自连接是为了解决同类型数据,但是存在上下级关系的树状结构的数据时使用
使用方式:
自己关联自己
设计方案,主表中添加一个字段,保存从表的主键
一对多关联:
员工表和部门表
通常一方称之为主表,多方称之为从表
设计方案,主表中添加一列作为外键,外键中存储是从表的主键。
多对多关联:
学生和课程
设计方案,添加一个中间表,保存两张的主键,形成关联
权限管理表的实现:
创建视图:
create view 视图名 as(子查询);
视图:
是数据库对象之一,由于数据对象名称不可以重复,所以视图的命名v_开头,
视图在sql语句中体现的角色与表相同,就是对表的操作在对视图的时候基本都可以操作,
但是视图并不是一张真实存在的表,而是对应一个select查询结果集。
视图最大的作用--->重用子查询
视图对应的子查询字段若含有函数或者表达式,那么该字段必须制定别名,如果其他普通字段也制定别名,那么在对视图操作时,只能通过别名找到相应字段。
视图的分类:
简单视图:
对应的子查询中,不含有关联查询,查询的字段不包括表达式,函数,没分组,没有去重。
复杂视图:
有上述任意一点都叫复杂视图。
对视图进行dml操作,只针对简单视图可以使用
如果原列表有约束,那么不满足约束,不可以操作。
对视图的操作就是对基表的操作,操作不当可能对基表进行数据污染
With check option
CREATE OR REPLACE VIEW v_emp_5
AS
SELECT empno,ename,deptno
FROM emp
WHERE deptno = 20
WITH CHECK OPTION;
视图的作用
如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可,简化复杂查询。
对基表数据保护,限制数据访问。
工作中对视图一般只进行DQL,不使用DML
drop view 视图名;
删除视图不会影响基表数据;
删除视图中的数据,会影响基表数据。
CREATE INDEX idx_ename ON emp(ename);
CREATE INDEX idx_emp_job_sal ON emp(job,sal);
CREATE TABLE mytable(
id INT,
username VARCHAR(20),
INDEX idx_mytable_user(username)
);
ALTER TABLE mytable ADD INDEX idx_mytable_username1(username);
DROP INDEX idx_mytable_username1 ON mytable;
MySQL约束:
CREATE TABLE t1(
id INT PRIMARY KEY,
NAME VARCHAR(10)
);
CREATE TABLE t2(
id INT,
NAME VARCHAR(10),
PRIMARY KEY(id)
);
给表起名,日后好删。
CREATE TABLE t2(
id INT,
NAME VARCHAR(10),
CONSTRAINT(关键字,起名字用) pk_t3_id PRIMARY KEY(id)
);
CREATE TABLE t4(
id INT PRIMARY KEY AUTO_INCREMENT,自增长
NAME VARCHAR(20)
);
INSERT INTO t4 VALUES (NULL,'aaa');
INSERT INTO t4 VALUES (10,'aaa');
INSERT INTO t4 VALUES (NULL,'aaa');
INSERT INTO t4 VALUES (2,'aaa');
INSERT INTO t4 VALUES (NULL,'aaa');
在建表之后,使用命令添加主键约束。
CREATE TABLE t5(
id INT,
NAME VARCHAR(20)
);
ALTER TABLE t5 ADD PRIMARY KEY(id);
ALTER TABLE t5 MODIFY id INT PRIMARY KEY AUTO_INCREMENT;
alter table t5 drop primary key;
alter table t5 modify id int;(mysql这个命令不起作用)
不推荐使用
外键约束的要求:
关于外键的使用:
CREATE TABLE class(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10)
);
列级语法:
CREATE TABLE s1(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
class_id INT REFERENCES class(id)
);
表级语法:
CREATE TABLE s1(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
class_id INT,
CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES class(id)
); 外 键 依赖于
语法:constraint 约束名称 约束(列名) references 表名(列名)
虽然mysql支持外键约束使用列级语法创建,但是这种列级语法的外键约束不会生效,只有表级的外键约束生效。
Mysql提供列级外键约束的语法,是为了和标准sql保持兼容性。
CREATE TABLE teacher_table(
tid INT AUTO_INCREMENT,
tname VARCHAR(20),
PRIMARY KEY(tid)
);
INSERT INTO teacher_table VALUES (NULL,'t1');
INSERT INTO teacher_table VALUES (NULL,'t2');
INSERT INTO teacher_table VALUES (NULL,'t3');
INSERT INTO teacher_table VALUES (NULL,'t4');
列级语法:
CREATE TABLE t6(
id INT PRIMARY KEY,
NAME VARCHAR(20) UNIQUE
);
表级语法:
CREATE TABLE t7(
NAME VARCHAR(20),
UNIQUE KEY(NAME)
);
复合的唯一约束
删除唯一约束
alter table t7 drop unique uq_t7_name;
修改唯一约束
alter table t8 add unique uq_..(字段);
alter table t8 modify name varchar(20) not null;
alter table t8 modify name varchar(20) null;
Create table t9(
Id int,
Name varchar(20),
Sex char(10) default’男’
);
CHECK约束—mysql不支持 ,写上check不报错,没效果。
事务
原理:
Mysql事务:
SHOW VARIABLES LIKE 'autocommit'
SET autocommit=0;0—off 1—on