数据库的一些基本命令

SHOW VARIABLES LIKE 'character%';//查询数据库的编码格式
CREATE DATABASE itcast; /*创建数据库*/
DROP DATABASE itcast; /*删除数据库*/
ALTER DATABASE itcast DEFAULT CHARACTER SET gbk COLLATE gbk_bin;
USE itcast;
CREATE TABLE tb_grade( /*创建表*/
id INT(11),
NAME VARCHAR(20),
grade FLOAT
);
SHOW TABLES; /*查看数据中所有的数据表*/
SHOW CREATE TABLE tb_grade; /*查看数据表*/
DESC _grade;
ALTER TABLE tb_grade RENAME _grade; /*修改表名*/
ALTER TABLE _grade CHANGE NAME usename VARCHAR(200); /*修改字段名*/
ALTER TABLE _grade MODIFY usename CHAR(20); /*修改字段的数据类型*/
ALTER TABLE _grade ADD age INT(20); /*添加字段*/
ALTER TABLE _grade DROP age; /*删除字段*/
ALTER TABLE _grade MODIFY usename CHAR(20) FIRST; /*修改字段的排列位置*/
ALTER TABLE _grade MODIFY usename CHAR(20) AFTER grade;
DROP TABLE _grade; /*删除数据表*/

/* 表的约束 */
CREATE TABLE example01(
id INT PRIMARY KEY, /*单字段主键*/
NAME VARCHAR(20),
grade FLOAT
);

/*在表中将stu_id 和 course_id 两个字段共同作为主键,两个字段组合可以唯一确定一条记录 */
CREATE TABLE example02(
stu_id INT,
course_id INT,
grade FLOAT,
PRIMARY KEY(stu_id,course_id) /*多字段主键*/
);
/*每个数据表中最多只能有一个主键约束,定义为primary key 的字段不能有重复值且不能为null*/

CREATE TABLE example04(
id INT PRIMARY KEY AUTO_INCREMENT, /*设置表的字段值自动增加*/
NAME VARCHAR(20) NOT NULL, /*非空约束*/
stu_id INT UNIQUE, /*唯一约束*/
grade FLOAT DEFAULT 0 /*默认约束*/
);

/* 索引 */
/*普通索引 是由key 或 index 定义的索引*/
CREATE TABLE t1(
id INT,
NAME VARCHAR(20),
score FLOAT,
INDEX(id) /*普通索引*/
);
EXPLAIN SELECT * FROM t4 WHERE id=1; /*查看索引是否被使用*/

/*唯一索引*/
CREATE TABLE t2(
id INT NOT NULL,
NAME VARCHAR(20) NOT NULL,
score FLOAT,
UNIQUE INDEX unique_id(id ASC) /*在id字段上建立索引名为unique_id的唯一索引 并且 按照升序排列*/
);

/*全文索引*/
CREATE TABLE t3 (
id INT NOT NULL,
NAME VARCHAR(20) NOT NULL,
score FLOAT,
FULLTEXT INDEX fulltext_name(NAME) /*在name字段建立索引名为fulltext_name的全文索引*/
)ENGINE=MYISAM;
/*目前只有MyISAM存储引擎支持全文索引,InnoDB存储引擎还不支持全文索引*/

/*单列索引 与 多列索引*/
CREATE TABLE t4(
id INT NOT NULL,
NAME VARCHAR(20) NOT NULL,
score FLOAT,
INDEX single_name(NAME(20)),/*name字段创建名称为single_name的单列索引,并且长度为20*/
INDEX multi(id,NAME(20)) /*多列索引*/
);
/*注意:在多列索引中,只有查询条件中使用了这些字段中的第一个字段是,多列索引才会被使用*/

/*空间索引*/
CREATE TABLE t6(
SPACE GEOMETRY NOT NULL,
SPATIAL INDEX sp(SPACE), /*创建空间索引时,所在字段的值不能为空值 而且只能在存储引擎为MyISAM的表中创建*/
)ENGINE = MYISAM;

