update user set password=password('123456')where user='root'; --修改密码 flush privileges; --刷新数据库权限 show databases; --显示所有数据库 use dbname; --打开某个数据库 create database [if not exists] 数据库名; --创建数据库 drop database [if exists] 数据库名; --删除数据库 show tables; --显示数据库 mysql 中所有的表 desc user; --显示表user 表的信息 create database name; --创建数据库 use databasename; --选择数据库 -- 单行注释 /* 多行注释 */
CREATE DATABASE 数据库名;
DROP DATABASE<name>
SHOW DATABASES;
desc student;
USE 数据库名; CREATE TABLE name( prj_num char(8) PRIMART KEY, prj_name varchar(50), start_date datetime, end_date datetime, prj_status bit, );
ALTER TABLE 表名 ADD 新列名 varchar(10); --添加列 ALTER TABLE 表名 DROP COLUMN 列名; --删除列
DROP TABLE name;
use 数据库名; show tables;
select * from 表名;--查询表;
select sno FROM student; -- 查询student表的sno列
datediff(datepart,date1,date2)--格式 例子 SELECT datediff(day,start_date,end_date) FROM 表名;
sno sname ssex sbirthday speiality tc 196001 董明霞 女 1999-03-10 通信 50 196002 李茜 女 1998-07-25 通信 54 196004 周俊文 男 1998-07-25 NULL 52 196005 张三 男 1999-08-25 计算机 55 196006 李四 男 2000-01-01 工商 55
insert into student values (196006,"李四","男","2000-01-01","工商",55);
insert into student values (196006,"李四","男","2000-01-01","工商",55);
delete from student1 where tc="48";--删除了表student1中tc为48的一行;
update student set speiality="计算机" where sno="196004";
修改后的表student
sno |sname|ssex|sbirthday |speiality|tc| ------+-----+----+----------+---------+--+ 196001|董明霞 |女 |1999-03-10|通信 |50| 196002|李茜 |女 |1998-07-25|通信 |54| 196004|周俊文 |男 |1998-07-25|计算机 |52| 196005|张三 |男 |1999-08-25|计算机 |55| 196006|李四 |男 |2000-01-01|工商 |55|
create table user( id int, name varchar(20), password varchar(20), primary key(id,name)--两个主键 ); -- 插入数据 insert into user values(1,"张三","123"); insert into user values(2,"张三","123");--可以运行,因为是两个主键,两个主键都重复就不能运行了
外键约束
自增约束
alter table user add primary key(id);--添加主键
alter table user drop primary key;--删除
alter table user4 modify id int primary key;--使用modify修改字段,添加约束
非空约束
默认约束
create table user1( id int, name varchar(20), age int default 10 -- 年龄默认为10 ); insert into user1 values(1,"zhangsan");--不写默认值,默认为10 insert into user1 values(1,"zhangsan",19);--写上19就把默认改为19 /*user1表 Field|Type |Null|Key|Default|Extra| -----+-----------+----+---+-------+-----+ id |int |YES | | | | name |varchar(20)|YES | | | | age |int |YES | |10 | |*/
INF
数据表中所有子段都是不可分割的原子值
create table fanshi( id int primary key, name varchar(20), address varchar(30) ); insert into fanshi values(1,"张三","中国河北省沧州市"); insert into fanshi values(2,"李四","中国河北省保定市"); insert into fanshi values(3,"王五","中国河北省石家庄"); /*id|name|address | --+----+--------+ 1|张三 |中国河北省沧州市| 2|李四 |中国河北省保定市| 3|王五 |中国河北省石家庄| */
上面的表中adress还可以在分成中国,河北省,沧州市,就不满足第一范式.
create table fanshi( id int primary key, name varchar(20), cuntry varchar(30), privence varchar(30), city varchar(30), ); insert into fanshi2 values(3,"王五","中国","河北省","邢台市"); insert into fanshi2 values(3,"王五","中国","河北省","邢台市"); insert into fanshi2 values(3,"王五","中国","河北省","邢台市"); /*表 id|name|cuntry|privence|ciey| --+----+------+--------+----+ 1|张三 |中国 |河北省 |沧州市 | 2|李四 |中国 |河北省 |保定市 | 3|王五 |中国 |河北省 |邢台市 |*/
create table myorder( product_id int, customer_id int, product_name varchar(20), customer_name varchar(20),--不满足第二范式,因为customer_name只跟主键customer_id有关,与主键product_id无关 primary key(product_id,customer_id) ); 分成三个表就行了
只要非主键内部存在传递依赖,就不满足第三范式。
创建表
create table student( sno varchar(20) primary key, sname varchar(20) not null, ssex varchar(10) not null, sbirthday datetime, class varchar(20) ); insert into student values("101","曾华","男","1977-09-01"."95033"); /*sno|sname|ssex|sbirthday |class| ---+-----+----+-------------------+-----+ 101|曾华 |男 |1977-09-01 00:00:00|95033| 102|曾华2 |男 |1977-09-01 00:00:00|95031| 103|曾华3 |女 |1977-09-01 00:00:00|95033| 104|曾华4 |男 |1977-09-01 00:00:00|95033| 105|曾华5 |女 |1977-09-01 00:00:00|95031| 106|曾华6 |男 |1977-09-01 00:00:00|95031| 107|曾华7 |男 |1977-09-01 00:00:00|95033| 108|曾华8 |男 |1977-09-01 00:00:00|95031| 109|曾华9 |男 |1974-06-03 00:00:00|95031|*/
create table course( cno varchar(20) primary key, cname varchar(20) not null, tno varchar(20) not null, foreign key(tno) references teacher(tno) -- 外键 ); /* cno |cname|tno| -----+-----+---+ 3-105|计算机导论|825| 3-245|操作系统 |804| 6-166|数字电路 |856| 9-888|高等数学 |831|
create table score( sno varchar(20) primary key, cno varchar(20) not null, degree decimal, foreign key(sno) references student(sno), foreign key(cno) references course(cno) ); /* sno|cno |degree| ---+-----+------+ 103|3-105| 92| 103|3-245| 86| 103|6-166| 85| 105|3-105| 88| 105|3-245| 75| 105|6-166| 79| 109|3-105| 76| 109|3-245| 68| 109|6-166| 81|
create table teacher( tno varchar(20) primary key, tname varchar(20) not null, tsex varchar(10) not null, tbirthday datetime, prof varchar(20) not null, depart varchar(20) not null ); /* tno|tname|tsex|tbirthday |prof|depart| ---+-----+----+-------------------+----+------+ 804|李诚 |男 |1958-12-02 00:00:00|副教授 |计算机系 | 825|王萍 |女 |1972-05-05 00:00:00|助教 |计算机系 | 831|刘冰 |女 |1977-08-14 00:00:00|助教 |电子工程系 | 856|张旭 |男 |1969-03-12 00:00:00|讲师 |电子工程系 |
select * from student;
2.查询 student 表中的 sname、ssex 和 class 字段的所有行
select sname,ssex,class from student;
-- distinct: 去重查询 select distinct depart from teacher;-- 去除teacher表中depart列重复的;
select * from score where degree between 60 and 80; --或者下面这条语句也可以查询出来 -- and 表示并且 select * from score where degree >60 and degree <80; /*sno|cno |degree| ---+-----+------+ 105|3-245| 75| 105|6-166| 79| 109|3-105| 76| 109|3-245| 68|*/
-- 或的关系用in select * from score where degree in(85,86,88); /* sno|cno |degree| ---+-----+------+ 103|3-245| 86| 103|6-166| 85| 105|3-105| 88|*/
-- or表示或者 select * from student where class="95031" or ssex="女"; /* sno|sname|ssex|sbirthday |class| ---+-----+----+-------------------+-----+ 102|曾华2 |男 |1977-09-01 00:00:00|95031| 103|曾华3 |女 |1977-09-01 00:00:00|95033| 105|曾华5 |女 |1977-09-01 00:00:00|95031| 106|曾华6 |男 |1977-09-01 00:00:00|95031| 108|曾华8 |男 |1977-09-01 00:00:00|95031| 109|曾华9 |男 |1974-06-03 00:00:00|95031|*/
-- DESC: 降序,从高到低 -- ASC(默认): 升序,从低到高 -- order by select * from student order by class desc;
-- 条件靠前的优先级高 select* from score order by cno asc,degree desc;
--统计 count select count(*) from student where class="95031"; /* count(*)| --------+ 5|
--子查询 select sno,cno,from score where degree=(select max(degree)from score); --排序查询 -- 降序排序, -- LIMIT r, n: 表示从第r行开始,查询n条数据 select sno,cno,degree from score order by degree desc limit 0,1; /* sno|cno | ---+-----+ 103|3-105|
-- avg() select avg(degree) from score where cno="3-105" ; /* avg(degree)| -----------+ 85.3333| */ select avg(degree) from score where cno="6-166" ; /* avg(degree)| -----------+ 81.6667|*/ select avg(degree) from score where cno="3-245" ; 写在一个sql语句中 -- group by 分组 select cno,avg(degree) from score group by cno; /* cno |avg(degree)| -----+-----------+ 3-105| 85.3333| 3-245| 76.3333| 6-166| 81.6667|*/
-- -- LIKE 表示模糊查询,"%" 是一个通配符,匹配 "3" 后面的任意字符。 select cno,avg(degree),count(*) from score group by cno having count(cno)>=2 and cno like "3%"; /* cno |avg(degree)|count(*)| -----+-----------+--------+ 3-105| 85.3333| 3| 3-245| 76.3333| 3|*/
select sno,degree from score where degree between 70 and 90; 或者 select sno,degree from score where degree>=70 and degree<=90; /* sno|degree| ---+------+ 103| 86| 103| 85| 105| 88| 105| 75| 105| 79| 109| 76| 109| 81|*/
-- 来自于不同的表 select sname from student; /* sname| -----+ 曾华 | 曾华2 | 曾华3 | 曾华4 | 曾华5 | 曾华6 | 曾华7 | 曾华8 | 曾华9 |*/ select sno,sname from student; /* sno|sname| ---+-----+ 101|曾华 | 102|曾华2 | 103|曾华3 | 104|曾华4 | 105|曾华5 | 106|曾华6 | 107|曾华7 | 108|曾华8 | 109|曾华9 |*/ select sno,cno,degree from score; /* sno|cno |degree| ---+-----+------+ 103|3-105| 92| 103|3-245| 86| 103|6-166| 85| 105|3-105| 88| 105|3-245| 75| 105|6-166| 79| 109|3-105| 76| 109|3-245| 68| 109|6-166| 81|*/ 通过分析俩表有共同的sno select sname,cno,degree from student,score where student.sno=score.sno; /*sname|cno |degree| -----+-----+------+ 曾华3 |3-105| 92| 曾华3 |3-245| 86| 曾华3 |6-166| 85| 曾华5 |3-105| 88| 曾华5 |3-245| 75| 曾华5 |6-166| 79| 曾华9 |3-105| 76| 曾华9 |3-245| 68| 曾华9 |6-166| 81|*/
-- 查找course表和score表; select cno,cname from course; /* cno |cname| -----+-----+ 3-105|计算机导论| 3-245|操作系统 | 6-166|数字电路 | 9-888|高等数学 |*/ select cno,sno,degree from score; /* cno |sno|degree| -----+---+------+ 3-105|103| 92| 3-245|103| 86| 6-166|103| 85| 3-105|105| 88| 3-245|105| 75| 6-166|105| 79| 3-105|109| 76| 3-245|109| 68| 6-166|109| 81|*/ 有相同的cno select cname,sno,degree from course,score where course.cno=score.cno; /* cname|sno|degree| -----+---+------+ 计算机导论|103| 92| 计算机导论|105| 88| 计算机导论|109| 76| 操作系统 |103| 86| 操作系统 |105| 75| 操作系统 |109| 68| 数字电路 |103| 85| 数字电路 |105| 79| 数字电路 |109| 81|*/
通过分析,三列分别来自来自三张表
select sname,cname,degree from score,student,course where student.sno=score.sno and course.cno=score.cno; /* sname|cname|degree| -----+-----+------+ 曾华3 |计算机导论| 92| 曾华3 |操作系统 | 86| 曾华3 |数字电路 | 85| 曾华5 |计算机导论| 88| 曾华5 |操作系统 | 75| 曾华5 |数字电路 | 79| 曾华9 |计算机导论| 76| 曾华9 |操作系统 | 68| 曾华9 |数字电路 | 81| */
select cno,avg(degree) from score where sno in (select sno from student where class="95031") group by cno; /* cno |avg(degree)| -----+-----------+ 3-105| 82.0000| 3-245| 71.5000| 6-166| 80.0000| */
-- 先查询出109同学,3-105的成绩 select * from score where sno= "109" and cno="3-105"; /* sno|cno |degree| ---+-----+------+ 109|3-105| 76|*/ select * from score where cno="3-105"and degree >(select degree from score where sno="109" and cno="3-105") ; /* sno|cno |degree| ---+-----+------+ 103|3-105| 92| 105|3-105| 88|
-- YEAR(..): 取出日期中的年份 -- 先查找101,108学生的出生年份 select year(sbirthday) from student where sno in(101,108); /* year(sbirthday)| ---------------+ 1977| 1977|*/ select sno,sname,sbirthday from student where year(sbirthday) in (select year(sbirthday) from student where sno in(101,108) ); -- 因为条件查询的是两个年份,所以用in
-- 先查张旭的老师号 select tno from teacher where tname="张旭"; /* tno| ---+ 856|*/ -- 在通过tno查张旭的课程号 select cno from course where tno=(select tno from teacher where tname="张旭"); /*cno | -----+ 6-166|*/ select * from score where cno=(select cno from course where tno=(select tno from teacher where tname="张旭")); /* sno|cno |degree| ---+-----+------+ 103|6-166| 85| 105|6-166| 79| 109|6-166| 81|*/
-- 先查询teacher表中的计算机系对应的tno select tno from teacher where depart="计算机系"; /* tno| ---+ 804| 825|*/ -- 再查询course表计算机系对应的cno select cno from course where tno in(select tno from teacher where depart="计算机系"); /* cno | -----+ 3-245| 3-105|*/ -- 通过cno找到所有的成绩 select * from score where cno in (select cno from course where tno in (select tno from teacher where depart="计算机系" )); /* sno|cno |degree| ---+-----+------+ 103|3-245| 86| 105|3-245| 75| 109|3-245| 68| 103|3-105| 92| 105|3-105| 88| 109|3-105| 76|*/
-- 使用函数 YEAR(NOW()) 计算出当前年份,减去出生年份后得出年龄。 SELECT name, YEAR(NOW()) - YEAR(birthday) as age FROM student; /* sname|age| -----+---+ 曾华 | 44| 曾华2 | 44| 曾华3 | 44| 曾华4 | 44| 曾华5 | 44| 曾华6 | 44| 曾华7 | 44| 曾华8 | 44| 曾华9 | 47|*/
SELECT MAX(sbirthday), MIN(birthday) FROM student; /* MAX(sbirthday) |MIN(sbirthday) | -------------------+-------------------+ 1977-09-01 00:00:00|1974-06-03 00:00:00|*/
1.查询最高分同学的 score 表。
-- 先查询score表的最高分 select max(degree) from score; /* max(degree)| -----------+ 92|*/ -- 最高分可以有多个,本次查询刚好只有一个,没有并列的; select * from score where degree = (select max(degree) from score); /* sno|cno |degree| ---+-----+------+ 103|3-105| 92|*/
sno|sname|ssex|sbirthday |class| ---+-----+----+-------------------+-----+ 101|曾华 |男 |1977-09-01 00:00:00|95033| 102|匡明 |男 |1977-09-01 00:00:00|95031| 103|王丽 |女 |1977-09-01 00:00:00|95033| 104|李军 |男 |1977-09-01 00:00:00|95033| 105|王芳 |女 |1977-09-01 00:00:00|95031| 106|陆军 |男 |1977-09-01 00:00:00|95031| 107|王尼玛 |男 |1977-09-01 00:00:00|95033| 108|张全蛋 |男 |1977-09-01 00:00:00|95031| 109|赵铁柱 |男 |1974-06-03 00:00:00|95031| 110|张飞 |男 |1974-06-03 00:00:00|95038|
select * from student where sname not like "王%"; /* sno|sname|ssex|sbirthday |class| ---+-----+----+-------------------+-----+ 101|曾华 |男 |1977-09-01 00:00:00|95033| 102|匡明 |男 |1977-09-01 00:00:00|95031| 104|李军 |男 |1977-09-01 00:00:00|95033| 106|陆军 |男 |1977-09-01 00:00:00|95031| 108|张全蛋 |男 |1977-09-01 00:00:00|95031| 109|赵铁柱 |男 |1974-06-03 00:00:00|95031| 110|张飞 |男 |1974-06-03 00:00:00|95038|*/
-- desc降序 asc(默认)升序一般不用写 -- 不写默认为升序 select * from student order by class desc,sbirthday; /* sno|sname|ssex|sbirthday |class| ---+-----+----+-------------------+-----+ 110|张飞 |男 |1974-06-03 00:00:00|95038| 103|王丽 |女 |1976-02-20 00:00:00|95033| 107|王尼玛 |男 |1976-02-20 00:00:00|95033| 104|李军 |男 |1977-02-20 00:00:00|95033| 101|曾华 |男 |1977-09-01 00:00:00|95033| 106|陆军 |男 |1974-06-03 00:00:00|95031| 109|赵铁柱 |男 |1974-06-03 00:00:00|95031| 105|王芳 |女 |1975-02-10 00:00:00|95031| 102|匡明 |男 |1975-10-02 00:00:00|95031| 108|张全蛋 |男 |1975-10-02 00:00:00|95031| */
-- 首先将李军的性别作为条件取出来 select ssex from student where sname="李军"; /* ssex| ----+ 男 |*/ 根据性别查询 sname 和 ssex select sname, ssex from student where ssex =(select ssex from student where sname="李军"); /* sname|ssex| -----+----+ 曾华 |男 | 匡明 |男 | 李军 |男 | 陆军 |男 | 王尼玛 |男 | 张全蛋 |男 | 赵铁柱 |男 | 张飞 |男 |*/
-- 上面题把和李军同性别的找出来了,这里用上 and:并且 select sname, ssex from student where ssex =(select ssex from student where sname="李军") and class=(select class from student where sname="李军"); /*sname|ssex| -----+----+ 曾华 |男 | 李军 |男 | 王尼玛 |男 |*/
select * from student where ssex= "男"; /* sno|sname|ssex|sbirthday |class| ---+-----+----+-------------------+-----+ 101|曾华 |男 |1977-09-01 00:00:00|95033| 102|匡明 |男 |1975-10-02 00:00:00|95031| 104|李军 |男 |1977-02-20 00:00:00|95033| 106|陆军 |男 |1974-06-03 00:00:00|95031| 107|王尼玛 |男 |1976-02-20 00:00:00|95033| 108|张全蛋 |男 |1975-10-02 00:00:00|95031| 109|赵铁柱 |男 |1974-06-03 00:00:00|95031| 110|张飞 |男 |1974-06-03 00:00:00|95038|*/ select * from course where cname="计算机导论"; /*cno |cname|tno| -----+-----+---+ 3-105|计算机导论|825|*/ select * from score where cno=(select cno from course where cname="计算机导论") and sno in (select sno from student where ssex= "男");
Select * from teacher where tsex="男"; /* tno|tname|tsex|tbirthday |prof|depart| ---+-----+----+-------------------+----+------+ 804|李诚 |男 |1958-12-02 00:00:00|副教授 |计算机系 | 856|张旭 |男 |1969-03-12 00:00:00|讲师 |电子工程系 |*/ --只需要tno就行了,有两个需要用in select * from course where tno in (select tno from teacher where tsex="男"); /*cno |cname|tno| -----+-----+---+ 3-245|操作系统 |804| 6-166|数字电路 |856|*/
inner join 或者 join
left join 或者 left outer join
right join 或者 right outer join
full join 或者 full outer join
CREATE DATABASE testJoin; CREATE TABLE person ( id INT, name VARCHAR(20), cardId INT ); CREATE TABLE card ( id INT, name VARCHAR(20) ); INSERT INTO card VALUES (1, '饭卡'), (2, '建行卡'), (3, '农行卡'), (4, '工商卡'), (5, '邮政卡'); SELECT * FROM card; /* +------+-----------+ | id | name | +------+-----------+ | 1 | 饭卡 | | 2 | 建行卡 | | 3 | 农行卡 | | 4 | 工商卡 | | 5 | 邮政卡 | +------+-----------+*/ INSERT INTO person VALUES (1, '张三', 1), (2, '李四', 3), (3, '王五', 6); SELECT * FROM person; /* +------+--------+--------+ | id | name | cardId | +------+--------+--------+ | 1 | 张三 | 1 | | 2 | 李四 | 3 | | 3 | 王五 | 6 | +------+--------+--------+*/
-- inner join: 表示为内连接,将两张表拼接在一起。 -- on: 表示要执行某个条件。 select * from person inner join card on person.cardId= card.id; /* id|name|cardId|id|name| --+----+------+--+----+ 1|张三 | 1| 1|饭卡 | 2|李四 | 3| 3|农行卡|*/ -- 将 inner 关键字省略掉,结果也是一样的。 -- select * from person JOIN card on person.cardId = card.id;
完整显示左边的表 (person) ,右边的表如果符合条件就显示,不符合则补 NULL 。
-- left join 也叫做 left out join,用这两种方式的查询结果是一样的。 select * from person left join card on person.cardId=card.id; /* id|name|cardId|id|name| --+----+------+--+----+ 1|张三 | 1| 1|饭卡 | 2|李四 | 3| 3|农行卡 | 3|王五 | 6|NULL| NULL|*/
完整显示右边的表 ( card ) ,左边的表如果符合条件就显示,不符合则补 NULL 。
select * from person right join card on person.cardId = card.id; /* id|name|cardId|id|name| --+----+------+--+----+ 1|张三 | 1 | 1|饭卡 | 2|李四 | 3| 3|农行卡 | NULL|NULL|NULL| 2|建行卡 | NULL|NULL|NULL| 4|工商卡 | NULL|NULL|NULL| 5|邮政卡 |
-- MySQL 不支持full join这种语法的全外连接 -- MySQL全连接语法,使用 UNION 将两张表合并在一起。 select * from person left join card on person.cardId=card.id; union select * from person right join card on person.cardId = card.id; /* id|name|cardId|id|name| --+----+------+--+----+ 1|张三 | 1| 1|饭卡 | 2|李四 | 3| 3|农行卡 | 3|王五 | 6|NULL| NULL| NULL|NULL|NULL| 2|建行卡 | NULL|NULL|NULL| 4|工商卡 | NULL|NULL|NULL| 5|邮政卡 |*/
-- 创建视图 create view v1 as select * from course where cname="计算机导论";-- v1是视图的名字 -- 使用视图 select * from v1; /* cno |cname|tno| -----+-----+---+ 3-105|计算机导论|825|*/ -- 删除视图 drop view v1; -- 修改视图 -- 方法一 create or replace view v1 as 查询语句; -- 如果有视图修改视图,没有视图建一个视图 -- 方法二 alter view v1 as 查询语句;--
没讲以后所有时间再看
b站:https://www.bilibili.com/video/BV1Vt411z7wy?p=57