Mysql基础

创建数据库

#character set指定字符集默认utf-8,collate指定字符集校对规则(utf8_bin区分大小写,utf8_general_ci不区分大小写)
create database [if not exists] db_name [character set] [collate]

显示数据库

show databases

显示数据库创建语句

show create database db_name

 数据库删除语句

drop database [if exists] db_name

创建表

create table name
(
    field1 datatype,
    field1 datatype,
    field1 datatype
)character set 字符集 collate 校对规则(默认与数据库为准) engine 引擎

Mysql列类型

整形 tinyint[1字节] smallint[2字节] mediumint[3字节] int[4字节] bigint[8字节]

小数类型 float[单精度4字节] double[双精度8字节] decimal[M,D][大小不确定M=10,D=0]M是小数位数(精度)的总数,D是小数点后面的位数

字符串类型 char(固定长度字符串) 0-255(字符) varchar(可变长度字符串,字符) 会预留1~3字节记录存放长度 0-65535{0~2^16-1](字节) text 0~2^16-1(字节) longtext 0~ 2^32-1(字节)(gbk中文2个字节,英文1个字节;utf-8中文3个字节,英文1个字节)

二进制数据 blob[0~2^16-1] longblob 0~2^32-1

日期类型 date 日期 年月日  time 时间 时分秒  datetime 年月日时分秒 YYYY-MM-DD hh:mm:ss

timestamp 时间戳

CREATE TABLE `table`
(
	birthday DATE,
	job_time DATETIME,
	login_time TIMESTAMP
	not null DEFAULT CURRENT_TIMESTAMP on UPDATE CURRENT_TIMESTAMP
) CHARACTER SET utf8;	#自动更新时间戳
INSERT INTO `TABLE`(birthday,job_time) VALUE("2024-3-24","2024-3-24 10:10:10");

year 年

位类型 bit 1-64 二进制显示

修改表

添加列 alter table tablename add (column datatype) after 列
修改列 alter table tablename modify (column datatype)
删除列 alter table tablename drop (column)
查看表的结构 desc 表名    --查看表所有列
修改表名 rename table 表名 to 新表名
修改表字符集 alter table 表名 character set 字符集
修改列名 alter table tablename 列名 新列名 datatype

Insert

insert into tablename [(column)] values [(value)]

update

update tablename set colname = expr1[colnames] [where where_definition]

 

 delete

delete from tablename [where where_definition]

select

select [distinct] *|[column1,column2] from tablename
distinct表示是否去掉重复数据(每一行相同)

 使用表达式对查询的列进行运算

select *|{column1 | expression1 ,column2 | expression2,...} from tablename
select name , (chinese+english+math) as total_score from student

在select语句中可使用as语句

select column as 别名 from tablename

使用order by 子句排序查询结果

select column1,column2,column3,... from tablename order by column asc|desc,...
#按照部门号升序而雇员的薪资降序排列
select * from emp order by deptno asc ,sal desc

 合计/统计函数

count 返回行的总数

select count(*)|count(列名) from tablename [where where_definition]
count(*) 返回满足条件的记录的数量
count(列) 统计满足条件的某列有多少个,但是会排除为null

sum返回满足条件的行的和,仅对数值起作用,否则会报错

select sum(列名) ,sum(列名),... from tablename [where where_definition]
#统计一个班数学总成绩
select sum(math) from student

avg函数返回满足where条件的一列的平均值

select avg(列名),avg(列名) from tablename [where where_definition]

max/min返回满足where条件的一列的最大值/最小值

select max(列名) from tablebname [where where_definition]

使用group by 子句对列进行分组

select column1,column2... from table group by column
#显示每种岗位的雇员总数,平均工资
select count(*),avg(sal),job from emp group by job
#显示雇员数,以及获得补助的雇员数
select count(*),count(comm) from emp
#显示雇员数,以及没有获得补助的雇员数
select count(*),count(if comm is null,100,null) from emp

使用having子句对分组后的结果进行过滤

select column1,column2,column3,... from table group by column having 表达式

字符串相关函数

concat将多个列拼接成一列

#以首字母小写的方式显示所有员工姓名
select concat(lcase(substring(ename,1,1)),substring(ename,e)) as new_name from emp

 数学相关函数

 时间日期相关函数