/*方法一:使用create index语句在已经存在的表上创建索引*/
/*create [unique|fulltext|spatial] index 索引名 on 表名 (字段名[长度] [ASC|DESC])*/
CREATE TABLE book(
bookid INT NOT NULL,
bookname VARCHAR(255) NOT NULL,
author VARCHAR(255) NOT NULL,
info VARCHAR(255) NULL,
COMMENT VARCHAR(255) NULL,
publicyear YEAR NOT NULL
);
/*创建普通索引*/
CREATE INDEX index_id ON book(bookid);
/*创建唯一索引*/
CREATE UNIQUE INDEX uniqueidx ON book(bookid);
/*创建单列索引*/
CREATE INDEX singleidx ON book(COMMENT);
/*创建多列索引*/
CREATE INDEX multiidx ON book(author(20),info(20));
/*创建全文索引*/
DROP TABLE book;/*删除表book重新创建book 目前只有MyISAM存储引擎支持全文索引*/
CREATE TABLE book(
bookid INT NOT NULL,
bookname VARCHAR(255) NOT NULL,
author VARCHAR(255) NOT NULL,
info VARCHAR(255) NULL,
COMMENT VARCHAR(255) NULL,
publicyear YEAR NOT NULL
)ENGINE=MYISAM;
CREATE FULLTEXT INDEX fulltextidx ON book(info);
/*创建空间索引*/
CREATE TABLE t8(
SPACE GEOMETRY NOT NULL
)ENGINE=MYISAM;
CREATE SPATIAL INDEX spatidx ON t7(g);

/*方法二:使用ALTER TABLE语句在已经存在的表上创建索引*/
/*alter table 表名 add [unique | fulltext | spatial] index 索引名(字段名(长度) [ASc | DESC])*/
/*试例略*/

/*移除索引*/
/*使用ALTER TAVLE 删除索引*/
ALTER TABLE 表名 DROP INDEX 索引名
/*使用DROP INDEX 删除索引*/
DROP INDEX 索引名 ON 表名

/* 添加 更新 与删除数据 */
/*添加数据*/
USE itcast;
CREATE TABLE student(
id INT(4),
NAME VARCHAR(20) NOT NULL,
grade FLOAT
);
/*向表中添加一条数据 (可以不填字段名但必须对应)(可以指定字段添加数据)*/
INSERT INTO student(id,NAME,grade)VALUES(1,'zhang',98.5);
/*INSERT INTO student VALUES(1,'zhang',98.5);*/
/*insert 的其他用法*/
/*insert into student set id=5,name='pittle',grade=99;*/
/*向表中添加多条记录*/
INSERT INTO student(id,grade)VALUES(1,98.5),(2,90),(3,89);

/*更新数据*/
UPDATE 表名 SET 字段名1=值一[,字段名2=值二...][WHERE 条件表达式]
/*update 更新部分数据*/
UPDATE student SET NAME='kaola',grade=50 WHERE id = 1;
/*update 更新全部数据*/
UPDATE student SET grade=80;

/*删除数据*/
DELETE FROM 表名 [WHERE 条件表达式]
/*使用truncate删除表中所有数据*/
TRUNCATE [TABLE] 表名
/*truncate与delete多能实现删除表中所有数据的功能,但是两者有区别*/
/*1.delete是DML语句,truncate是DDL语句*/
/*DELETE后面可接条件语句,truncate只能删除所有数据*/
/*DELETE删除所有数据之后,再添加数据时从删除时该字段的最大值+1,truncate则重新从一开始*/
DDL data definition language DML data manipulation language
DDL:数据定义语言,用来维护数据库对象。
DML:用于增删改表中数据,DML是伴随TCL事务控制的。
所有的DML操作,需要再执行事务提交语句COMMIT才算真正确认了此操作。
演示:想testemp中插入一条记录
INSERT INTO testemp (id,name,gender) VALUES (1,'张三','M');
COMMIT;

