MYSQL基础

一、

1、打开mysql服务

sudo service mysql start

2、root用户登录

mysql -uroot

3、查看数据库

show databases;

4、选择连接库

use <数据库名>

5、查看当前正在使用的库

select database();

6、查看表

show tables;

7、退出

quit或者exit

二、

1、新建数据库

出于严谨,而且便于区分保留字和变量名,保留字大写,变量和数据小写

CREATE DATABASE <数据库名字>;  

2、新建数据表

CREATE TABLE 表的名字

(

列名a 数据类型(数据长度),

列名b 数据类型(数据长度),

列名c 数据类型(数据长度)

);

  数据类型

  CHAR 和 VARCHAR 的区别: 

  CHAR 的长度是固定的,而 VARCHAR 的长度是可以变化的,比如,存储字符串 “abc",对于 CHAR(10),表示存储的字符将占 10 个字节(包括 7 个空字符),而同样的 VARCHAR(12) 则只占用4个字节的长度,增加一个额外字节来存储字符串本身的长度,12 只是最大值,当你存储的字符小于 12 时,按实际长度存储。

  ENUM和SET的区别: 

  ENUM 类型的数据的值,必须是定义时枚举的值的其中之一,即单选,而 SET 类型的值则可以多选。

  想要了解更多关于 MySQL 数据类型的信息,可以参考下面两篇博客。

    https://www.cnblogs.com/bukudekong/archive/2011/06/27/2091590.html

    https://blog.csdn.net/anxpp/article/details/51284106#comments

3、插入数据

INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1,值2,值3);

  数据类型是 CHAR、VARCHAR、TEXT、DATE、TIME、ENUM 等的数据需要用单引号修饰,而 INT,FLOAT,DOUBLE 等则不需要。

三、SQL约束

CREATE DATABASE mysql_shiyan;

use mysql_shiyan;

CREATE TABLE department
(
dpt_name CHAR(20) NOT NULL,
people_num INT(10) DEFAULT '10',
CONSTRAINT dpt_pk PRIMARY KEY (dpt_name)#dpt_pk主键名(自定义)
);

CREATE TABLE employee
(
id INT(10) PRIMARY KEY,#主键
name CHAR(20),
age INT(10),
salary INT(10) NOT NULL,
phone INT(12) NOT NULL,
in_dpt CHAR(20) NOT NULL,
UNIQUE (phone),
CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name)#emp_fk外键名字(自定义),in_dpt为外键,参考列为department表的dpt_name列。
);

CREATE TABLE project
(
proj_num INT(10) NOT NULL,
proj_name CHAR(20) NOT NULL,
start_date DATE NOT NULL,
end_date DATE DEFAULT '2015-04-01',
of_dpt CHAR(20) REFERENCES department(dpt_name),
CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name)#proj_pk主键名字(自定义),proj_num,proj_name复合主键
);

AUTO_INCREMENT 自增

四、SELECT语句

建表语句
CREATE DATABASE mysql_shiyan;

use mysql_shiyan;

CREATE TABLE department
(
dpt_name CHAR(20) NOT NULL,
people_num INT(10) DEFAULT '10',
CONSTRAINT dpt_pk PRIMARY KEY (dpt_name)
);

CREATE TABLE employee
(
id INT(10) PRIMARY KEY,
name CHAR(20),
age INT(10),
salary INT(10) NOT NULL,
phone INT(12) NOT NULL,
in_dpt CHAR(20) NOT NULL,
UNIQUE (phone),
CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name)
);

CREATE TABLE project
(
proj_num INT(10) NOT NULL,
proj_name CHAR(20) NOT NULL,
start_date DATE NOT NULL,
end_date DATE DEFAULT '2015-04-01',
of_dpt CHAR(20) REFERENCES department(dpt_name),
CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name)
);

插入数据

#INSERT INTO department(dpt_name,people_num) VALUES('部门',人数);

INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);
INSERT INTO department(dpt_name,people_num) VALUES('dpt2',12);
INSERT INTO department(dpt_name,people_num) VALUES('dpt3',10);
INSERT INTO department(dpt_name,people_num) VALUES('dpt4',15);


#INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(编号,'名字',年龄,工资,电话,'部门');

INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(01,'Tom',26,2500,119119,'dpt4');
INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(02,'Jack',24,2500,120120,'dpt2');
INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(03,'Rose',22,2800,114114,'dpt3');
INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(04,'Jim',35,3000,100861,'dpt1');
INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(05,'Mary',21,3000,100101,'dpt2');
INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(06,'Alex',26,3000,123456,'dpt1');
INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(07,'Ken',27,3500,654321,'dpt1');
INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(08,'Rick',24,3500,987654,'dpt3');
INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(09,'Joe',31,3600,110129,'dpt2');
INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(10,'Mike',23,3400,110110,'dpt4');
INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(11,'Jobs',3600,019283,'dpt2');
INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(12,'Tony',3400,102938,'dpt3');

#INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(编号,'工程名','开始时间','结束时间','部门名');

INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(01,'proj_a','2015-01-15','2015-01-31','dpt2');
INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(02,'proj_b','2015-01-15','2015-02-15','dpt1');
INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(03,'proj_c','2015-02-01','2015-03-01','dpt4');
INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(04,'proj_d','2015-02-15','2015-04-01','dpt3');
INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(05,'proj_e','2015-02-25','2015-03-01','dpt4');
INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(06,'proj_f','2015-02-26','2015-03-01','dpt2');

基本格式:SELECT 要查询的列名 FROM 表名字 WHERE 限制条件;

1、查询表的所有内容

SELECT * FROM 表名字 WHERE 限制条件;

2、IN 和 NOT IN

  IN 用于筛选“在”某个范围内的结果

  NOT IN 用于筛选“不在”某个范围内的结果

3、通配符

关键字 LIKE 可用于实现模糊查询,常见于搜索功能中。

和 LIKE 联用的通常还有通配符,代表未知字符。

SQL中的通配符是 _ 和 % 。其中 _ 代表一个未指定字符,% 代表不定个未指定字符

4、对结果排序

 ORDER BY 对结果按某一列来排序

默认情况下,ORDER BY 的结果是升序排列,而使用关键词 ASC 和 DESC可指定升序或降序排序

5、SQL 内置函数和计算

 SQL 有 5 个内置函数,这些函数都对 SELECT 的结果做操作:

 COUNT:计数,可用于任何数据类型

SUM:求和,只能对数字类数据类型做计算

AVG:求平均值,只能对数字类数据类型做计算

MAX:最大值,可用于数值、字符串或是日期时间数据类型

MIN:最小值,可用于数值、字符串或是日期时间数据类型

6、子查询

    

想要知道名为 "Tom" 的员工所在部门做了几个工程。员工信息储存在 employee 表中,但工程信息储存在 project 表中。

SELECT of_dpt,COUNT(proj_name) AS count_project FROM project GROUP BY of_dpt HAVING of_dpt IN (SELECT in_dpt FROM employee WHERE name='Tom');

HAVING 关键字的作用和 WHERE 是一样的,都是说明接下来要进行条件筛选操作。区别在于 HAVING 用于对分组后的数据进行筛选

 

7、连接查询

在处理多个表时,子查询只有在结果来自一个表时才有用。但如果需要显示两个表或多个表中的数据,这时就必须使用连接 (join) 操作。 连接的基本思想是把两个或多个表当作一个新的表来操作,如下:

各员工所在部门的人数,其中员工的 id 和 name 来自 employee 表,people_num 来自 department 表:

SELECT id,name,people_num FROM employee,department WHERE employee.in_dpt = department.dpt_name ORDER BY id;

或:

SELECT id,name,people_num FROM employee JOIN department ON employee.in_dpt = department.dpt_name ORDER BY id;

使用连接查询的方式,查询出各员工所在部门的人数与工程数,工程数命名为 count_project。(连接 3 个表,并使用 COUNT 内置函数)

分组不可或缺,否则会出现无意义的数据(一般来说连接查询语句中有 COUNT 就会有 GROUP BY)

正解

 mysql> SELECT name, people_num, COUNT(proj_name) AS count_project -> FROM employee, department, project -> WHERE in_dpt = dpt_name AND of_dpt = dpt_name -> GROUP BY name, people_num;

五、数据库及表的修改和删除

1、删除数据库

DROP DATABASE test_01;

2、重命名一张表

RENAME TABLE 原名 TO 新名字;

或:

ALTER TABLE 原名 RENAME 新名;

或:

ALTER TABLE 原名 RENAME TO 新名;

3、删除一张表

DROP TABLE 表名字;

4、增加一列(新增加的列,被默认放置在这张表的最右边)

ALTER TABLE 表名字 ADD COLUMN 列名字 数据类型 约束;

或:

ALTER TABLE 表名字 ADD 列名字 数据类型 约束;

