mysql基础命令2

FDML: 数据操作语

insert(插入数据)

特殊字符要加引号,不然数据全为0 如时间:0000-00-00 00:00:00

#查看表结构
desc student;
#插入数据(多列)(少一列数指定都会报错)
insert into student values(1,'ss',33,'f','3333-4-5');
###插入数据(多列)(指定列)
insert student(name,age) values('zeng','84');

#插入多条数据(指定列)(不指定的话默认或null)
insert student(name,age) values('zeng','84'),('a','4'),('b','8');

#查看
select * from student;

#into可以省略
#前面指定的话,后面一定要加
#非空不自增的一定要指定
#sql_mode与表的严格程度有关
[root@db03 ~]# vim /etc/my.cnf
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

update命令

使用update语句,一定要加where

#查看数据
mysql> select * from student;
#修改数据(小心指定的值不是唯一 非空)
update student set age=18 where name='ss' and cometime='';
#修改指定数据(有主键就指定主键)
update student set age=18 where id=2;
#查看
mysql> select count(*) from student1;
mysql> select * from student;

delete 删除数据,不会删除表

#查看数据
select count(*) from student;
select * from student;
#删除数据(使用delete语句也一定要加where条件),最好不要批量删除表,要一个一个删除
delete from student where id=1;

#删除表(通过bin-log可以找回来)(可以通过where指定某一行)(不会删除索引)
delete from student (where 1=1);
#删除表(找不回来)(不会触发任何触发器)(不会删除表)
truncate (table) student;
#删除表(找不回来)
drop table student;

使用update代替delete

老玩家回归

1.添加状态字段status
alter table student add status enum('1','0') default 1;
2.使用update代替delete
#删除数据
delete from student where id=1;
#修改数据
update student set status='0' where id=1;
#查看表
select * from student;
desc student;

#status的值要加引号
status='0'

DQL: 数据查询语言

select

1.查询表中所有的数据
#查看数据总行数
select count(*) from student;
#该语句只适合数据量小的表,因为这些数据放到了内存查看
select * from student;
2.查看指定列的数据
查看表结构
desc student;
#查看指定列
select user,host from mysql.user;
3.按条件查询#where
select name,gender from student where id='1';

#select查看表的时候一定要先看一下数据的数量,防止沾满内存
#id='1',无论该字段在不在要查看的字段内,都可以where
#字段不用加引号,值要加引号
#SQL语句,数据库名 表名 字段名 数据名 是否支持大小写,要看字符集的校验规则
#select user,host select后面是要查看要显示的列

查询练习

#上传SQL文件
[root@db03 ~]# rz -E
rz waiting to receive.
[root@db03 ~]# ll
total 396
-rw-r--r-- 1 root root 397334 Jul 15 10:21 world.sql
#查看slq文件是否有drop
[root@db03 ~]# grep -ri drop world.sql 
DROP SCHEMA IF EXISTS world;
DROP TABLE IF EXISTS `city`;
DROP TABLE IF EXISTS `country`;
DROP TABLE IF EXISTS `countrylanguage`;
#删除drop语句

#导入
方法1
[root@db03 ~]# mysql -uroot -p123 < world.sql
方法2(有过程)(SQL语句)
mysql> source /root/world.sql
方法3
mysql> \. /root/word.sql

#连接
[root@db03 ~]# mysql -uroot -p123 
mysql> show databases;
mysql> use world
mysql> show tables;
#查看表结构(表头)
mysql> desc city;

#查看表行数
select count(*) from city;
+----------+
| count(*) |
+----------+
|     4079 |
+----------+
#查看表
select * from city;
| ID   | Name| CountryCode | District| Population |
select Name,Population from city;

#查看数据排序(order by)
升序
mysql> select Name,Population from city order by Population;
降序
mysql> select Name,Population from city order by Population desc;

#查看前十条数据(limit N)
mysql> select population from city order by population limit 10;
mysql> select Name,Population from city order by Population desc limit 10;
#按照步长查询数据,起始,步长(n+1--N)(#翻页)
select Name,Population from city order by xx desc limit 10,50;
select id,Name,Population from city order by xx desc limit 10,50;

#命令行查看(脚本使用)
mysql -uroot -p123 -e 'use world;select id,name from city limit 0,100'
mysql -uroot -p123 -e 'select * from world.city'

条件查询

#条件查询就是使用where语句
where可以使用的符号:(字段和数值之间的符号)
	#精确匹配
	=
	
	#范围匹配(int tinyint)
	!=
	>
	<
	>=
	<=
	
	#条件语句
	or
	and
	
	#模糊匹配,会导致数据的查询非常缓慢
	like 		
#2.查询中国的城市人口
mysql> select name,population from city where CountryCode='CHN';

#3.查询黑龙江人口数量
mysql> select name,population from city where countrycode='CHN' and District='heilongjiang';

#4.查询中国人口数量小于100000的城市
mysql> select name,population from city where countrycode='CHN' and population < 100000;

#5.模糊匹配(值:like %)(like速度慢)
#匹配以N结尾的数据
mysql> select name,countrycode from city where countrycode like '%N';
#匹配以N开头的数据
mysql> select name,countrycode from city where countrycode like 'N%';
#匹配包含N的数据
mysql> select name,countrycode from city where countrycode like '%N%';