#查询10分钟以内发布的新闻
select * from mes where date_add(send_time,interval 10 minute) >= now()
#显示所有新闻,发布日期只显示日期,不显示时间
select id,content,date(send_time) from mes
#求出2011-11-11和1990-1-1相差多少天
select datediff('2011-11-11','1990-1-1') from dual
#如果你能活80岁,求出你还能活多少天
select DateDiff(date_add("2000-11-11",interval 80 year),now()) from dual
unix_timestamp() 返回1970-1-1到现在的秒数
from_unixtime() 可以把一个unix_timestamp秒数,转成指定格式的日期
select FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y-%m-%d %H:%i:%s') from dual

select user() from dual
select database() from dual
select database() from dual
insert into user values(100,'xu',md5('xiang'))#插入
select * from user where md5('xiang')#查询

流程控制函数

select ename,if(comm is null,0.0,comm) from emp
select ename,(select case when job = 'CLERK' then '职员' when job = 'manager' then '经理' when job = 'saleman' then '销售人员') from emp

模糊查询

like操作符

%:表示0到多个任意字符

_:表示单个任意字符

判断某一列的值是否为空使用is null 而非 =

#查询以S开头的所有员工
select ename,sal from emp where ename like "S%"
#查询没有上级的员工
select * from emp where mgr is null

 分页查询

如果select同时包含有group by,having,limit,order by那么他们的顺序是group by,having,order by,limit,顺序错误报语法错

 多表查询

笛卡尔积:当两个表查询时,从第一张表中取出一行和第二张表的每一行进行组合,返回结果【含两张表的所有列】

#显示雇员名,雇员工资以及所在部门的名字,并按部门降序排序
select ename,sal,dname,emp.deptno from emp,dept where emp.deptno=dept.deptno
#显示各个员工的姓名,工资,及其工资级别
select ename,sal,grade from emp,salgrade where sal between losal ans hisal

自连接:在同一张表的连接查询【将同一张表看作是两张表 需要取别名】,

#显示公司员工和他的上级的名字(每一个员工都有一个编号(mgr),一行中显示的是他的编号)

select worker.ename , boss.ename from emp worker,emp boss where worker.mgr = boss.empno

子查询:嵌入在其他sql语句中的select语句,也叫嵌套查询

单行子查询:只返回一行数据的子查询语句

多行子查询:返回多行数据的子查询,使用关键字in

将子查询结果当作一张临时表

在多行子查询中使用all操作符

在多行子查询中使用any操作符

多列子查询:返回多个列数据的子查询语句

#显示与SMITH同一个部门的所有员工
1、先查询到SMITH的部门号
2、把上面的select语句当作一个子查询来使用
select * from emp where deptno = (
    select deptno from emp where ename = 'SMITH'
)
#查询和部门10的工作相同的员工但是不含部门10自己的员工
select ename,job,sal,deptno from emp where job in (
    select distinct job 
    from emp 
    where deptno = 10
) and deptno <> 10
#查询ecs_goods中各个类别中,价格最高的商品
select goods_id,temp.cat_id,goods_name,shop_price from (
		select cat_id,max(shop_price)
		from ecs_goods
		group by cat_id
) temp,ecs_goods
where temp.cat_id = ecs_goods.cat_id and temp.max(shop_price) = ecs.goods.shop_price
#显示工资比所有30的所有员工的工资高的员工姓名、工资、部门号
select ename,sal,deptno from emp where sal > all(
        select sal from emp where deptno = 30
)
#显示工资比部门30的其中一个员工的工资高的员工姓名、工资、部门号
select ename,sal,deptno from emp where sal > any(
        select sal from emp where deptno = 30
)
#查询与Smith的部门和岗位完全相同的所有雇员不包含Smith本人
select * from emp where (deptno,job) = (
    select deptno,job from emp where ename='smith'
) and ename <> 'smith'

多表子查询练习

#查找每个部门工资高于该部门平均工资的人的资料
select * from emp,(
        select dempno,avg(sal) from emp group by deptno
) temp where temp.deptno = emp.deptno and emp.sal > temp.sal

表复制

自我复制数据(蠕虫复制):有时为了对某个sql语句进行效率测试,我们需要海量数据时,可以用此法为表创建海量数据

create table my_table(
    id int,
    name varchar(32),
    sal double,
    job varchar(32),
    deptno int
);
insert into my_table (id,name,sal,job,deptno)
                        select empno,ename,sal,job,deptno from emp
#自我复制
insert into my_table
                select * from my_table
#删除一张表中的重复记录
create table my_table2 like emp    复制结构
insert into my_table2
            select distinct * from emp

 合并查询

为了合并多个select语句的结果,可以使用union(去重),union all(不去重)

mysql外连接