/* 单表查询 */
/*select语句*/
SELECT [DISTINCT] * 字段名1,字段名2....
FROM 表名
[WHERE 条件表达式1]
[GROUP BY 字段名 [HAVING 条件表达式2]]
[ORDER BY 字段名 [ASC | DESC]]
[LIMIT [OFFSET] 记录数]
DROP TABLE student;
CREATE TABLE student(
id INT(3) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
grade FLOAT,
gender VARCHAR(10)
);
INSERT INTO student(NAME,grade,gender)
VALUES('songjiang',40,'男'),
('wuyong',100,'男'),
('qinming',90,'男'),
('husanniang',88,'女'),
('sunerniang',66,'女'),
('wusong',86,'男'),
('linchong',92,'男'),
('yanqing',90,NULL);
SELECT * FROM student; /*查询所有字段*/
SELECT NAME,gender FROM student; /*查询指定字段*/
/*按条件查询*/
SELECT * FROM student WHERE NAME = 'wuyong';
/*带IN关键字查询*/
SELECT * FROM student WHERE id IN(1,2,3);
SELECT * FROM student WHERE id NOT IN(1,2,3);
/*带between and 关键字查询*/
SELECT * FROM student WHERE id BETWEEN 2 AND 5;
SELECT * FROM student WHERE id NOT BETWEEN 2 AND 5;
/*空值查询*/
SELECT * FROM student WHERE gender IS NULL;
SELECT * FROM student WHERE gender IS NOT NULL;
/*带distinct关键字查询*/
SELECT DISTINCT gender FROM student; /*过滤重复记录的字段*/
SELECT DISTINCT gender,NAME FROM student; /*distinct作用于多个字段 只有多个字段都相同才是重复记录*/
/*带LIKE关键字查询*/
1.百分号(%)通配符(匹配所有)
SELECT id,NAME FROM student WHERE NAME LIKE 's%';
SELECT id,NAME FROM student WHERE NAME LIKE 'w%g';
SELECT id,NAME FROM student WHERE NAME LIKE '%y%';
2.下划线(_)通配符(一根下划线只匹配单个字符)
SELECT * FROM student WHERE NAME LIKE '____ing';
/*带AND的关键字的多条件查询*/
SELECT * FROM student WHERE id<5 AND gender='女';
SELECT * FROM student WHERE id IN(1,2,3) AND NAME LIKE '%ng' AND grade < 80;
/*带OR的关键字的多条件查询*/
SELECT * FROM student WHERE id < 3 OR gender='女';/*只需要满足任意条件多可以被查询出来*/
/*OR 和 AND 一起使用 先计算AND 再计算OR*/
SELECT * FROM student WHERE gender='女' OR gender='男' AND grade=100; /*AND 的优先级高于 OR*/


/* 高级查询 */
SELECT COUNT(*) FROM 表名; /*统计记录条数*/
SELECT SUM(字段名) FROM 表名; /*求表中某个字段的总和*/
SELECT AVG(字段名) FROM 表名; /*求表中某个字段的平均值*/
SELECT MAX(字段名) FROM 表名; /*求表中某个字段的最大值*/
SELECT MIN(字段名) FROM 表名; /*求表中某个字段的最小值*/
/*对查询结果排序*/
SELECT * FROM student ORDER BY grade; /* 默认排序ASC */
SELECT * FROM student ORDER BY gender ASC,grade DESC; /*此种情况先按gender升序,再按grade降序排列*/

/*分组查询*/
SELECT * FROM student GROUP BY gender;/*按照男、女、null分组只显示每个分组中的一条数据*/
/*GROUNP BY 和聚合函数一起使用*/
SELECT COUNT(*),gender FROM student GROUP BY gender;/*可以统计每个分组的个数*/
/*GROUNP BY 和 HAVING关键字一起使用*/
/*HAVING与WHERE关键字的作用相同 区别在于 HAVING可以接聚合函数 WHERE不能*/
SELECT SUM(grade),gender FROM student GROUP BY gender HAVING SUM(grade) < 300;
/*使用LIMIT限制查询结果的数量*/
SELECT * FROM student LIMIT 4; /* 查询表中前4条数据 只传一个参数偏移量为0的记录数*/
SELECT * FROM student LIMIT 4,4; /*limit 后面可以跟两个参数,第一参数表示偏移量,第二个参数表示记录数*/

/* 为表和字段取别名 */
SELECT * FROM 表名 [AS] 别名; /*为表取别名*/
SELECT * form student s;
SELECT 字段名 [AS] 别名,字段名 [AS] 别名 FROM student; /*为字段取别名*/
SELECT NAME n,gender g FROM student;

/* 多表操作 */
DROP TABLE student;
CREATE TABLE grade(
id INT(4) NOT NULL PRIMARY KEY,
NAME VARCHAR(36)
);
CREATE TABLE stu(
sid INT(4) NOT NULL PRIMARY KEY,
sname VARCHAR(36),
gid INT(4) NULL
);
/*为表添加外键约束(注意:建立外键的表必须是InnoDB型,mysql中只有InnoDB类型的表才支持外键)*/
/*alter table 表名 add constraint FK_ID foreign key(外键字段名) references 外表表名(主键字段名)*/
ALTER TABLE stu ADD CONSTRAINT FK_ID FOREIGN KEY(gid) REFERENCES grade(id); /*FK_ID为外键名*/
/*删除外键约束*/
ALTER TABLE stu DROP FOREIGN KEY FK_ID;
DESC stu;

