cmd界面登录 MySQL
#方式一:在 -p 后面输入密码 mysql -uroot -ppassword #方式二: 在弹出输入密码指示时输入密码 mysql -uroot -p password
使用数据库
#1.查询有哪些数据库 show databases; #2.选择使用的数据库,我这里使用的mydb use mydb; #3.查询数据库中有哪些表 show tables; #4.查询 user 表中的所有字段 select * from user;
查询操作
#查询当前使用的数据库 select database(); #分号别忘记加 #查看mysql的版本号 show version(); #查看创建表语句 show create table 表名; #查看表结构 desc 表名;
增删数据库
#创建数据库mydb create database mydb; #删除数据库mydb(慎用) drop database mydb;
如果想要结束一条语句在后面加上 \c 回车即可
SQL语句分类
1.DQL(数据查询语言):查询语句,凡是 select 语句都是DQL
2.DML(数据操作语言):insert、delete、update,对表中的数据进行增删改
3.DDL(数据定义语言):create、drop、alter,对表中结构进行增删改
4.TCL(事务控制语言):commit提交事务,rollback回滚事务
5.DCL(数据控制语言):grant授权,revoke撤销授权等
table是数据库的基本组成单元,所有的数据都是以表格的形式组织,目的是可读性强
1.一个表包含行和列
行:被称为数据/记录(data)
列:被称为字段(column)
2.每一个字段应该包含哪些属性:字段名(id), 数据类型(int), 相关的约束(not null(不能为空))
建表语句:
drop table if exists user #如果表存在则删除 create table user( id int auto_increment primary key, name varchar(20) not null, address varchar(40) not null )engine=InnoDB default charset=utf8;
数据类型:
int、bigint、float、char、varchar、date、BLOB(二进制大对象)、CLOB(字符大对象)
创建新表emp 复制表use中的所有数据 create table emp as select * from user;
#drop table if exists 表名 drop table if exists emp; #删除大表 truncate table emp;
插入数据
#insert into 表名(字段名1,字段名2,字段名3,..)values(值1,值2,值3,..); #字段数量和值数量相同,并且数据类型要对应 #单行插入 insert into user(id,name,address) values(4,'xiaoliu','henan'); #多行插入 insert into user(id,name,address) values(1,'zhangsan','beijin'),(2,'lisi','tianjin'),(3,'wangwu','jiangxi');
删除数据
#delete from 表名 where 条件; #没有条件全部删除 #删除姓名为 xiaoliu 的一行数据 delete from user where name = 'xiaoliu';
修改数据
#update 表名 set 字段名=值1,字段名2=值2.. where 条件; #没有条件的话整张表数据更新 #修改id=3的一行数据 update user set name='hihi',address='sichuan' where id=3;
简单查询
#查询所有字段 select * from user; #给查询结果的列重命名 as后面跟新名称 select id,name,address as a from user; #查询指定字段 select id,name from user; #条件查询 先执行from,然后where,最后select select id,name,address from user where id = 2;
概述
排序分为升序和降序,分别是 asc(升序),desc(降序),MySQL中默认是降序排序。
升序排序(asc)
mysql> select * from user order by address asc; +----+----------+---------+ | id | name | address | +----+----------+---------+ | 1 | zhangsan | beijin | | 3 | hihi | sichuan | | 2 | lisi | tianjin | +----+----------+---------+ 3 rows in set (0.00 sec)
降序排序(desc)
mysql> select * from user order by address desc; +----+----------+---------+ | id | name | address | +----+----------+---------+ | 2 | lisi | tianjin | | 3 | hihi | sichuan | | 1 | zhangsan | beijin | +----+----------+---------+ 3 rows in set (0.00 sec)
概述:按照某个字段或者某些字段进行分组
语法:group by和having
#按照城市进行分组,找出id最大的 mysql> select max(id) from user group by address; +---------+ | max(id) | +---------+ | 1 | | 3 | | 6 | +---------+ 3 rows in set (0.00 sec) #一个完整的SQL语句 ()内是执行顺序 #select(5) ... from(1) ... where(2) ...group by(3) ... having(4) ... order by(6)
having 是对分组之后的数据进行再次过滤。
注意:
1.分组函数一般会和 group by 联合使用,并且任何一个分组函数都是在 group by 执行结束后再执行
2.当一条语句有 group by 时,只允许select 后面出现参加分组的字段以及分组函数
概述:limit是mysql特有的,其他数据库中没有,作用是取结果集中的部分数据。
语法:
#查询两条数据 select * from user limit 2; #跳过第一条数据,查询两条数据 select * from user limit 1,2;
注意:limit 是 sql 语句中最后执行的环节。
概述
所有的分组函数都是对一组数据进行操作的,分组函数只有5个,分别是:
mysql> select count(*) from user; +----------+ | count(*) | +----------+ | 3 | +----------+ 1 row in set (0.01 sec)
mysql> select sum(id) from user; +---------+ | sum(id) | +---------+ | 6 | +---------+ 1 row in set (0.01 sec)
mysql> select avg(id) from user; +---------+ | avg(id) | +---------+ | 2.0000 | +---------+ 1 row in set (0.01 sec)
注意
1.所有数据库都是这样规定的,只要有NULL参与运算的运算结果一定是NULL。
2.分组函数自动忽略 null,不需要添加判断条件。
3.SQL语句中规定分组函数不可直接使用在 where 子句当中,因为group by 是在where 语句执行结束之后才执行。
空处理
ifnull()空处理函数:属于单行处理函数
语法:ifnull(可能为空的数据,被当做什么值)
#如果地址为空,值就被当做中国 select id,name if(address,'zhongguo') from user;
余数
语法:MOD(X,Y):返回 X 被 Y 除后的余数
时间差
语法:datediff(da1,da2):返回da1 - da2的天数,获取时间差
结果集去重:字段前面加一个 distinct
mysql> select distinct address from user; +---------+ | address | +---------+ | beijin | | tianjin | | sichuan | +---------+ 3 rows in set (0.00 sec)
注意:distinct 关键字必须在所有字段的最前面
根据表的连接方式可以分为内连接和外连接
1.等值连接
定义:查询两个表都符合条件的数据,即集合的交集
语法:table_name inner join table_name on 条件;
例子:select * from table_a a inner join table_b b on a.name = b.name
2.非等值连接
定义:连接条件中的关系是非等量关系
3.自连接
定义:一张表看作两张表,自己连接自己
1.左外连接(left join)
定义:左连接会将左表的所有数据展示出来,而右表只会展示符合搜索条件的数据
语法:table_name left join table_name on 条件
例子:select * from left_table l left join right_table r on l.name = r.name
2.右外连接(right join)
定义:右连接会将右表的所有数据展示出来,而左表只会展示符合搜索条件的数据
语法:table_name right join table_name on 条件
例子:select * from left_table l right join right_table r on l.name = r.name
1.where后面接子查询
2.from后面接子查询: 将查询结果当成一张新表(临时表)来看待
3.select后面接子查询
约束是作用于表中列上的规则,用于限制加入表的数据,约束的存在保证了数据库中数据的正确性、有效性和完整性。
1.非空约束(not null):保证列中所有的数据不能有null值
2.唯一约束 (unique):保证列中所有数据各不相同
3.主键约束 (primary key):主键是一行数据的唯一标识,要求非空且唯一
4.检查约束 (check):msyql不支持
5.默认约束 (default):保存数据时,未指定值则采用默认值
6.外键约束 (foreign key):外键用来让两个表之间建立连接,保证数据的一致性和完整性
为了建立逻辑结构合理、冗余较小的数据库,在设计数据表时必须要遵循的设计规范。
数据库第一范式是设计数据库时需要满足的最基本的范式
定义:任何一张表都必须有主键,要求数据库中所有字段都是不可拆分的原子字段
例子:电话(phone)字段,定义不明确,可以拆分为座机电话和手机电话,不符合数据库第一范式的原子性
优点:字段定义清晰,方便业务层逻辑开发,便于后续维护
在满足第一范式的基础上,第二范式对字段定义更严格约束
定义:要求数据库中的每一列都和主键相关,不能和主键部分相关
例子:在电商设计订单时,如果将订单的订单编号和商品编号作为联合主键时,不仅会有不同订单编号存在大量相同的商品编号,造成数据的冗余,而且商品单价只与商品编号有关,而与订单编号无关,不符合第二范式,需要将订单信息和商品信息进行分离。
优点:降低了数据库的冗余存储,并且逻辑清晰,查询商品信息走商品表,查询订单信息走订单表
在满足以上2范式的继承上
定义:要求数据库表中的每个字段和主键都直接相关,不能间接相关
例子:用户的省份和省会城市,省会和省会城市与用户弱相关,并且存在间接传递关系,造成数据冗余,需要将用户信息和省会信息进行分表设计
优点:提高了表的独立性,降低了数据冗余