第一步,选中数据库
use 库名称、或者单选库(选中后会加粗表示)
第二部数据库基础查询,选择列
select *(全部)/某一列名称 from 表名 (前面是展示,后面是可附带操作)
(直接输入select 1,2.......会打印出一个单行列名称为1,2......内容也为1,2.....的表)
1.where 列属性判断(打印符合条件的,例如打印number=1的所有元素)
2.order by 列1名称(打印选择的列并且以列1排序)
ps:1.执行中使用快捷键会自动从上一个‘;’后开始执行,到下一个‘;’结束
2.在SQLyog中注释是##,依旧遵顼1原则
第三步,查询;内部查询
第三步,查询
一.select 某一列名称 from 表名
1.可以选多个列用‘,’隔开(如:select Phone,names form 表名;
2.列可以进行算术运算(如:select Phone,Phone -1000,Phone-20000 AS ‘new Phone’ form 表名;
例中:最终会打印三列,1.Phone列 ,2.Phone列(数值全部-1000),3.new Phone列(数值全部-20000,定义名称时空格需要用引号隔开,单双不论)
修改表数据也可以直接在表数据中双击修改,然后保存
3.使用distinct可以隐藏重复数据
二.where判断
1.select 某一列名称 from 表名 where 判断条件
例如:SELECT * FROM students WHERE StudentSex=‘男’;(字符串不分大小写)
运算符的使用:
>,<,=,<=,>=,!=(<>都是不等于)(日期比较格式:datatime>‘1999-10-28’;这是默认的表达形式)
AND,OR的使用:
多判断运算符:AND的优先级高于OR:例如:例如:SELECT * FROM students WHERE StudentSex=‘男’ OR datatime>‘1999-10-28’ AND Phone=1000;会优先算AND
in的使用:
SELECT * FROM students WHERE StudentName='郭靖' OR StudentName='李梅';会输出郭靖和李梅的内容
SELECT * FROM students WHERE StudentName='郭靖' OR '李梅';只会输出郭靖的内容,因为or输出Boolean判断
SELECT * FROM students WHERE StudentName (not) in('郭靖' ,'李梅');会输出郭靖和李梅的内容
betwween的使用:
SELECT * FROM students WHERE StudentID between 1000 and 2000;
like的使用:
例如:SELECT * FROM students WHERE StudentEmail LIKE 'g%';不区分大小写(即表示以g开头的内容,g后任意长度
其他组合:%g:以g结尾、
%g%:包含g、
_g:两个字符第二个字符为g、
g%:以g开头
regexp的使用
例如:SELECT * FROM students WHERE StudentEmail REGEXP 'g[uo]';(表示包含g并且之后是u或者o的内容
其他组合:^g:以g开头、
g$:以g结尾、
g :包含g、
g|e:包含g或e、
[abcd]g:包含g并且前面是abcd中其中一个、
[a-d]g:和上面一样
is (not) null的使用
例如:SELECT * FROM students WHERE StudentEmail IS NOT NULL;
order by的使用:
例如:SELECT * FROM students ORDER BY Phone DESC;(DESC表示降序)
2.SELECT * FROM students ORDER BY Phone DESC, StudentSex;(优先以Phone降序,同Phone里按StudentSex升序)
3.SELECT *,10 AS newOne FROM students ORDER BY 3, newOne;(优先以select选择的第三列降序,同级别按StudentSex升序);
limit的使用:
例如:SELECT * FROM students LIMIT 1,10;(第一个数1,为偏移量:即跳过第一个内容(0可以省略),第二个10为打印量:即输出10条内容(如果没有10条,有多少打印多少))
三.多表联动:
内连接和外连接
1.内连接:INNER(可以省略,默认不写) JOIN的用法:
SELECT s.Phone,s.StudentName FROM students s JOIN subject1 j ON s.StudentSex = j.`SubjectNo`;
(打印students表中的Phone和StudentName列中符合StudentSex内容与subject1表`SubjectNo`内容相同的;
(students s代表一种缩写,用s代替students
例如:
SELECT s.Phone,s.StudentName FROM students s JOIN mysql.subject1 j ON s.StudentSex = j.`SubjectNo`;
(打印students表中的Phone和StudentName列中符合StudentSex内容与mysql库subject1表`SubjectNo`内容相同的;
3.自连接
SELECT * FROM students s JOIN students t ;(交叉连接,案例中共三个学生,输出9个
SELECT t.teachers_ID,t.teacher_name,l.teachers_name AS leader FROM teachers l JOIN teachers t ON t.teacher_leader = l.teachers_ID;
(输出同一张表中老师姓名和领导姓名(领导姓名通过领导编号在表中查询)
四.多表连接
ps:多表连接尽量不要超过三张,所有的表连接都会一定程度上影响查询速度
SELECT s.Phone,s.StudentName,sex.char,
FROM students s
JOIN subject1 j
ON s.StudentSex = j.`SubjectNo`
JOIN sex
ON s.StudentSex = sexNumber;
五.符合连接条件
基于复合主键判断
SELECT s.Phone,s.StudentName,sex.char,
FROM students s
JOIN subject1 j
ON s.StudentSex = j.`SubjectNo`
AND s.StudentID =j.Grade;
六.隐式连接
不推荐,因为如果忘记where就会交叉连接
SELECT * FROM students s JOIN teathers t ON s.teacher = t.teachers_ID;
SELECT * FROM students s, teachers t WHERE s.teacher = t.teachers_ID;(这就是隐式连接
2.外连接OUTER(可省略) JOIN
2.外连接OUTER(可省略) JOIN
1.左连接(尽量使用),右连接,join两张表,join是交集,左连接是左边加交集(from后,右连接是右边加交集(join后)
例如:SELECT * FROM students s LEFT/RIGHT JOIN teathers t ON s.teacher = t.teachers_ID;
2.多表外连接
SELECT s.Phone,s.StudentName,sex.char,
FROM students s
LEFT JOIN subject1 j
ON s.StudentSex = j.`SubjectNo`
LEFT JOIN sex
ON s.StudentSex = sexNumber;
3.自外连接
SELECT t.teachers_ID,t.teacher_name,l.teachers_name AS leader FROM teachers l LEFT JOIN teachers t ON t.teacher_leader = l.teachers_ID;
4.USING使用:
多表联动时,条件判断如果列名称相同,可以使用
SELECT s.Phone,s.StudentName,sex.char,
FROM students s
JOIN subject1 j
ON s.StudentSex = j.StudentSex = USING(StudentSex) 如果是复合主键,只需要在列名称间加‘,’USING(StudentSex,names)
5.自然连接:
让库自己判断列名称相同的进行连接,结果不容易掌控
例如:SELECT t.teachers_ID,t.teacher_name FROM teachers l JOIN teachers t ;
6.交叉连接,
返回左边的每一条内容和右边表的所有内容的排序
例如:SELECT t.teachers_ID,t.teacher_name FROM teachers l teachers t ;
四:联合
UNION联合多个查询结果
例如:SELECT *,'主任' AS job FROM teachers t WHERE t>=10
UNION
SELECT *,'教师' AS job FROM teachers t WHERE t<10
多表联合:(注:需要列数相同,否则会报错,并且第一个查询的列名称会被保留;例中输出为names
例如:SELECT names FROM teachers t
UNION
SELECT newname FROM teacher1 t1