简述
以前在学习mysql的过程中 ,需要复习还有需要拓展的知识点
mysql相关命令
#查看数据库引擎
show engine;
#查看表结构
DESC tablename;
#查看创建表的sql语句
show CREATE TABLE TABLE_NAME;
#创建表
Drop table if exists `school`;
CREATE TABLE `school` default character set utf8;
use school;
#自增
auto_increment;
#主键
primary key(`column`);
#设置引擎和编码
engine = innoDB DEFAULT CHARSET= UT8;
#设置外键将产品的cid绑定到category的主键上
constraint fk_product_category foreign key(cid) references category(id);
#n表示一个字符,不管中英文(有待确定)
varchar(n)
#创建表并设置column
drop table if exists `students`;
CREATE TABLE `student`(
`id` int NOT NULL AUTO_INCREMENT,
`NAME` VARCHAR(20) NOT NULL ,
`SEX` SMALLINT DEFAULT NULL COMMENT '性别',
`age` int NOT NULL ,
`IN_TIME` DATETIME NOT NULL ,
PRIMARY KEY(`id`)
)default charset `UTF8`;
#修改表
USE school;
ALTER TABLE `students` RENAME TO `student`; #改报名
ALTER TABLE `students` add column `age` int not null after `sex`;
ALTER TABLE `students` DROP column `nickname`;#删除表中的某一列
ALTER TABLE `students` CHANGE column_name new_name varchar(36);#修改某一列的的名称
ALTER TABLE police_org Drop primary key #修改表的主键
日期:DATE(YYYY-MM-DD) //比较常用 使用 CURDATE()
时间:TIME(HH:MM:SS) //比较常用 使用CURTIME()
年份:YEAR(YYYY)
最全时间:DATETIME(YYYY-MM-DD HH:MM:SS) //使用 NOW()
/*varchar(36) 可以保存多少中英文字符?*/
答:具体还是要看版本的,自己在数据库中建个表测试下可以放多少个汉字。
4.0 版本以下,varchar(100),指的是 100 字节,如果存放UTF8汉字时,只能存33个(每个汉字3字节)
5.0 版本以上,varchar(100),指的是 100 字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个。
sql
mysql 练习题
问:查找年龄最大的学生的所有信息?
select * from student where age = (select MAX(age) from student);
sql
问:查找年龄在 20-23 岁的学生?
select * from student where age=>20 and age<=23
sql
问:查找 id 在 另一张表里的学生?
SELECT * FROM household_record WHERE household_id NOT IN (SELECT id FROM household_info)
sql
问:统计表中男女学生的人数?
统计不同年龄段的人数,人数大于等于2
select sex,count(*) num from students group by sex;
select age,count(id) from students group by age Having NUM > 2
sql
问:将学生按照年龄倒序排,按照 id 升序排?
SELECT FROM students order by age desc ,id asc;
sql
问:查找姓名以 a 开头 或者以 b 开头的学生?
SELECT * FROM students WHERE name REGEXP '^a|^b';
SELECT * from students where name like 'a%' or name like 'b%';
/*
LIKE子句
在 where like 的条件查询中,SQL 提供了四种匹配方式。
%:表示任意 0 个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。
_:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。
[]:表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
[^] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
查询内容包含通配符时,由于通配符的缘故,导致我们查询特殊字符 “%”、“_”、“[” 的语句无法正常实现,而把特殊字符用 “[ ]” 括起便可正常查询。
'%a' //以a结尾的数据
'a%' //以a开头的数据
'%a%' //含有a的数据
'_a_' //三位且中间字母是a的
'_a' //两位且结尾字母是a的
'a_' //两位且开头字母是a的
*/
/*
REGEXP :正则表达式
'a$' //以a结尾的数据
'^a' //以a开头的数据
'a' //含有a的数据
'^[a-z]|end$' //以字母开头或者以end结尾
*/
sql
连表

