mysql数据库,数据库,数据表
安装完mysql后,可以创建很多个数据库,每个数据库又可以有许多表
数据库的操作
- 登入,退出
mysql -h 127.0.0.1 -uroot -p #-h主机地址,-u用户名 -p密码
输入密码:
mysql -u用户名 -p密码 #直接带密码,少用
exit 退出
quit
ctrl+d
- 常用操作
show databases;#查看所有数据库
use database;#操作database数据库
select database();#查看当前使用的数据库
select version();#显示数据库版本
select now();#显示时间
show create database `student`;#查看创建数据库student的详细内容
- 创建数据库
create database 数据库名 参数 ...;#注意没有s
参数如
charset="utf8"
show create database xxx;#查看创建xxx数据库的语句
- 删除数据库
drop database 数据库名;#请谨慎操作
创建数据表
- show tables;查看当前数据库中的所有表
- 创建表语法create table …
创建语法
create table 数据表名字 (字段 类型 约束[, 字段 类型 约束]);
例如:
CREATE TABLE students(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,#unsigned表示无符号
`name` VARCHAR(30),#占用30个字符
age TINYINT UNSIGNED DEFAULT 0,
high DECIMAL(5,2),#小数值
gender ENUM('男','女','中性','保密') DEFAULT '保密',
cls_id INT UNSIGNED -- 班级id
);
- show create table 表名字;查看表的创建语句
- desc 表名字; #查看数据表结构
- 常用类型
int整形,char字符,enum枚举等
https://www.runoob.com/mysql/mysql-data-types.html
- 约束
– auto_increment表示自增
– not null 表示非空
– primary key 表示主键
– default 0 默认值为0
表的操作
表结构
- 修改表结构操作alter table…
-- alter table 表名 add 字段 类型 约束;
alter table students add birthday datetime;
- 修改字段alter table … modify(change)…
alter table 表名 modify 字段 类型及约束;
alter table 表名 change 原名 新名 类型及约束;
-- 修改表-修改字段:不重命名版
-- alter table 表名 modify 列名 类型及约束;
alter table students modify birthday date default '1997-01-01';
-- 修改表-修改字段:重命名版
-- alter table 表名 change 原名 新名 类型及约束;
alter table students change birthday birth date default '1997-01-01';
- 删除字段alter table … drop …
-- alter table 表名 drop 字段;
alter table students drop high;
- 删除表drop table …
--drop table 表名;
drop table students;
表的增删改查
- 增insert into…values
#1.全列插入,insert into 表名 values(...)
INSERT INTO demo VALUES(0,'苏',30,1,2)
"
第4个字段为枚举类型,enum('男','女','中性','保密')
1 表示 '男'
2 表示 '女'
3 表示 '中性'
4 表示 '保密'
"
#2.部分插入,insert into 表名(列1,...) values(值1,...)
INSERT INTO demo(id,`name`,age) VALUES(0,'林',25);
"
name在mysql中是关键字。
创建表时用了name作为字段,操作表的name字段时需要用``引起来表示区别。
id为主键,可用 0,null,default 来占位。
"
#3.多行插入,insert into 表名(列1,...) values(值1,...),(值2,...)
INSERT INTO demo(id,`name`,age) VALUES(0,'lin',30),(0,'诸葛',30);
- 删delete from
#1.物理删除,delete from 表名 where 条件
DELETE FROM demo WHERE id=13;
#2.逻辑删除
-- 用一个字段来表示 这条信息是否已经不能再使用了
-- 给demo表添加一个is_delete字段 int 类型 0 未删除 1 删除
ALTER TABLE demo ADD is_delete INT DEFAULT 0;
UPDATE demo SET is_delete = 1 WHERE id = 5;
- 改update…set
#update 表名 set 列1=值1,列2=值2... where 条件;
UPDATE demo SET age=28,gender=1 WHERE `name`='123';
- 查select…from
select 去重选项 字段列表[as 字段名] from 数据表 where [group by 子句] [having子句] [order by 子句] [limit子句];
#去除重复字段,只保留一个
SELECT DISTINCT age,`name` FROM demo;
#指定列,select 列1,列2,... from 表名;
select id,`name` from demo;
#可以使用as为列或表指定别名
SELECT id,`name` AS 姓名 FROM demo;
高级查询
- 条件查询select…from…where
select 去重选项 字段列表[as 字段名] from 数据表 where [group by 子句] [having子句] [order by 子句] [limit子句];
1 比较运算符 >,<,>=,<=,=,!=或者 <>表示非空不等于
SELECT id,`name` FROM demo WHERE age != 18;
2 逻辑运算符and,or,not
SELECT id,`name`,age FROM demo WHERE NOT age = 18;#非空不等于18岁
3 模糊查询,like配合%(一个或多个)或者 _(一个)使用
SELECT * FROM demo WHERE `name` LIKE '__%';#名字至少2个字
4 范围查询1 不连续 id in (1,3,8),括号内的关系是or关系
SELECT * FROM demo WHERE id IN (3,6,7);
SELECT * FROM demo WHERE id=3 OR id=6 OR id=7;查询结果相同
5 范围查询2 连续范围,闭合区间 between ... and ...
SELECT * FROM demo WHERE id BETWEEN 3 AND 7;查id为3,4,5,6,7
6 空判断 is null (注意与=''是2个概念)
SELECT * FROM demo WHERE age IS NULL;
- 聚合函数
count()计数
SELECT COUNT(*) FROM demo;
max()最大值
SELECT MAX(age) FROM demo;
min()最小值
SELECT MIN(age) FROM demo;
sum()求和
SELECT SUM(age) FROM demo WHERE gender=1;
avg()平均值,默认保留4位小数
SELECT AVG(age) FROM demo WHERE gender=1;
round(123.23 , 1)四舍五入 第二个参数保留几位小数
SELECT ROUND(AVG(age),2) FROM demo WHERE gender=1;
- 分组group by
1 按gender分组,显示gender,max(age) 这2列
SELECT gender AS 性别,MAX(age) FROM demo GROUP BY gender;
2 group_concat(...) 查看组内的成员信息name,age
SELECT gender AS 性别,GROUP_CONCAT(`name`,age) FROM demo GROUP BY gender;
性别 group_concat(`name`,age)
------ -----------------------------
(NULL) hu16,陈而他0,林25,lin30
男 Ghoo18,湖啊28,苏额30
女 hu16,丫头18,美33
保密 (NULL)
3 having分组之后的筛选
SELECT gender AS 性别,COUNT(*),GROUP_CONCAT(`name`) FROM demo GROUP BY gender HAVING COUNT(*)>2;
按性别分组后,分组数量大于2的组内姓名
性别 count(*) group_concat(`name`)
------ -------- ---------------------------
(NULL) 5 chen,hu,陈而他,林,lin
男 3 Ghoo,湖啊,苏额
女 3 hu,丫头,美
- order by 排序
1 order by 字段 asc(desc) -- asc升序,默认;desc降序
SELECT `name`,age FROM demo WHERE age>20 ORDER BY age DESC;
name age
------ --------
美 33
苏额 30
lin 30
湖啊 28
林 25
2 order by 字段1,字段2,...字段n
SELECT id,`name`,age FROM demo WHERE age>20 ORDER BY id,age DESC;
先按第一个order by条件排序,若第一个条件相同,按第二个条件排序。。。
id name age
------ ------ --------
7 湖啊 28
9 苏额 30
10 林 25
11 美 33
12 lin 30
- limit分页
1 limit i开始 n显示条数
i为开始的条数,默认为0;n为显示的条数
SELECT id,`name`,age FROM demo WHERE age>20 ORDER BY id LIMIT 0,2;
id name age
------ ------ --------
7 湖啊 28
9 苏额 30
2 制作分页limit (i-1)*n n
i表示第几页 n为每页的条目
- 连接查询inner join … on
1 select ... from 表A inner join 表B;
SELECT d.`id`,d.`name`,d.`class_id`,c.`id`,c.`NAME` FROM demo AS d INNER JOIN classes AS c ON d.class_id=c.`id`;
2个表的某个字段表示同一个意思,就可以通过连接查询,用as起别名,(表.字段)表示一个列
2 select ... from 表A left join 表B;
查询出来的结果按表B的顺序
- 子查询
1
SELECT * FROM demo WHERE age=(SELECT MAX(age) FROM demo);
2
SELECT * FROM demo WHERE class_id IN(SELECT id FROM classes);
找出demo表中class_id能够与classes表id对应的条目,in是非连续的范围
来源:https://blog.csdn.net/weixin_42344757/article/details/102609577