#使用左外连接显示所有人的成绩,如果没有成绩,也要显示改人的姓名和id号,成绩显示为空
select stu.id,name,grade 
from stu left join exam 
on stu.id  = exam.id
#使用右外连接,显示所有成绩,如果没有名字匹配,就显示空
select stu.id,name,grade 
from stu right join exam 
on stu.id  = exam.id

mysql约束:用于确保数据库满足特定的商业规则

not null,unique(唯一,如果没有指定not null,unique字段还是可以有多个null,一张表可以有多个unique),primary key(不可重复且不为空),foreign key,check(用于强制数据必须满足的条件)

#复合主键
create table mytable(
    id int,
    name varchar(32),
    email varchar(32),
    primary key(id,name)
);  

自增长

字段名 整形 primary key auto_increment
create table mytable(
    id int primary key auto_increment,
    name varchar(32) CHECK(name in ('man','woman')),
    email varchar(32)
)
INSERT into mytable value(null,'man','12345')

 索引

#empno_index 索引名称  on emp(empno) 表示在emp表的empno列创建索引 索引占用磁盘空间
#只对创建了索引的列有效
create index empno_index on emp(empno)

索引的原理

没有索引时,会进行全表扫描

索引代价        1、磁盘占用        2、对DML(update delete insert)语句的效率影响

#查询表是否有索引
show indexes from tablename
show keys from tablename
#如果某列的值是不会重复的,则优先使用unique索引,否则使用普通索引
#添加唯一索引
create unique index in_index on tablename(列)
#添加索引
create index in_index on tablename(列)
alter table tablename add index id_index (列)
#添加主键索引
alter table tablename add primary key (列)
#删除索引
drop index in_index on tablename
#删除主键索引
alter table tablename drop primary key
#修改索引 先删除再添加

 mysql事务

事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败

当执行事务操作时,mysql会在表上加锁,防止其他用户改表的数据,这对用户来讲是非常重要的

#mysql数据库控制台事务的几个重要操作
start transaction  --开始一个事务
savepoint 保存点名  --设置保存点
rollback to 保存点名    --回退事务
rollback --回退全部事务
commit  --提交事务,所有的操作生效,不能回退
create table t27(
	id int,
	name varchar(32)
)
start TRANSACTION
SAVEPOINT A
INSERT INTO t27 values(100,'tom')
select * from t27
SAVEPOINT B
insert into t27 values(200,'jack')
ROLLBACK to b
select * from t27

#查看当前会话隔离级别
select @@transaction_isolation
#查看系统当前隔离级别
select @@global.transaction_isolation
#设置当前会话隔离级别
set session transaction isolation level read uncommitted
#设置系统隔离级别
set global transaction isolation level read uncommitted

#修改存储引擎
alter table tablename engine = innodb

视图是一个虚拟表,其内容由查询定义,同真实表一样,视图包含列,其数据来自于对应的真实表,只有结构文件,没有数据文件,是映射关系,数据修改都会影响对方,视图中可以再使用视图,还是映射基表

create view emp_view 
as select empno,ename,job,dempno from emp

select * from emp_view
#查看创建视图的指令
show create view emp_view

#针对emp,dept和salgrade这三张表,创建一个视图emp_view,显示雇员编号,雇员名,雇员部门名称和薪水级别【使用三张表构建一个视图】
create view as emp_view as
select empno,ename,dname,grade from emp,dept,salgrade
where emp.dempno = demp.deptno and (sal between losal and hisal)

 mysql用户

mysql用户,都存储在系统数据库MySQL中user表中

user表字段的说明

host:允许登录的位置,localhost表示该用户只允许本机登录,也可以指定IP地址

user:用户名

authentication_string:密码,是通过MySQL的password()函数加密后的密码

#创建用户
create user 用户名@允许登录的位置 identified by 密码
create user 'tom'@'localhost' identified by '12345'
#删除用户
drop user 'tom'@'localhost'
#修改自己的密码
set password = password('12345')
#修改其他用户的密码,需要权限
set password for 'root@localhost' = password('12345')

 

#创建用户xiang,密码12345,从本地登录
create user 'xiang@localhost' identified by '123'
#创建数据库和表
create database testdb
create table news(
	id int,
	content varchar(32)
)
#给用户分配查看news表和添加数据的权限
grant select,insert on testdb.news to 'tom'@'localhost'
#回收权限
revoke select,insert on testdb.news from 'tom'@'localhost'
#删除用户
drop user 'tom'@'localhost'
drop user 'jack'    默认 drop user 'jack'@'%'

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值