#6.查询中国或美国的人口数量
#使用 ...or...
mysql> select name,population from city where countrycode = 'CHN' or countrycode = 'USA';
#使用in(...)
mysql> select name,population from city where countrycode in ('CHN','USA');
#使用(select ...union all ...select ...)(查询速度最快)
mysql> select name,population from city where countrycode = 'CHN' union all select name,population from city where countrycode = 'USA';

select高级用法

#多表联查,联表查询
	多表联查的意义就在于把不同表的列组合成一个表,显示出来,关键在于'联'(where),
	

1.传统连接,#联表,字段可以不同,指定列值必须相同

2.自连接,#自己查找相同字段,使用自连接两个表必须有相同字段和相同的值

3.内连接

4.外连接

传统连接

#建表
mysql> create table students(id int,name varchar(10));
mysql> create table score(id int,mark int);
#插入数据
mysql> insert into students values(1,'qiudao'),(2,'qiandao'),(3,'zengdao');
mysql> insert into score values(1,80),(2,90),(3,100);
#数据查询
mysql> select * from students;
mysql> select * from score;
------------------------------------ 2表联查
#查看邱导的分数
mysql> select students.name,score.mark from students,score where students.id=score.id and name='qiudao';
#查询所有学生成绩
mysql> select students.name,score.mark from students,score where students.id=score.id

练习题1

连2表查询:世界上小于100人的城市在哪个国家?请列出城市名字,国家名字与人口数量

#1.确认我要查哪些内容
国家名字  城市名字  城市人口数量   小于100人

#2.确认在哪个表
country.name   city.name   city.population   

#3.找出两个表相关联的字段
city.countrycode   country.code

#4.编写语句
desc xx;
mysql> select country.name,city.name,city.population from country,city where city.countrycode=country.code and city.population < 100;
+----------+-----------+------------+
| name     | name      | population |
+----------+-----------+------------+
| Pitcairn | Adamstown |         42 |
+----------+-----------+------------+

练习题2

连3表查询:世界上小于100人的城市在哪个国家,是用什么语言?请列出城市名字,国家名字与人口数量和国家语言

#1.确认我要查哪些内容
国家名字  城市名字  城市人口数量   国家使用的语言   小于100人

#2.确认在哪个表
country.name   city.name   city.population   countrylanguage.language

#3.找出三个表相关联的字段
country.code   city.countrycode   countrylanguage.countrycode

#4.写sql语句(and两两分开联)
desc xx;
mysql> select country.name,city.name,city.population,countrylanguage.language from country,city,countrylanguage where country.code=city.countrycode and city.countrycode=countrylanguage.countrycode and city.population < 100;
+----------+-----------+------------+-------------+
| name     | name      | population | language    |
+----------+-----------+------------+-------------+
| Pitcairn | Adamstown |         42 | Pitcairnese |
+----------+-----------+------------+-------------+

#多联表查询
1.要看哪些表,哪些列
2.找出关联字段
select 表1.列,表2.列,表3.列... from 表1,表2,表3... where 表1.列a=表2.列b and 表2.列b=表3.列c... and 表xx.列xx < 100;

#city.population 或者population 可以指定表,也可以不指定(默认是当前表)

自连接(natural join)

自连接会自己查找相同字段

适用于2表联查

#两个关联的表必须有相同字段和相同数据
mysql> select city.name,city.countrycode,countrylanguage.language,city.population from city natural join countrylanguage where population < 100 order by population;

#两个表中 指定的字段和数据列 必须相同 (缺一不可)
mysql> select country.name,city.name,city.population from city natural join country where population < 100;
这两个表中虽然都有Name列,但是数值不一样,所以#SQL语句错误,但是不报错
#查看列
mysql> desc city;
| Name
mysql> desc country;
| Name
#查看值
select * from city limit 10;
select * from city limit 10;


#注意:
1.自连接必须有相同字段和相同值(指定列相同)
2.小表命中大表(selec count(*))
3.NATURAL JOIN 自连接
4.可以自连接就可以传统连接

mysql> select 表1.列1,表2.列2... from 表1 natural join 表2 where 列x < 100;

内连接

关联数据相同即可

适用于2表联查,3表联查

#注意:命中率(驱动的概念),小表在join前
	表1 小表
	表2 大表

#2表联查
#小于100人的城市在哪个国家,国家代码是什么?
select city.name,city.population,city.countrycode,country.name 
from city join country on city.countrycode=country.code 
where city.population < 100;

#3表联查
#世界上小于100人的城市在哪个国家?是用什么语言?
select country.name,city.name,city.population,countrylanguage.language
from city join country on city.countrycode=country.code 
join countrylanguage on country.code=countrylanguage.countrycode
where city.population < 100;

select 表1.列1,表2.列2... from 表1 join 表2 on 表1.a=表2.b... where 表x.列x < 100;

外连接

外连接基于内连接,使用了......left (right) join ...... on...

外连接可以做脱敏

and不能替换为where

#左外连接
select city.name,city.countrycode,country.name
from city left join country on city.countrycode=country.code and city.population < 100;
+------------------------------------+-------------+----------+
| name                               | countrycode | name     |
+------------------------------------+-------------+----------+
| Kabul                              | AFG         | NULL     |

#右外连接
select city.name,city.countrycode,country.name,city.population
from city right join country on city.countrycode=country.code and city.population < 100;
+-----------+-------------+----------------------------------------------+
| name      | countrycode | name                                         |
+-----------+-------------+----------------------------------------------+
| NULL      | NULL        | Aruba                                        |

你可能感兴趣的:(mysql基础命令2)