安装MYSQL
- 解压后
bin/mysql.exe 客户端程序
bin/mysqld.exe 服务端程序
bin/mysqldump - 创建自己用户及其其他配置;主机地址为127.0.0.1或者localhost;用户名和密码自己设置以便于下次登录;端口一般为默认3306.
操作数据库
命令操作
查看数据库编码:SHOW VARIABLES LIKE 'char%' 查看数据库所加载的所有信息,如下图所示:
通过命令窗口 登录mysql:mysql -hlocalhost -u用户名 -p密码 如下题所示:
查看数据库:SHOW DATABASES; 查看数据库所创建的所有信息,如下图:
打开数据库:USE 数据库名;
查看当前数据库下所有表:SHOW TABLES; 查看student al数据库下所有的表,如下:
创建数据库:CREATE DATABASE 数据库名;
基本操作
-- DDL :数据定义语言 create ,drop,alter,truncate(清空表),//用于检索或者修改数据。
-- DML :数据操作语言 select insert update delete//用于定义数组类型的结构,如增删改查
-- DCL :数据控制语言 grant(授权), revoke(回收权限)//用于定义数据库用户的权限。
-- TCL :事务控制语言 commit rollback
-- DQL :数据查询语言 select
建表
一个数据库中有多张表,每张表可能会有多条数据;
表分为行(row)和列(column)
create table 表名(
列名 数据类型,
列2名 数据类型,
...
);
如果表已经存在,则不执行;
create table if not exists 表名(
列名 数据类型,
列2名 数据类型,
...
);
比如创建一个学生表:
create table student(
id int,
name varchar(10),
sex char(1)
);
唯一主键
每张表只能有一个主键,主键的值必须是唯一且非空的;
create table 表名(
列名 数据类型 primary key,
列2名 数据类型,
...
);
创建学生表 (子表)
CREATE TABLE student
(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(30) NOT NULL,
scid INT,
FOREIGN KEY (scid) REFERENCES school(scid)-- 外键(与另外一个表所联系的键)
);
自增列
用来解决主键冲突问题,由于加了自增列的列有数据库维护,所以插入数据时不在写被维护的列;
在主键后加上:auto_increment
create table [if not exists] 表名{
列名 数据类型 约束,
...
}
约束类型:not null
:表示此列不能为空;unique
:表示此列的取值是惟一的;primary key
:唯一且非空,一个表只能有一个列为主键。
修改表:ALTER TABLE student ;ADD address VARCHAR(50)(给student表增加一列 列名为address).
删除表:drop table 表名;
- 清空表truncate:truncate table 表名;
AS 别名 可以省略:SELECT sid AS 学员编号, sname 学员姓名 FROM 表名;(不改变底层真正的名字)
表达式:SELECT 列名(+ - * /)某值 AS(可以省略) 编号 FROM 表名;
常量:SELECT 99 成绩,sid,sname,email FROM student;
多列拼接: select '姓名'||sname as 信息 from student;
SELECT CONCAT('姓名:',sname,';生日:',birthday) 学员信息 FROM student;(比较常用);
去除这一列的重复值:select distinct 去重的列 from 表;--
count(distinct 列名)
:取出并统计这一列的个数。
order by(排序):排序条件:列名、升序(asc)、降序(desc)
如果省略升降序默认为升序:select * from 表名 order by 列 [asc|desc] limit n(取前几条);
多列排序
先按照条件1排序,若条件1取值相同则按条件2排序。
select * from 表名 order by 排序条件1,排序条件2... [asc|desc]
having 也是过滤:where>group by>having>select>order by>limitSQL语句执行顺序
- 整数类型:tinyint(1个字节对应java的byte)、smallint(2个字节对应short)、int(4字节)、bigint(8字节对应long对应);
- 浮点类型:float、double;
- 定点小数:准确存储小数,但是花费资源较多,decimal(总位数,小数位数);
- 字符类型:
char(length) 表示最多存length个字符,定长 ,存储时,长度不足,用空格补齐;
varchar(length) 表示最多存10,存储时根据实际长度来存储; - 日期类型:
datetime(重要选错误后面运行时会出现类型异常栽过大跟头)
timestamp
常规指令(熟练)
增 (insert)
增加数据
注意值的个数与列的个数一致:insert into 表名(列1,列2...列n) values (值1,值2...值n);
一次插入记录:insert into student(name,sex) values(n1,s1),(n2,s2)...;
错误:列和值 个数不一致 INSERT INTO school(name,sex)VALUES('','');
-- 可以省略列名 但是注意必须全列个数插入 而且顺序必须要和表设计列一致
insert into school values(default,‘张三','男');
查(select 最重要)
语法:select 列名... from 表名 where 条件;
查询数据select 列1,列2... from 表名;
select*from 表名;查询所有表信息,不推荐使用。
select 列名 from 表名 where 条件(常用)
条件 and or in like(模糊查询) between...and
SELECT * FROM student WHERE sid>=2 AND scid=3;-- (且关系)
SELECT * FROM student WHERE sid=1 OR sid=2 OR sid=3-- (或关系)
SELECT * FROM student WHERE sid IN(1,2,3)-- (集合关系)
SELECT * FROM student WHERE sid BETWEEN 2 AND 3;-- (区间关系)
SELECT * FROM student WHERE sname LIKE '%张%';-- (****张****)
SELECT * FROM student WHERE sname LIKE '张%';-- (张******)
SELECT * FROM student WHERE sname LIKE '_张_';-- (*张*)
聚合函数 count avg sum max min
SELECT * FROM score;
SELECT COUNT(*) FROM score;
SELECT COUNT(*)总数,AVG(score)平均成绩,MIN(score)最低成绩,MAX(score)最高成绩 FROM score;
not in:
SELECT * FROM school WHERE scid NOT IN( SELECT DISTINCT scid FROM student)
is null:
SELECT * FROM student WHERE tel IS NULL;
SELECT * FROM student WHERE tel IS NOT NULL;
分组查询 group by:
-- 查询每个科目中最高成绩 ,平均成绩,最低成绩
SELECT cid, MAX(score) 最高成绩,AVG(score)平均成绩
FROM score
GROUP BY cid -- 按科目分组
-- ------------------------
-- 查询平均成绩大于70分的科目成绩
SELECT cid, MAX(score) 最高成绩,AVG(score)平均成绩
FROM score
GROUP BY cid -- 按科目分组
HAVING AVG(score)>70
asc 升序(默认) desc 降序:SELECT * FROM score ORDER BY score ASC;
关联查询 内连接 左外连接 右外连接(了解熟悉一下)
DESC 表明.....查看表结构。
删(delete)
语法:delete from 表名;
//删除所有记录------------删除指定列:delete from 表名 where 条件;
delete from student where sid=4 OR sid=5; -- 注意添加条件where
只删除指定记录
删除student表中id=6的记录:
delete from student where id=6;
删除列:alter table 表名 drop 列名;
改(update)
语法:update 表名 set 列名=新值;
把所有记录都会修改
修改指定列:update 表名 set 列名=新值 where 条件;
例子:
--修改 一列
update person set sex='男' where id=1;
-- 同时修改多列
UPDATE student
SET tel='13566666666',scid=3
WHERE sname='张飞';
多表结构和连接查询、子查询(sub query)--------后续了解.