连表查询练习 实战:
准备工作:
DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT 'id',
`uuid` VARCHAR(255) NOT NULL COMMENT 'uuid',
`username` VARCHAR(150) NOT NULL COMMENT 'username',
`nickname` VARCHAR(150) DEFAULT NULL COMMENT 'nickname',
`email` VARCHAR(255) DEFAULT NULL COMMENT 'EMAIL',
`password` VARCHAR(150) NOT NULL COMMENT 'password',
`avatar` VARCHAR(250) DEFAULT NULL COMMENT 'avatar',
`create_time` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'CREATE TIME',
`update_time` TIMESTAMP(3) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(3) COMMENT 'UPDATE TIME',
`delete_time` DATETIME(3) DEFAULT NULL COMMENT 'DELETE TIME',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `idx_uuid` (`uuid`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '用户表';
DROP TABLE IF EXISTS `user_friends`;
CREATE TABLE IF NOT EXISTS `user_friends` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT 'id',
`user_id` INT DEFAULT NULL COMMENT 'USER ID',
`friend_id` INT DEFAULT NULL COMMENT 'FRIEND ID',
`create_time` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'CREATE TIME',
`update_time` TIMESTAMP(3) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(3) COMMENT 'UPDATE TIME',
`delete_time` DATETIME(3) DEFAULT NULL COMMENT 'DELETE TIME',
PRIMARY KEY (`id`),
KEY `idx_user_friends_user_id` (`user_id`),
KEY `idx_user_friends_friends_id` (`friend_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '用户好友关系表';
DROP TABLE IF EXISTS `message`;
CREATE TABLE IF NOT EXISTS `message` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT 'id',
`from_user_id` INT DEFAULT NULL COMMENT '发送方id',
`to_user_id` INT DEFAULT NULL COMMENT '目标用户id',
`content` VARCHAR(2500) DEFAULT NULL COMMENT '消息内容',
`url` VARCHAR(350) DEFAULT NULL COMMENT '内容地址',
`pic` TEXT COMMENT '缩略图',
`message_type` SMALLINT DEFAULT NULL COMMENT '消息类型:1.单聊,2.群聊',
`content_type` SMALLINT DEFAULT NULL COMMENT '消息内容类型:1.text 2.file 3.image 4.audio 5.video',
`delete_time` DATETIME(3) DEFAULT NULL COMMENT 'DELETE TIME',
`create_time` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'create time',
`update_time` TIMESTAMP(3) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(3) COMMENT 'UPDATE TIME',
PRIMARY KEY (`id`),
KEY `idx_message_to_user_id` (`to_user_id`),
KEY `idx_message_from_user_id` (`from_user_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '消息表';
DROP TABLE IF EXISTS `group`;
CREATE TABLE IF NOT EXISTS `group` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT 'id',
`admin_id` INT DEFAULT NULL COMMENT 'ADMIN ID',
`name` VARCHAR(150) DEFAULT NULL COMMENT 'group name',
`notice` VARCHAR(300) DEFAULT NULL COMMENT 'group notice',
`uuid` VARCHAR(150) DEFAULT NULL COMMENT 'uuid',
`create_time` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'CREATE TIME',
`update_time` TIMESTAMP(3) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(3) COMMENT 'UPDATE TIME',
`delete_time` DATETIME(3) DEFAULT NULL COMMENT 'delete time',
PRIMARY KEY (`id`),
KEY `idx_groups_admin_id` (`admin_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '群组表';
CREATE TABLE IF NOT EXISTS `group_member` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_id` INT DEFAULT NULL COMMENT 'USER ID',
`group_id` INT DEFAULT NULL COMMENT 'GROUP ID',
`nickname` VARCHAR(150) DEFAULT NULL COMMENT 'USER NICKNAME',
`create_time` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'CREATE TIME',
`update_time` TIMESTAMP(3) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(3) COMMENT 'UPDATE TIME',
`delete_time` BIGINT UNSIGNED DEFAULT NULL COMMENT 'DELETE TIME',
`mute` SMALLINT DEFAULT NULL COMMENT '是否是禁言',
PRIMARY KEY (`id`),
KEY `idx_group_member_user_id` (`user_id`),
KEY `idx_group_member_group_id` (`group_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '用户群组表';
sql
用户表 用户好友关系表 群组表 群组成员表
sql优化方案
1)应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null
可以在 num 上设置默认值 0,确保表中 num 列没有 null 值,然后这样查询:
select id from t where num=0
3)很多时候用 exists 代替 in 是一个好的选择
4)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