/* 操作关联表 */
INSERT INTO grade(id,NAME)VALUES(1,'软件一班'),(2,'软件二班') ;
INSERT INTO stu VALUES(1,'王红',1),
(2,'李强',1),
(3,'赵四',2),
(4,'郝娟',2);
SELECT * FROM grade WHERE NAME = '软件一班';
DELETE FROM stu WHERE sname = '王红';
DELETE FROM grade WHERE id = 2;
/*两个具有关联关系的表中删除数据时,一定要先删除从表的数据,然后再删除主表数据,否则会报错*/
/*但是我刚刚试了,也可以先删除主表没有报错*/


/* 连接查询 */
/* 交叉连接 ---实际开发中这种业务很少见*/
SELECT * FROM 表1 CROSS JOIN 表2
CREATE TABLE department(
did INT(4) NOT NULL PRIMARY KEY,
dname VARCHAR(36)
);
CREATE TABLE employee(
id INT(4) NOT NULL PRIMARY KEY,
NAME VARCHAR(36),
age INT(2),
did INT(4) NOT NULL
);
INSERT INTO department VALUES(1,'网络部'),(2,'媒体部'),(3,'研发部'),(5,'人事部');
INSERT INTO employee VALUES(1,'王红',20,1),(2,'李强',22,1),(3,'赵四',20,2),(4,'郝娟',20,4);
/* 查询的结果为 用第一个表中的所有数据对应第二个表中的每一条数据*/
SELECT * FROM department CROSS JOIN employee;

/* 内连接 */
/*使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组成新的记录、
只有满足条件的记录才能出现在查询结果中*/
SELECT 查询字段 FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段
SELECT employee.name,department.dname FROM department JOIN employee ON department.did = employee.did;
/* 子连接 */
/*在一个连接查询中,涉及的两个表是同一个表,这种查询称为自连接查询
自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一个表,但逻辑上分为两个表*/
SELECT p1.*,p2.* FROM employee p1 JOIN employee p2 ON p1.did = p2.did WHERE p2.name = '王红';

/* 外连接 */
SELECT 所查字段 FROM 表1 LEFT|RIGHT [OUTER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段 WHERE 条件
/* LEFT JOIN
返回左表中所有记录和右表中满足条件的记录
*/
SELECT department.did,department.dname,employee.name FROM department LEFT JOIN employee
ON department.did = employee.did;
/* RIGHT JOIN
返回右表中所有记录和左表中满足条件的记录
*/
SELECT department.did,department.dname,employee.name FROM department RIGHT JOIN employee
ON department.did = employee.did;

/* 复合条件查询 */
SELECT employee.name,employee.age,department.dname FROM department
JOIN employee ON department.did = employee.did ORDER BY age;

/*带 IN 关键字的子查询 */
SELECT * FROM department WHERE did IN(SELECT did FROM employee WHERE age = 20);
SELECT * FROM department WHERE did NOT IN(SELECT did FROM employee WHERE age = 20);
/*带 EXISTS 关键字的子查询 */
/*只有当字查询结果有值时 才进行外层查询*/
SELECT * FROM department WHERE did EXISTS(SELECT did FROM employee WHERE age > 21);
/*带 ANY 关键字的子查询 和 带 ALL 关键字的子查询*/
/*在子查询的所有结果中选最小(大)的一个值与外层查询的值做比较,只要大于子查询结果中的最小(大)值就满足条件*/
SELECT * FROM department WHERE did > ANY(SELECT did FROM employee);
SELECT * FROM department WHERE did > ANY(SELECT did FROM employee);
/*带比较运算符的子查询 '<' '<=' '!=' */


//事务与存储过程
启动mysql数据库:在出来的DOS命令窗口中输入 net start mysql,或者使用快捷键Windows键(在键盘上有个Windows标志的按键)+ R直接输入net start mysql后回车。
或者直接右键window标志的按钮,然后点击运行

dos下登录mysql
H:\wamp\bin\mysql\mysql5.7.21\bin>mysql -h localhost -u root -p
在DOS命令窗口输入 mysql -hlocalhost -uroot -p回车 进入mysql数据库,
其中-h表示服务器名,localhost表示本地;
-u为数据库用户名,
root是mysql默认用户名;
-p为密码,如果设置了密码,可直接在-p后链接输入,如:-p123456,用户没有设置密码,
显示Enter password时,直接回车即可。
注意,如果你的mysql没有安装在C盘下,你需要先使用DOS命令进入mysql的安装目录下的bin目录中。以我的电脑为例,方法如下:输入D:进入D盘,在输入cd D:\Tools\MySQL5.5.25\bin进入到mysql的bin目录下才可以输入 mysql -hlocalhost -uroot -p

猜你喜欢

转载自www.cnblogs.com/pittle-z/p/11743160.html