MySql基本语法及常见错误

创建表

CREATE TABLE `booksystem`.`Untitled`  (
  `id` int(0) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `price` decimal(10, 2) NOT NULL,
  `num` int(0) NOT NULL,
  `now_num` int(0) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX(`name`)
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci;

修改表

修改表名

alter table 旧表名 rename as 新表名
alter table teacher rename as teacher1

增加字段

alter table 表名 add 字段名称 属性 
alter table teacher add account int(8) not null default'0000000' comment'账号'

修改约束

alter table 表名 modify 字段名 属性

alter table teacher modify account varchar(10)

字段重命名

alter table 表名 change 旧字段名 新字段名 属性(可省略)

alter table teacher change account account1 int(10)

删除字段

alter table 表名 drop 字段名

alter table teacher drop account1

增加数据

添加数据

注意:数据和字段要一一匹配

insert into [数据库名.] 表名 [(字段1,字段2)] values ('数据1','数据2')

insert into grade(年级,姓名) values ('初二','小橙')
insert into grade values ('初一','李明')
INSERT INTO `school`.`grade`(`年级`, `姓名`) VALUES ('初一', '小红')

插入多个数据

INSERT INTO `school`.`grade`(`年级`, `姓名`) 

VALUES ('初一', '公主'),

 ('初一', '王子')

修改数据

更改单个数据

update [数据库名.]表名 set 字段=新数据[...] where 条件;

条件:等于,大于,小于,区间

update school.student set age=13 where id=4;

修改所有数据,不指定条件

删除数据

删除数据

delete from 表名 where 条件;

若没有条件,会删除所有数据

delete from student where id=4;

清空所有数据

truncate 表名

查询数据

查询所有信息

select * from 表名;
select * from student;

查询某个字段

select 字段[AS 新名字][,...] from 表名[AS 新表名];
select subjectname as 科目 from subject;

去重

select distinct  字段 from 表名;
select distinct  studentno from result;

where

image

联表查询(join)

right
left
inner
  • 题目

https://www.nowcoder.com/practice/55f3d94c3f4d47b69833b335867c06c1?tpId=199&tags=&title=&difficulty=0&judgeStatus=0&rp=0

  • 解析

https://blog.csdn.net/zhj_fly/article/details/71487799?utm_source=app&app_version=4.16.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

T1:

SELECT q.device_id,question_id,result 
FROM question_practice_detail q
JOIN user_profile u
ON q.device_id = u.device_id
WHERE university = '浙江大学';

T2:

select q.device_id,question_id,result
from question_practice_detail q,user_profile u
where university="浙江大学" and q.device_id=u.device_id

T3:



分页和排序

排序

order by 字段名 asc(升序)/desc(降序)

select s.studentno as `学号`,studentname as `姓名`,subjectname as `科目名称`,studentresult as `成绩`

from student as s

left join result as r

on s.studentno=r.studentno

left join subject as sub

on r.subjectno=sub.subjectno

order by studentresult asc;

分页

limit 第几条开始,显示几个;


select s.studentno as `学号`,studentname as `姓名`,subjectname as `科目名称`,studentresult as `成绩`

from student as s

left join result as r

on s.studentno=r.studentno

left join subject as sub

on r.subjectno=sub.subjectno

order by studentresult desc

limit 0,3;

先选择(where),在排序(order by)


函数

聚合函数

  • 聚合函数结果作为筛选条件时,不能用where,而是用having语法

统计数量

select COUNT(字段名) FROM 表名;--会忽略null
 * 是所有

其他

  • 求和
select sum (字段名) FROM 表名;
  • 平均
avg
  • 最高,最低
max/min

分组

select subjectname ,avg(studentresult),max(studentresult)

from result r

INNER JOIN subject sub

on r.subjectno=sub.subjectno

group by== r.subjectno

过滤

select subjectname ,avg(studentresult) as 平均分,max(studentresult)

from result r

INNER JOIN subject sub

on r.subjectno=sub.subjectno

group by r.subjectno

HAVING 平均分>70

like子句

我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。
WHERE 子句中可以使用等号 = 来设定获取数据的条件,如 “runoob_author = ‘RUNOOB.COM’”。
但是有时候我们需要获取 runoob_author 字段含有 “COM” 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。
如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以在 WHERE 子句中使用LIKE子句。
  • 你可以使用LIKE子句代替等号 =。
  • LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
  • 你可以使用 AND 或者 OR 指定一个或多个条件。
  • 你可以在 DELETE 或 UPDATE 命令中使用 WHERE…LIKE 子句来指定条件。

事务

/*关闭自动提交*/
SET autocommit = 0;
/*事务开启*/
START TRANSACTION;
/*事务*/
update account set money=money-20 where id=1;
select * from account;
update account set money=money+20 where id=2;
select * from account;
/*提交*/
commit;
/*回滚*/
rollback;
/*开启自动提交*/
set autocommit=1;

一些表达式

过滤空值的三种方法:

(1) Where 列名 is not null
(2) Where 列名 != 'null'
(3) Where 列名 <> 'null'
(4) Where not 列名=''

Where in 和 Not in

https://www.nowcoder.com/practice/0355033fc2244cdaa09b2bd6e794c762?tpId=199&tags=&title=&difficulty=0&judgeStatus=0&rp=0

# IN
select device_id ,gender, age, university, gpa
from user_profile
where university IN ("北京大学","复旦大学","山东大学");

# NOT IN
select device_id ,gender, age, university, gpa
from user_profile
where university NOT IN ("浙江大学");

count

https://www.nowcoder.com/practice/7d9a7b2d6b4241dbb5e5066d7549ca01?tpId=199&tags=&title=&difficulty=0&judgeStatus=0&rp=0

select count(gender) as male_num,avg(gpa)
from user_profile
where gender='male'

//avg并没有统计所有平均数

错误解决方案

1205 - Lock wait timeout exceeded; try restarting transaction

https://blog.csdn.net/u012248802/article/details/77866019?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162926990516780269816425%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162926990516780269816425&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-77866019.first_rank_v2_pc_rank_v29&utm_term=1205±+Lock+wait+timeout+exceeded%3B+try+restarting+transaction&spm=1018.2226.3001.4187

posted @ 2021-10-09 21:37  鱼七3255186114  阅读(168)  评论(0)    收藏  举报