ALTER TABLE employee ADD height INT(4) DEFAULT 170;

   提醒:语句中的 INT(4) 不是表示整数的字节数,而是表示该值的显示宽度,如果设置填充字符为 0,则 170 显示为 0170

5、增加一列(增加的列插入在指定位置)

需要在语句的最后使用AFTER关键词(“AFTER 列1” 表示新增的列被放置在 “列1” 的后面)。

ALTER TABLE employee ADD weight INT(4) DEFAULT 120 AFTER age;

6、增加一列(放在第一列的位置)

使用 FIRST 关键词

ALTER TABLE employee ADD test INT(10) DEFAULT 11 FIRST;

 7、删除一列

ALTER TABLE 表名字 DROP COLUMN 列名字;

或:

ALTER TABLE 表名字 DROP 列名字;

8、重命名一列

ALTER TABLE 表名字 CHANGE 原列名 新列名 数据类型 约束;

注意:这条重命名语句后面的 “数据类型” 不能省略,否则重命名失败。

9、改变数据类型

ALTER TABLE 表名字 CHANGE 原列名 新列名 数据类型 约束;(当原列名和新列名相同的时候,指定新的数据类型或约束,就可以用于修改数据类型或约束。

或:
ALTER TABLE 表名字 MODIFY 列名字 新数据类型;
需要注意的是,修改数据类型可能会导致数据丢失,所以要慎重使用。

 10、修改表中某个值

UPDATE 表名字 SET 列1=值1,列2=值2 WHERE 条件;

注意:一定要有 WHERE 条件,否则会出现你不想看到的后果

11、删除一行记录

DELETE FROM 表名字 WHERE 条件;
注意: 删除表中的一行数据,也必须加上 WHERE 条件

六、其他基本操作

1、索引:可以加快查询速度

  对一张表中的某个列建立索引

  ALTER TABLE 表名字 ADD INDEX 索引名 (列名);

  或:

  CREATE INDEX 索引名 ON 表名字 (列名);

  查看新建的索引

  SHOW INDEX FROM 表名字; 

在使用 SELECT 语句查询的时候,语句中 WHERE 里面的条件,会自动判断有没有可用的索引。

2、视图:是一种虚拟存在的表

  创建视图的语句格式为:

  CREATE VIEW 视图名(列a,列b,列c) AS SELECT 列1,列2,列3 FROM 表名字;

3、导入:从文件中导入数据到表  

  导入一个纯数据文件 

 LOAD DATA INFILE '文件路径和文件名' INTO TABLE 表名字;

 SQL 语句的导入方式

  source *.sql 

4、导出:从表中导出到文件中

SELECT 列1,列2 INTO OUTFILE '文件路径和文件名' FROM 表名字;

  注意:语句中 “文件路径” 之下不能已经有同名文件。

5、备份:mysqldump 备份数据库到文件

  备份与导出的区别:导出的文件只是保存数据库中的数据;而备份,则是把数据库的结构,包括数据、约束、索引、视图等全部另存为一个文件。

  mysqldump -u root 数据库名>备份文件名; #备份整个数据库

  mysqldump -u root 数据库名 表名字>备份文件名; #备份整个表

6、恢复:从文件恢复数据库

 source *.sql 

或:

  CREATE DATABASE test; #新建一个名为test的数据库

 mysql -u root test < bak.sql#退出 MySQL,然后输入语句进行恢复,把备份的 bak.sql 恢复到 test 数据库:

做个题吧(新东方的面试题)

现有三张库表,分别为账号表Account、考试成绩表Exam、课程信息表Course,字段定义如下:

写sql输出高三年级人数大于50人的班的各学科平均分,按班级人数降序排序,查询结果形如下表:

SELECT 班级,班级人数,考试科目,班级平均分 from (select account.class as 班级,exam.course as 考试科目,avg(exam.score)as 班级平均分 from account join exam
on account.ID = exam.ID and account.class like '高三%' and account.class in(select class from account group by class having count(class)>50)
group by exam.course,account.class) as a join (select class,count(*)AS 班级人数 FROM account GROUP BY class HAVING count(class)>50) as b on a.班级=b.class ORDER BY 班级人数 DESC ;

优化:

select a.class,b.count,c.course,avg(score) FROM
account a
INNER JOIN
(select class,count(1) count from account where class like '高三%' group by class HAVING count(1)>50) b
on a.class=b.class
INNER JOIN
exam c
ON
c.id=a.id
group by a.class,c.course
order by b.count desc

有人说这个题目都不严谨,你发现了吗






 

 

 

 
























































原文地址:https://www.cnblogs.com/suitcases/p/11339256.html